我想知道是否有可能如何为可变长度的图像添加类似于展平的图层。
假设我们的 CNN 有一个输入层:
input_shape=(1, None, None)
执行典型的一系列卷积/最大池化层后,我们可以创建一个扁平层,其形状为:
output_shape=(None,...)
如果没有的话,有人能解释一下为什么吗?
最佳答案
您可以添加 GlobalMaxPooling2D
和 GlobalAveragePooling2D
。
这将消除空间维度并仅保留 channel 维度。 Max
将取最大值,Average
将取平均值。
我真的不知道为什么你不能使用Flatten
层,但事实上你不能使用可变尺寸。
我明白为什么Dense
不起作用:它有数量可变的参数,这对于反向传播、权重更新和类似的事情是完全不可行的。 (PS:密集层仅作用于最后一个维度,因此这是唯一需要修复的)。
示例:
- 密集层需要固定最后一个维度
- Conv 层可以具有可变的空间维度,但需要固定的 channel (否则参数数量会发生变化)
- 循环层可以具有可变的时间步长,但需要固定的特征等
另外,请注意:
- 对于分类模型,您需要固定维度的输出,那么,如何展平并仍然保证每个维度中元素的正确数量?不可能。
- 对于具有可变输出的模型,为什么要在模型中间有一个固定尺寸?
如果您要完全自定义,则始终可以在 Lambda
层内使用 K.reshape()
并处理张量形状:
import keras.backend as K
def myReshape(x):
shape = K.shape(x)
batchSize = shape[:1]
newShape = K.variable([-1],dtype='int32')
newShape = K.concatenate([batchSize,newShape])
return K.reshape(x,newShape)
The layer: Lambda(myReshape)
关于python - 如何为卷积神经网络的可变输入大小添加扁平层(或类似层),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49285317/