python - 如何为卷积神经网络的可变输入大小添加扁平层(或类似层)

标签 python tensorflow keras

我想知道是否有可能如何为可变长度的图像添加类似于展平的图层。

假设我们的 CNN 有一个输入层:

input_shape=(1, None, None)

执行典型的一系列卷积/最大池化层后,我们可以创建一个扁平层,其形状为:

output_shape=(None,...)

如果没有的话,有人能解释一下为什么吗?

最佳答案

您可以添加 GlobalMaxPooling2DGlobalAveragePooling2D

这将消除空间维度并仅保留 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/

相关文章:

python - Tensorflow 对象检测 API : output boxes for probability less than 50%

python - Tensorflow:多项尝试中结果的概率

keras - keras 模型输出形状中的方括号

python - supervisord 事件监听器

python - 使用 Zeep 向 SOAP 服务发送原始 XML 请求(尝试复制参数)

python - 值的长度与索引的长度不匹配

python - 如何修复 "ResourceExhaustedError: OOM when allocating tensor"

python - 没有名为 livelossplot 的模块

tensorflow - TensorFlow inception 和 mobilenet 有什么区别

python - 检查模型输入 : expected conv1d_1_input to have shape (None, 44​​1, 216) 时出错,但得到形状为 (1, 441, 216) 的数组