首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试使用自己的数据集(稍微修改一下)使神经网络用于人脸识别。

尝试使用自己的数据集(稍微修改一下)使神经网络用于人脸识别。
EN

Stack Overflow用户
提问于 2016-04-11 18:42:10
回答 1查看 654关注 0票数 1

我正在做一个基本的千层面例子:https://github.com/Lasagne/Lasagne/blob/master/examples/mnist.py

我把它和另一个类似的例子结合起来稍微修改了一下。

我试图运行CNN模型,在这里,我增加了一些额外的投入,CNN的发展,但它不应该有任何不同。还将示例中输入层的默认值28更改为60 (用于高度和宽度),在代码后面将使用类,但代码“挂起”在最后一条网络行上,这意味着代码仍在运行,但什么也没有发生。运行代码时输出。在主循环中将input_var定义为这样:

代码语言:javascript
运行
复制
input_var = T.tensor4('input_var')

其余代码:

代码语言:javascript
运行
复制
def build_cnn(classes, height, width, input_var=None):

    print("Input layer, with height: {}, width: {} and input var: {}".format(height, width, input_var))

    network = lasagne.layers.InputLayer(shape = (None, 1, height, width),
                                    input_var=input_var)


    print("Convolutional layer with 32 kernels of size 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。检索这些代码的代码是:

代码语言:javascript
运行
复制
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是:

代码语言:javascript
运行
复制
 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 error ({0]): {1}".format(errno, strerror)
                except:
                    print "unexpected error:", sys.exc_info()[0]
                    raise
            c = c + 1
    return [X, y, folder_names]

main中运行的代码:

代码语言:javascript
运行
复制
def main(model='mlp', num_epochs=100):
    # Load the dataset

    print("Loading data...")
    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("Building model and compiling functions...")
    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的原始问题):

代码语言:javascript
运行
复制
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)

   #Code gets stuck on this point, running forever, doing nothing.
   #No error messages received either.
    network = lasagne.layers.DenseLayer(
        network,
        num_units = neurons,
        nonlinearity = lasagne.nonlinearities.rectify,
        W = lasagne.init.GlorotUniform())

编辑2:在与此进行了一段时间的斗争之后,我发现在read_images1()中进行的图像大小调整导致了问题:

代码语言:javascript
运行
复制
 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)
                    #This part caused the problems. 
                    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 error ({0]): {1}".format(errno, strerror)
                except:
                    print "unexpected error:", sys.exc_info()[0]
                    raise
            c = c + 1
    return [X, y, folder_names]

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

代码语言:javascript
运行
复制
 def read_images1(path, sz = None, na = False):
    """

    :param path: sti til mappe med underliggende mapper tilhørende personer.
    :param sz: Størrelse på bildefilene
    :return: returnerer liste av bilder, labels og navn
    """
    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 error ({0]): {1}".format(errno, strerror)
                except:
                    print "unexpected error:", sys.exc_info()[0]
                    raise
            c = c + 1
    return [X, y, folder_names] 

如果我使用sz = None和na = True运行程序,那么它就能工作。如果给出sz参数的任何大小,代码就会被卡住,试图再次编译神经网络。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-15 19:15:34

好吧,我想我可以在这里看到一些问题,不知道你遇到的是哪一个.

  1. read_images1()中,X是numpy数组的python列表。它在哪里被转换成一个numpy数组?尝试添加X = numpy.asarray(X)。你也需要重塑它到(n_images,n_channels,宽度,高度),在那里,我假设n_channels=1的灰度。该网络期望4D输入,而不是3D。
  2. 这个代码list_of_labels = list(xrange(max(label) + 1)); classes = len(list_of_labels)假设标签是从0到N的序列号,是吗?
  3. 您的build_mlp(classes, height, width, input_var=None)与最初的示例build_mlp(input_var=None)非常不同。最初的例子显然有效,所以任何错误都与差异有关。最大的区别之一是,您一直将变量赋值给相同的变量,比如这个network = lasagne.layers.DenseLayer(network, ...),其中原始的每个层l_hid1 = lasagne.layers.DenseLayer(l_in_drop, ...)都有不同的变量。
  4. 另外,如果它在build_mlp()期间挂起,那么问题显然不在于如何读取图像。尝试在图像中使用原始版本的build_mlp()。试着自己运行它。跳过图像读取,只需使用常量参数调用build_mlp()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36556704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档