使用 Keras 的 VGG 16,我正在尝试运行一个三类分类问题,代码如下:
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
from keras.optimizers import SGD
from keras import backend as K
K.set_image_dim_ordering('tf')
img_width, img_height = 48, 48
top_model_weights_path = 'vgg16_1.h5'
train_data_dir = 'data6/train'
validation_data_dir = 'data6/validation'
nb_train_samples = 400
nb_validation_samples = 100
epochs = 10
batch_size = 32
def save_bottlebeck_features():
datagen = ImageDataGenerator(rescale=1. / 255)
model = applications.VGG16(include_top=False, weights='imagenet', input_shape=(48, 48, 3))
generator = datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
shuffle=False)
bottleneck_features_train = model.predict_generator(
generator, nb_train_samples // batch_size)
np.save(open('bottleneck_features_train', 'wb'),bottleneck_features_train)
generator = datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
shuffle=False)
bottleneck_features_validation = model.predict_generator(
generator, nb_validation_samples // batch_size)
np.save(open('bottleneck_features_validation', 'wb'),bottleneck_features_validation)
def train_top_model():
train_data = np.load(open('bottleneck_features_train', 'rb'))
train_labels = np.array(([0]*(nb_train_samples // 3) + [1]*(nb_train_samples // 3) +
[2]*(nb_train_samples // 3)))
validation_data = np.load(open('bottleneck_features_validation', 'rb'))
validation_labels = np.array([0]*(nb_validation_samples // 3) + [1]*(nb_validation_samples // 3) +
[2]*(nb_validation_samples // 3))
model = Sequential()
model.add(Flatten(input_shape=train_data.shape[1:]))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))
sgd = SGD(lr=1e-2, decay=0.00371, momentum=0.9, nesterov=False)
model.compile(optimizer=sgd,
loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(train_data, train_labels,
epochs=epochs,
batch_size=batch_size,
validation_data=(validation_data, validation_labels))
model.save_weights(top_model_weights_path)
save_bottlebeck_features()
train_top_model()
运行代码,我收到错误:
检查目标时出错:预期dense_20具有形状(无,3(,但得到带形状的数组 (1200, 1(
请让我知道我必须对代码进行哪些更改才能使其正常运行。我正在使用Anaconda和Python 3.5.2,运行在Windows机器上。
您的训练输出的形状类似于 (None, 1( --- 或 (1200, 1(,其中有 1200 个样本,所有样本只有一个维度(每个样本都是一个数字(
但是您的模型以 Dense(3)
结尾,这将输出类似 (None, 3( 的内容。即:每个样本有 3 个数字。
如果您认为训练数据正确,则必须调整模型。
建议再添加一个Dense(1)
图层。如果结果介于 0 和 1 之间,则使用"sigmoid"激活,如果结果介于 -1 和 1 之间,则使用"tanh"。
始终使用model.summary()
来检查模型具有的维度。