Преобразование кода из TFLearn для работы в Keras

Я использую некоторый код, написанный в TFLearn, в качестве эталона и пытаюсь переписать его с помощью Keras. Я довольно новичок в обоих пакетах, и я не уверен, правильно ли я это написал.

Я пробовал свой код - и он работает - но я не получаю ожидаемого результата (точность не улучшается за 20+ эпох), и мне интересно, не допустил ли я где-то ошибку.

Что касается моих данных, у меня есть каталог «данные», в котором есть каталоги «поезд» и «проверка». Внутри каждого из них есть 3 каталога для каждого из моих 3 классов изображений.

Оригинальный код TFLearn:

import numpy as np
import tflearn
from tflearn.layers.conv import conv_2d, max_pool_2d
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.estimator import regression

def createModel(nbClasses,imageSize):

    convnet = input_data(shape=[None, imageSize, imageSize, 1], name='input')

    convnet = conv_2d(convnet, 64, 2, activation='elu', weights_init="Xavier")
    convnet = max_pool_2d(convnet, 2)

    convnet = conv_2d(convnet, 128, 2, activation='elu', weights_init="Xavier")
    convnet = max_pool_2d(convnet, 2)

    convnet = conv_2d(convnet, 256, 2, activation='elu', weights_init="Xavier")
    convnet = max_pool_2d(convnet, 2)

    convnet = conv_2d(convnet, 512, 2, activation='elu', weights_init="Xavier")
    convnet = max_pool_2d(convnet, 2)

    convnet = fully_connected(convnet, 1024, activation='elu')
    convnet = dropout(convnet, 0.5)

    convnet = fully_connected(convnet, nbClasses, activation='softmax')
    convnet = regression(convnet, optimizer='rmsprop', loss='categorical_crossentropy')

    model = tflearn.DNN(convnet)
return model

Мой код с использованием Keras:

from keras import backend as K
from keras.layers.core import Flatten, Dense, Dropout, Activation
from keras.optimizers import rmsprop
from keras.models import Sequential
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.layers import Conv2D, MaxPooling2D, ZeroPadding2D
import numpy as np

num_classes = 3
image_size = 256
nb_epoch = 80
batch_size = 32
nb_train_samples = 7994
nb_validation_samples = 2000

if K.image_data_format() == 'channels_first':
    input_shape = (3, image_size, image_size)
else:
    input_shape = (image_size, image_size, 3)

model = Sequential()

model.add(ZeroPadding2D((1,1), input_shape=input_shape))

model.add(Conv2D(64, 2, activation='elu', kernel_initializer='glorot_normal'))
model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(128, 2, activation='elu', kernel_initializer='glorot_normal'))
model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(256, 2, activation='elu', kernel_initializer='glorot_normal'))
model.add(MaxPooling2D((2, 2)))

model.add(Conv2D(512, 2, activation='elu', kernel_initializer='glorot_normal'))
model.add(MaxPooling2D((2, 2)))

model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('elu'))
model.add(Dropout(0.5))

model.add(Dense(num_classes))
model.add(Activation('softmax'))
opt = rmsprop()
model.compile(loss='categorical_crossentropy',
         optimizer = opt,
         metrics = ['accuracy'])

train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
train_datagen = ImageDataGenerator(rescale= 1./255)
validation_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(image_size, image_size),
    batch_size=batch_size,
    class_mode='categorical'
    )

validation_generator = validation_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(image_size, image_size),
    batch_size=batch_size,
    class_mode='categorical'
    )



model.fit_generator(train_generator,
                steps_per_epoch=(nb_train_samples // batch_size),
                epochs=nb_epoch,
                validation_data=validation_generator,
                validation_steps=(nb_validation_samples // batch_size)
               )

model.save_weights('first_try.h5')

person Matt    schedule 14.06.2017    source источник
comment
Как вы группируете свои данные и как тренируетесь? Не могли бы вы добавить свой код для этого?   -  person petezurich    schedule 14.06.2017
comment
Просто добавил остальную часть моего кода   -  person Matt    schedule 14.06.2017
comment
Я попробовал ваш код с тремя классами набора данных MNIST и отлично тренировался. Точность увеличивается в течение первых эпох, как и ожидалось. По крайней мере, для MNIST я мог бы тренироваться намного быстрее, используя только первые два слоя Conv и плотный слой 64. В зависимости от ваших данных я предлагаю вам попробовать более простую модель (т.е. 2 слоя Conv), проверить, обучается ли модель и затем улучшить оттуда.   -  person petezurich    schedule 14.06.2017
comment
Спасибо за проверку моего кода. Я использую этот код для классификации между 3 музыкальными жанрами, используя спектрограммы 256x256, но точность всегда составляет около 0,33 (не лучше, чем случайная). Код TFlearn взят с сайта github.com/despoisj/DeepAudioClassification, который попытался реализовать аналогичный проект, по-видимому, успешно. Я не уверен, почему я не могу воспроизвести то же самое   -  person Matt    schedule 15.06.2017
comment
ОБНОВЛЕНИЕ: я сделал, как вы предложили, и вернул его всего к 2 слоям conv, и val_acc неуклонно рос с начальных 0,3571 до 0,6417 после 8 эпох. Ценю вашу помощь   -  person Matt    schedule 15.06.2017


Ответы (1)


Я попробовал ваш код с тремя классами набора данных MNIST и отлично тренировался. Точность увеличивается в течение первых эпох, как и ожидалось.

По крайней мере, для MNIST я мог бы тренироваться намного быстрее, используя только первые два слоя Conv и плотный слой 64. В зависимости от ваших данных я предлагаю вам попробовать более простую модель (т.е. 2 слоя Conv), проверить, обучается ли модель и затем улучшить оттуда.

person petezurich    schedule 15.06.2017