首页 > 解决方案 > Keras CNN 问题

问题描述

我正在尝试编写一个连体网络,使用负采样,代码只有 20 个示例(包括正和负)每个示例包括 2 个图像(x1,x2)和一个指示图像是否相同的输出

image1           image1        1
image1           image2        0

为此,我有兴趣获得最后一层,即 Keras 中的 Dense() 层,分别为 X1 和 X2。

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)
          ])

有人可以帮我解决这个错误吗?

谢谢萨钦

标签: pythonkeras

解决方案


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

看看如何做到这一点:

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)
          ])

推荐阅读