import keras.layers as KL
input_image = KL.Input([None, None, 3], name = 'input_image')
x = KL.Conv2D(64, (3,3), padding='same')(input_image)
在Conv之后,我想添加密集如下:
KL.Dense(2)(KL.Flatten()(x))
但会有一个错误:
ValueError:“Flatten”输入的形状未完全定义(got(None,None,64) . 确保将完整的“input_shape”或“batch_input_shape”参数传递给模型中的第一层 .
因此,如果我想要一个包含conv的模型,然后是密集的,可以接受任何大小的输入,我该怎么办?
3 回答
虽然它与展平您的输入不同,但您可以使用Global Max Pooling:
这会将您的维度从
(None, None, None 64)
更改为(None, 64)
(包括批量维度) . 全局最大池化是关闭网络网络并将输出馈送到密集神经网络的常用方法 .要构建CNN模型,您应该使用池化层然后展平它,如下面的示例所示 .
在卷积网络中 The pooling layer will reduce the number of data to be analysed ,然后我们 use Flatten to have the data as a "normal" input to a Dense layer . 而且, after a convolutional layer, we always add a pooling one.
以下示例适用于 1D CNN ,但结构与2D相同 . 同样,Flatten()更改输出的形状以在最后一个Dense图层中正确使用 .
神经网络不适用于可变大小的输入 . 除非你正在处理递归神经网络 .
对于具有可变大小输入的网络,网络的权重会是什么样的?
通常,您将为输入图层选择一个大小,然后调整大小或填充输入以匹配该大小 .