Я пытаюсь создать сверточный автоэнкодер с кератами для классификации выражений, но точность застревает после 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 изображений, но все тот же случай)