2016-04-11 2 views
1

я делаю основной пример лазания: https://github.com/Lasagne/Lasagne/blob/master/examples/mnist.pyПопытки использовать собственный набор данных на лазание базового примера (слегка модифицированный), чтобы сделать нейронную сеть для распознавания лица

который я модифицированный немного, комбинируя его с другим аналогичным пример.

Я пытаюсь запустить модель CNN, где я добавил дополнительный ввод для определения CNN, но это не должно быть иначе. Также изменилось значение по умолчанию 28 для входного слоя в примере до 60 (для высоты и ширины), классы используются позже в коде, но код «зависает» на последней последней строке сети, то есть код все еще работает, но ничего не происходит. Output when running the code. input_var определяется как таковой в основной цикл:

input_var = T.tensor4('input_var') 

Остальная часть кода:

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')) 

EDIT: Хорошо, основываясь на том, что я пытался до сих пор, кажется, быть моим собственным набором данных, который является проблемой. Я изменил свой набор данных, чтобы соответствовать набору данных MNIST, где для ex. 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 error ({0]): {1}".format(errno, strerror) 
       except: 
        print "unexpected error:", sys.exc_info()[0] 
        raise 
      c = c + 1 
    return [X, y, folder_names] 

Код в главной который RAN:

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) 

if 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) 

    #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()) 

EDIT 2: Afters борется с этим на некоторое время я узнал, что изображение изменение размера сделано в 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) 
        #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() к этому:

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 и на = True, то он работает. Если какой-либо размер задан параметру sz, код застревает, пытаясь снова скомпилировать нейронную сеть.

+0

Можете ли вы разместить свой полный код где-нибудь? Я думаю, вы разместили здесь все измененные фрагменты, но немного сложно следовать. –

+0

[link] (http://pastebin.com/iGke965B) Не включал остальное, что происходит после того, как сеть была построена, так как она застряла. – Laende

ответ

0

Хорошо, я думаю, что я могу видеть несколько вопросов здесь, не знаю, какой из них вы работаете в ...

  1. В read_images1(), X представляет собой список питон Numpy массивов. Где он преобразуется в один массив numpy? Попробуйте добавить X = numpy.asarray(X). Вы также должны изменить его на (n_images, n_channels, width, height), где я предполагаю 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

1. Изменено read_images1(): http://pastebin.com/dRUe7EmT 2. Распечатка list_of_labels и классов: list_of_labels: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] классы: 16 , что является правильным. 3. Я знаю, что все по-другому, но с использованием набора данных MNIST, который работает безупречно, что означает, что сама сеть не проблема. 4. Проблема заключается в том, как мой набор данных «настроен» в отношении типа и, вероятно, как построена матрица 4D. С изменением на read_image1() он по-прежнему не создает сеть, останавливаясь на первом уровне после слоя ввода. – Laende

+0

Также печатается X_train и y_train для MNIST и моего набора данных: http://bildr.no/image/ME00RFpt.jpeg – Laende

+0

Я заметил, что y_train, y_test для моего набора данных имеет двойные пробелы, что является результатом от использования test_train_split. Не уверен, что есть что сказать. Также напечатано 1 изображение из каждого набора данных: http://pastebin.com/AUZTGiF7 – Laende