ValueError: Форма ввода для «Flatten» не полностью определена.При попытке реализовать модель керас - PullRequest
0 голосов
/ 13 февраля 2019

У меня возникла следующая ошибка при попытке реализовать модель keras:

"ValueError: форма ввода для" Flatten "не полностью определена (получено (None, None, 512)Убедитесь, что передали полный аргумент "input_shape" или "batch_input_shape" первому слою вашей модели. "

В чем здесь может быть проблема?

from keras import applications
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense

weights_path = '../keras/examples/vgg16_weights.h5'
top_model_weights_path = 'fc_model.h5'
img_width, img_height = 240, 320

train_data_dir = 'datasetmini/train'
validation_data_dir = 'datasetmini/VALIDATION'
nb_train_samples = nb_train_samples
nb_validation_samples = nb_validation_samples
epochs = epochs
batch_size = batch_size

model = applications.VGG16(weights='imagenet', include_top=False)
print('Model loaded.')

top_model = Sequential()
top_model.add(Flatten(input_shape=model.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(1, activation='sigmoid'))
top_model.load_weights(top_model_weights_path)


model.add(top_model)

for layer in model.layers[:25]:
    layer.trainable = False


model.compile(loss='binary_crossentropy',
              optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
              metrics=['accuracy'])

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_height, img_width),
    batch_size=batch_size,
    class_mode='binary')

model.fit_generator(
    train_generator,
    samples_per_epoch=nb_train_samples,
    epochs=epochs,
    validation_data=validation_generator,
    nb_val_samples=nb_validation_samples)

1 Ответ

0 голосов
/ 13 февраля 2019

Согласно Невозможно выполнить точную настройку модели Keras vgg16 - проблема с формой ввода .Оказывается, нужно указать input_shape при загрузке предварительно обученной модели керас.

А также keras.engine.training.Model не может add новых слоев, поэтому необходимо построить новую модель keras.engine.sequential.Sequential и затем использовать add.

A MWE:

from keras import applications
from keras import Sequential
from keras.layers import Flatten, Dense, Dropout
from keras import optimizers
import numpy as np

img_width, img_height = 240, 320
model = applications.VGG16(include_top=False, weights=None, input_shape=(img_width, img_height, 3))
print('Model loaded.')

top_model = Sequential()
top_model.add(Flatten())
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(1, activation='sigmoid'))
#top_model.load_weights(top_model_weights_path)

##this will fail
##AttributeError: 'Model' object has no attribute 'add'
#model.add(top_model)

new_model = Sequential()
new_model.add(model)
new_model.add(top_model)

for layer in new_model.layers[:25]:
    layer.trainable = False

new_model.compile(loss='binary_crossentropy',
              optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
              metrics=['accuracy'])

batch_size = 8
X = np.random.randn(batch_size,240,320,3)
Y = np.random.randn(batch_size, 1)

new_model.train_on_batch(X, Y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...