Исключительная тренировка Resnet50: «Форма ввода в« Flatten »не полностью определена» - PullRequest
0 голосов
/ 05 июня 2018

Я хочу использовать keras.applications.resnet50 для обучения Resnet для решения проблемы двух классов, используя следующую настройку:

from keras.layers import Dropout, Flatten, Dense
from keras.applications.resnet50 import ResNet50
from keras.models import Model

resNet = ResNet50(include_top=False, weights=None)
y = resNet.output
y = Flatten()(y)
y = Dense(2, activation='softmax')(y)
model = Model(inputs=resNet.input, outputs=y)
opt = keras.optimizers.Adam()
model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
epochs = 15
model.fit(train_tensors, train_targets, 
          validation_data=(valid_tensors, valid_targets),
          epochs=epochs, batch_size=10, callbacks=[checkpointer], verbose=1)

Запуск кода приводит к ошибке

Exception: The shape of the input to "Flatten" is not fully defined 

Так чтоДолжно быть что-то не так с входным тензором для выходного слоя, который в моем случае является закодированным вектором с одной горячей точкой, то есть одномерным массивом размера 2. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы получаете

Исключение: форма входа в "Flatten" не полностью определена

, потому что вы не установили форму входа в сети реснет,Попробуйте:

resNet = ResNet50(include_top=False, weights=None, input_shape=(224, 224, 3)) 

Кроме того, поскольку вы используете двоичный_кросентропий с сигмовидной активацией в выходном слое, вы должны использовать только 1 нейрон, а не 2, например:

y = Dense(1, activation='sigmoid')(y)
0 голосов
/ 05 июня 2018

Поскольку вы не применяете пул (средн. Или макс.) к выходу вашей модели Resnet, вывод, который она предоставляет, представляет собой четырехмерный тензор, передаваемый на ваш плотный слой.Рекомендуется применять пул перед плотным слоем, который извлечет avg или max каждого объекта из предыдущего слоя и затем перейдет на плотный слой.Другой вариант - если вы не хотите применять пул, тогда вы можете просто применить слой Flatten () к выходу Resnet, который также преобразует 4-D тензор в 2-D тензор, как и ожидалось.вашим плотным слоем.

...