Keras |让Inception v3示例运行

时间:2016-06-05 12:22:59

标签: python keras

我正在尝试学习一些Keras语法并使用Inception v3 example

进行游戏

我有一个4级多类分类玩具问题所以我改变了以下几行:

NB_CLASS = 4  # number of classes
DIM_ORDERING = 'tf'  # 'th' (channels, width, height) or 'tf' (width, height, channels)

我的玩具数据集具有以下尺寸:

  • 包含所有图像的数组的大小:(595,299,299,3)
  • 包含训练图像的阵列的大小:(416,299,299,3)
  • 包含训练标签的阵列的大小:(179,4)
  • 包含测试图像的阵列的大小:(179,299,299,3)
  • 包含测试标签的数组的大小:(179,4)

然后我尝试使用以下代码训练模型:

# 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程序员?

2 个答案:

答案 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