Я пытаюсь сделать перевод обучения в Керасе.Я установил сеть ResNet50, которая не может быть обучена с некоторыми дополнительными слоями:
# Image input
model = Sequential()
model.add(ResNet50(include_top=False, pooling='avg')) # output is 2048
model.add(Dropout(0.05))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.15))
model.add(Dense(512, activation='relu'))
model.add(Dense(7, activation='softmax'))
model.layers[0].trainable = False
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
Затем я создаю входные данные: x_batch
, используя функцию ResNet50 preprocess_input
вместе с одной меткой горячего кодирования y_batch
и выполните подгонку следующим образом:
model.fit(x_batch,
y_batch,
epochs=nb_epochs,
batch_size=64,
shuffle=True,
validation_split=0.2,
callbacks=[lrate])
Точность обучения приближается к 100% после десяти или около того эпох, но точность валидации фактически снижается примерно с 50% до 30% при неуклонно возрастающих потерях валидации.
Однако, если я вместо этого создам сеть только с последними слоями:
# Vector input
model2 = Sequential()
model2.add(Dropout(0.05, input_shape=(2048,)))
model2.add(Dense(512, activation='relu'))
model2.add(Dropout(0.15))
model2.add(Dense(512, activation='relu'))
model2.add(Dense(7, activation='softmax'))
model2.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model2.summary()
и включу вывод прогноза ResNet50:
resnet = ResNet50(include_top=False, pooling='avg')
x_batch = resnet.predict(x_batch)
Тогда точность проверки возрастетпримерно до 85% ... Что происходит?Почему не работает метод ввода изображения?
Обновление:
Эта проблема действительно странная.Если я поменяю ResNet50 на VGG19, он, кажется, будет работать нормально.