我正在尝试使用预先训练的图像网权重对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。
答案 0 :(得分:1)
初始网络在224x224大小的图像上进行训练,其下采样路径下降到10x10以下。因此,对于32,32,3个图像,下采样导致负尺寸大小。现在你可以做多件事了。首先,您可以将cifar10数据集中的每个图像调整为224x224,并将此张量传递到初始模型中。您可以删除网络的一些下采样过滤器。然后它仍然可以工作。第三,你可以做零填充来增加图像大小而不改变分辨率。
答案 1 :(得分:1)
在此图层的documentation中,可能会发现输入的最小形状为(150, 150, 3)
(tf
暗淡排序)。你的输入要小得多。这个最小尺寸来自多个pooling
和valid
边框模式,这使得每个图层的输出更小 - 如果它小于特定尺寸 - 则既不能执行合并也不能执行卷积。
答案 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(.......)
'