我正在尝试使用负采样,仅使用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)
答案 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)
])