如何在keras中将cifar10输入inceptionv3

时间:2017-03-01 02:15:10

标签: python deep-learning keras

我正在尝试使用预先训练的图像网权重对CIFAR10图像进行分类。我使用以下代码。

from keras.applications.inception_v3 import InceptionV3

(xtrain, ytrain), (xtest, ytest) = cifar10.load_data()

input_cifar = Input(shape=(32, 32, 3))

base_model = InceptionV3(weights='imagenet', 
                         include_top=False, 
                         input_tensor=input_cifar)

但是它给了我一个错误,比如“负面维度”和#39;在中间转换层。

使用VGG16网络时不会发生这种情况。

我正在使用带有tensorflow后端的keras和tf dim ordernig。

3 个答案:

答案 0 :(得分:1)

初始网络在224x224大小的图像上进行训练,其下采样路径下降到10x10以下。因此,对于32,32,3个图像,下采样导致负尺寸大小。现在你可以做多件事了。首先,您可以将cifar10数据集中的每个图像调整为224x224,并将此张量传递到初始模型中。您可以删除网络的一些下采样过滤器。然后它仍然可以工作。第三,你可以做零填充来增加图像大小而不改变分辨率。

答案 1 :(得分:1)

在此图层的documentation中,可能会发现输入的最小形状为(150, 150, 3)tf暗淡排序)。你的输入要小得多。这个最小尺寸来自多个poolingvalid边框模式,这使得每个图层的输出更小 - 如果它小于特定尺寸 - 则既不能执行合并也不能执行卷积。

答案 2 :(得分:0)

您需要将原始图像从 CIFAR10 (32, 32, 3) 上采样到至少 75, 75。

base_model2 = InceptionV3(include_top=False, weights='imagenet', input_shape=(128, 128, 3)) # shape of images after upsampling that inception will accept

for layer in base_model.layers: 
   layer.trainable = False

#input are original (32, 32, 3) images
inputs = tf.keras.layers.Input(shape=(32, 32, 3))
#upsampling twice (ie. 32*2*2 = 128) big enough for inception
upsamp1 = tf.keras.layers.UpSampling2D((2,2))(inputs)
upsamp2 = tf.keras.layers.UpSampling2D((2,2))(upsamp1)
pre_trained_model = base_model2(upsamp2)
dense4 = tf.keras.layers.Dense(128, activation='relu'). 
    (pre_trained_model)
predictions = tf.keras.layers.Dense(10, activation='softmax')(dense4)

model = Model(inputs = inputs, outputs = predictions)
model.compile(optimizer=Adam(learning_rate=0.01), loss='categorical_crossentropy', metrics=['accuracy']) 
model.fit(.......)

'