Keras CNN问题

时间:2020-02-14 07:13:27

标签: python keras

我正在尝试使用负采样,仅使用20个示例(包括正负)的代码编写一个暹罗网络。 每个示例都包括2张图像(x1,x2)和一个输出,指示这些图像是否相同

image1           image1        1
image1           image2        0

为此,我感兴趣的只是获取最后一层,即X1和X2分别位于Keras中的Dense()层。

X1的形状为20、28、28、1,X2的形状为20、28、28、1 两者的类型均为numpy.ndarray

但是当我应用CNN模型时,会出现以下错误。

“ TypeError:添加的图层必须是Layer类的实例。找到的(28,28,1)

请参阅下面的python代码

model = Sequential([(Image1[0].shape),
            Conv2D(16,kernel_size=(3,3),strides=[1,1],padding='same',kernel_initializer=keras.initializers.glorot_uniform(),name='conv1'),
            Activation('relu'),
            MaxPool2D(pool_size=(2, 2)),
            Conv2D(32,kernel_size=(3,3),strides=[2,2],padding='same',kernel_initializer=keras.initializers.glorot_uniform(),name='conv2'),
            Activation('relu'),
            Conv2D(64,kernel_size=(3,3),strides=[2,2],padding='same',kernel_initializer=keras.initializers.glorot_uniform(),name='conv3'),
            Activation('relu'),
            MaxPool2D(pool_size=(2, 2)),
            Flatten(),
            Dense(20)
          ])

有人可以帮助我解决此错误吗?

谢谢 萨钦(Sachin)

1 个答案:

答案 0 :(得分:0)

第一个模型层应指定要馈送的图像的形状。在您的情况下,您要将图像形状添加为图层。

看看如何做:

IM_WIDTH = 128
IM_HEIGHT = 128

model = Sequential(
Conv2D(16, input_size=(IM_HEIGHT, IM_WIDTH, 3), kernel_size=(3,3),strides=[1,1],padding='same',kernel_initializer=keras.initializers.glorot_uniform(),name='conv1'),
            Activation('relu'),
            MaxPool2D(pool_size=(2, 2)),
            Conv2D(32,kernel_size=(3,3),strides=[2,2],padding='same',kernel_initializer=keras.initializers.glorot_uniform(),name='conv2'),
            Activation('relu'),
            Conv2D(64,kernel_size=(3,3),strides=[2,2],padding='same',kernel_initializer=keras.initializers.glorot_uniform(),name='conv3'),
            Activation('relu'),
            MaxPool2D(pool_size=(2, 2)),
            Flatten(),
            Dense(20)
          ])