尝试在Lasagne基础示例上使用自己的数据集进行人脸识别神经网络的构建

我正在进行Lasagne的基础示例:https://github.com/Lasagne/Lasagne/blob/master/examples/mnist.py

我对其稍作修改,将其与另一个类似的示例结合。

我试图运行CNN模型,我在CNN定义中添加了一些额外的输入,但这应该不会有任何不同。我还将示例中输入层默认值28改为60(用于高度和宽度),类别会在代码后面使用,但代码在最后一个网络行“挂起”,这意味着代码仍在运行,但没有任何事情发生。运行代码时的输出。 在主循环中,input_var定义如下:

input_var = T.tensor4('input_var')

其余代码如下:

def build_cnn(classes, height, width, input_var=None):    print("输入层,高度:{},宽度:{},输入变量:{}".format(height, width, input_var))    network = lasagne.layers.InputLayer(shape = (None, 1, height, width),                                    input_var=input_var)    print("卷积层,32个5x5大小的内核")    network = lasagne.layers.Conv2DLayer(network,                                         num_filters = 32,                                         filter_size = (5, 5),                                         nonlinearity = lasagne.nonlinearities.rectify,                                         W = lasagne.init.HeNormal(gain = 'relu')) 

编辑:根据我目前尝试的情况,似乎是我的数据集出了问题。我已经调整了我的数据集以匹配MNIST数据集,例如X_train的形状为[图像数,通道数,高度,宽度]。其中通道数为1,高度和宽度为60。获取这些数据的代码如下:

def load_images():    dataset_path = os.path.abspath("C:/Users/laende/Dropbox/Skole UiS/4. semester/Master/Master/data/test_database")    [bilder, label, names] = read_images1(dataset_path, (28, 28))    label = np.array(label)    bilder = bilder / np.float32(256)    bilder = bilder[:, newaxis, :, :]    X_train1, X_test1, Y_train1, Y_test1 = train_test_split(bilder, label, test_size = 0.2)    list_of_labels = list(xrange(max(label) + 1))    classes = len(list_of_labels)    return X_train1, X_test1, Y_train1, Y_test1, classes

其中read_images1函数如下:

 def read_images1(path, sz = None, channel = None):    c = 0    X = []    y = []    folder_names = []    for dirname, dirnames, filenames, in os.walk(path):        for subdirname in dirnames:            subject_path = os.path.join(dirname, subdirname)            folder_names.append(subdirname)            for filename in os.listdir(subject_path):                try:                    im = cv2.imread(os.path.join(subject_path, filename),     cv2.IMREAD_GRAYSCALE)                    if (sz is not None):                        im = cv2.resize(im, sz)                    X.append(np.asarray(im, dtype = np.uint8))                    y.append(c)                except IOError, (errno, strerror):                    print "I/O错误({0]): {1}".format(errno, strerror)                except:                    print "意外错误:", sys.exc_info()[0]                    raise            c = c + 1    return [X, y, folder_names]

在主函数中运行的代码如下:

def main(model='mlp', num_epochs=100):    # 加载数据集    print("正在加载数据...")    mnist = 1    if mnist == 1:        classes = 10        X_train, y_train, X_val, y_val, X_test, y_test = load_dataset()        dataset = {            'train': {'X': X_train, 'y': y_train},            'test': {'X': X_test, 'y': y_test}}        shape = dataset['train']['X'][0].shape    else:        X_train, X_test, y_train, y_test, classes = load_images()        dataset = {            'train': {'X': X_train, 'y': y_train},            'test': {'X': X_test, 'y': y_test}}        shape = dataset['train']['X'][0].shape    input_var = T.tensor4('inputs')    target_var = T.ivector('targets')    print("构建模型并编译函数...")    if model == 'mlp':        network = build_mlp(height=int(shape[1]),                            width=int(shape[2]),                            channel=int(shape[0]),                            classes=int(classes),                            input_var=input_var)

如果在主函数中mnist = 1,代码运行正常,如果我尝试使用自己的数据集,它会在build_mlp中卡住(与最初的CNN问题类似):

def build_mlp(classes, channel, height, width, input_var=None):    neurons = int(height * width)    network = lasagne.layers.InputLayer(shape = (None, channel, height, width),                                 input_var=input_var)    network = lasagne.layers.DropoutLayer(network, p = 0.2)   #代码在此点卡住,永远运行,不做任何事情。   #也没有收到任何错误消息。    network = lasagne.layers.DenseLayer(        network,        num_units = neurons,        nonlinearity = lasagne.nonlinearities.rectify,        W = lasagne.init.GlorotUniform())

编辑2:经过一段时间的挣扎,我发现read_images1()中的图像调整大小操作引起了问题:

 def read_images1(path, sz = None, channel = None):    c = 0    X = []    y = []    folder_names = []    for dirname, dirnames, filenames, in os.walk(path):        for subdirname in dirnames:            subject_path = os.path.join(dirname, subdirname)            folder_names.append(subdirname)            for filename in os.listdir(subject_path):                try:                    im = cv2.imread(os.path.join(subject_path, filename),     cv2.IMREAD_GRAYSCALE)                    #这一部分引起了问题。                     if (sz is not None):                        im = cv2.resize(im, sz)                    X.append(np.asarray(im, dtype = np.uint8))                    y.append(c)                except IOError, (errno, strerror):                    print "I/O错误({0]): {1}".format(errno, strerror)                except:                    print "意外错误:", sys.exc_info()[0]                    raise            c = c + 1    return [X, y, folder_names]

如果我不传递任何调整大小参数并使用文件夹中的默认图像大小,神经网络就能编译。有人知道为什么吗?我更新了read_images1()如下:

 def read_images1(path, sz = None, na = False):    """    :param path: 到包含人员子文件夹的文件夹的路径。    :param sz: 图像文件的大小    :return: 返回图像列表、标签和名称    """    c = 0    X = []    y = []    folder_names = []    for dirname, dirnames, filenames, in os.walk(path):        for subdirname in dirnames:            subject_path = os.path.join(dirname, subdirname)            folder_names.append(subdirname)            for filename in os.listdir(subject_path):                try:                    im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE)                    if (sz is not None):                        im = cv2.resize(im, dsize=sz, interpolation = cv2.INTER_LANCZOS4)                    if (na == True):                        im = im[newaxis, :, :]                    X.append(np.asarray(im, dtype = np.uint8))                    y.append(c)                except IOError, (errno, strerror):                    print "I/O错误({0]): {1}".format(errno, strerror)                except:                    print "意外错误:", sys.exc_info()[0]                    raise            c = c + 1    return [X, y, folder_names] 

如果我运行程序时设置sz = None且na = True,那么它就能工作。如果给sz参数传递任何大小,代码在尝试编译神经网络时再次卡住。


回答:

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注