我正在尝试学习一些Keras语法并使用Inception v3 example
进行游戏我有一个4级多类分类玩具问题所以我改变了以下几行:
NB_CLASS = 4 # number of classes
DIM_ORDERING = 'tf' # 'th' (channels, width, height) or 'tf' (width, height, channels)
我的玩具数据集具有以下尺寸:
然后我尝试使用以下代码训练模型:
# fit the model on the batches generated by datagen.flow()
# https://github.com/fchollet/keras/issues/1627
# http://keras.io/models/sequential/#sequential-model-methods
checkpointer = ModelCheckpoint(filepath="/tmp/weights.hdf5", verbose=1, save_best_only=True)
model.fit_generator(datagen.flow(X_train, Y_train,
batch_size=32),
nb_epoch=10,
samples_per_epoch=32,
class_weight=None, #classWeights,
verbose=2,
validation_data=(X_test, Y_test),
callbacks=[checkpointer])
然后我收到以下错误:
Exception: The model expects 2 input arrays, but only received one array. Found: array with shape (179, 4)`
这可能与此有关,因为Inception希望拥有auxiliary classifiers (Szegedy et al., 2014):
model = Model(input=img_input, output=[preds, aux_preds])
如何在Keras中将两个标签赋予模型,而不是高级Python程序员?
答案 0 :(得分:1)
我建议您先使用this tutorial进行尝试。可以找到代码here。
您将在第一部分中看到,它显示了如何使用以下命令从目录加载数据:
sns.heatmap(df.T, annot=False, linewidths=.5, cmap="Blues_r", linecolor='b')# Blues cmap has been inverted by appending '_r'
为了输入不同的类,你必须将你的图像放在每个类的一个文件夹中(注意,通过传递标签可能有另一种方法)。另请注意,在您的情况下, class_mode 无法使用'二进制' (我认为您应该使用'分类&# 39; ):
.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
然后你可以使用已经在Keras中的inceptionv3模型:
`"binary"`: binary targets (if there are only two classes),
`"categorical"`: categorical targets,
另请注意,您只有很少的示例来训练InceptionV3 ,因为此模型非常大(请检查here大小)。在这种情况下你可以做的是转移学习,在InceptionV3上使用预先训练的权重。请参阅使用预训练网络的瓶颈功能:the tutorial中的一分钟内准确度达到90%。
答案 1 :(得分:1)
错误消息与validation_data
参数有关:当您使用model.fit_generator
时,验证数据也应通过ImageDataGenerator
对象传递(就像您已经在进行培训一样)数据)。它与缺少辅助分类器无关 - 来自原始论文的Keras does not implement the auxiliary classifier中的Inception v3模型(这是尝试转移学习而不是全面训练的另一个原因)。
使用生成器更新代码以提供验证数据:
datagen = ImageDataGenerator()
model.fit_generator(datagen.flow(X_train, Y_train, batch_size=32),
nb_epoch=10,
steps_per_epoch=len(X_train) / 32,
class_weight=None,
verbose=2,
validation_data=datagen.flow(X_test, Y_test, batch_size=32),
validation_steps=len(X_test) / 32,
callbacks=[checkpointer])
请注意,我已将参数samples_per_epoch
更新为较新的steps_per_epoch
。