具有Tensorflow后端的Keras中的尺寸不匹配错误

时间:2017-05-02 20:10:44

标签: tensorflow keras dimension mismatch

我通过从训练有素的网络开始微调VGG16模型的最后一个卷积块和顶级分类器,然后使用非常小的权重更新在新数据集上重新训练它。我实例化了VGG16的卷积基数并加载了它的权重,在顶部添加了先前定义的完全连接模型,并加载了它的权重并将VGG16模型的层冻结到最后一个卷积块。这是代码:

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

# path to the model weights files.
weights_path = '../keras/examples/vgg16_weights.h5'
top_model_weights_path = 'modelvgg16.h5'
# dimensions of our images.
img_width, img_height = 32, 32

train_data_dir = 'data7/train'
validation_data_dir = 'data7/validation'
nb_train_samples = 1600
nb_validation_samples = 400
epochs = 100
batch_size = 16

# build the VGG16 network
model = applications.VGG16(weights='imagenet', include_top=False, input_shape=(224,224,3))
print('Model loaded.')

# build a classifier model to put on top of the convolutional model
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'))

# note that it is necessary to start with a fully-trained
# classifier, including the top classifier,
# in order to successfully do fine-tuning
top_model.load_weights(top_model_weights_path)

# add the model on top of the convolutional base
model.add(top_model)

# set the first 25 layers (up to the last conv block)
# to non-trainable (weights will not be updated)
for layer in model.layers[:15]:
    layer.trainable = False

# compile the model with a SGD/momentum optimizer
# and a very slow learning rate.
model.compile(loss='binary_crossentropy',
              optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
              metrics=['accuracy'])

# prepare data augmentation configuration
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')

# fine-tune the model
model.fit_generator(
    train_generator,
    samples_per_epoch=nb_train_samples,
    epochs=epochs,
    validation_data=validation_generator,
    nb_val_samples=nb_validation_samples)

在执行脚本时,我得到: ValueError:两个形状中的尺寸O必须相等,但对于' Assign_26'是25088和512。 (op:' Assign')输入形状:[25088,256],[512,256]。 该指令弹出错误: top_model.load_weights(top_model_weights_path)

请帮助修改代码。提前致谢。

0 个答案:

没有答案