Точность автоэнкодера не улучшается при использовании керас - PullRequest
0 голосов
/ 12 мая 2019

Я пытаюсь создать сверточный автоэнкодер с кератами для классификации выражений, но точность застревает после 2-3 эпох при 0,10 (максимум 10%) во время тренировки. Это из-за проблемы в коде или из-за моего небольшого набора данных (~ 70 изображений на класс)? (редактировать: я также пробовал классификацию по полу, для которой у меня есть около 450 изображений, но все тот же случай)

это мой код для модели:

def getModel(size):
input_img = Input(shape=(80, 80, 1))
x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)



# at this point the representation is (4, 4, 8) i.e. 128-dimensional

x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu', padding = 'same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_img, decoded)
opt = SGD(lr = 0.01, decay=1e-6, momentum=0.9, nesterov=True)
autoencoder.compile(optimizer=opt, loss='binary_crossentropy', metrics=['acc'])
#print(autoencoder.summary())
return autoencoder

` Я пробовал разное количество фильтров в каждом слое и 2-3 разных оптимизатора

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

для обучения одного класса, модель в некоторой степени повышает точность, но затем останавливается (с очень низкой точностью). Вот журнал:

Epoch 1/50 - 1s - loss: 0.6966 - acc: 0.0197 - val_loss: 0.6941 - val_acc: 0.0263 Epoch 2/50 - 1s - loss: 0.6942 - acc: 0.0368 - val_loss: 0.6915 - val_acc: 0.0513 Epoch 3/50 - 1s - loss: 0.6915 - acc: 0.0774 - val_loss: 0.6894 - val_acc: 0.0568 Epoch 4/50 - 1s - loss: 0.6892 - acc: 0.0897 - val_loss: 0.6873 - val_acc: 0.0586 Epoch 5/50 - 1s - loss: 0.6869 - acc: 0.0944 - val_loss: 0.6850 - val_acc: 0.0588 Epoch 6/50 - 1s - loss: 0.6844 - acc: 0.0947 - val_loss: 0.6824 - val_acc: 0.0588 Epoch 7/50 - 1s - loss: 0.6817 - acc: 0.0947 - val_loss: 0.6795 - val_acc: 0.0588 Epoch 8/50 - 1s - loss: 0.6787 - acc: 0.0947 - val_loss: 0.6765 - val_acc: 0.0588 Epoch 9/50 - 1s - loss: 0.6755 - acc: 0.0947 - val_loss: 0.6733 - val_acc: 0.0588 Epoch 10/50 - 1s - loss: 0.6721 - acc: 0.0947 - val_loss: 0.6700 - val_acc: 0.0588 Epoch 11/50 - 1s - loss: 0.6686 - acc: 0.0947 - val_loss: 0.6667 - val_acc: 0.0588 Epoch 12/50 - 1s - loss: 0.6650 - acc: 0.0947 - val_loss: 0.6633 - val_acc: 0.0588

Есть ли проблема с моим кодом или каким-либо другим способом, которым я должен попытаться решить мою проблему? Если нет, то это может быть связано с набором данных, поскольку у меня есть только около 70 изображений для каждого выражения. (редактировать: я также пробовал гендерную классификацию, для которой у меня есть около 450 изображений, но все тот же случай)

...