【问题标题】:Keras with tensorflow Conv net with variable input size具有可变输入大小的 tensorflow Conv 网络的 Keras
【发布时间】:2019-10-26 00:20:58
【问题描述】:

我正在使用带有 anaconda 的 python 3,以及带有 over tensorflow 的 keras,我的目标是创建一个具有可变输入大小的 Conv 层的网络

我找到here使用这个代码

i = Input((None, None, 1))
o = Conv2D(1, 3, 3)(i)
model = Model(i, o)
model.compile('sgd', 'mse')

我已经用它用这段代码创建了我自己的模型(我需要一个扁平层)

model = Sequential()
I = Input((None, None, 1))
c = Conv2D(filters=1, kernel_size=(1, 1))(I)
f = Flatten()(c)
o = Dense(10, activation="softmax")(f)
m = Model(I, o)
m.compile(loss=categorical_crossentropy, optimizer=SGD(), metrics=["accuracy"])

我一直收到这个错误

ValueError:“Flatten”的输入形状未完全定义 (得到(无,无,1)。确保传递完整的“输入形状”或 模型中第一层的“batch_input_shape”参数。

似乎问题在于 Flatten 层的输入形状,当我将其删除时,它很好。

我怎样才能让它与可变大小一起玩?

谢谢

【问题讨论】:

  • 你不能。因为您添加了一个 Dense 层,并且 Dense 层的输入的形状应该是已知且恒定的。当您删除 Flatten 时它会起作用,因为 Dense 层假定最后一个维度作为其输入形状,而其他维度作为批处理形状,所以在这种情况下 Dense i> 层输入形状为 (1),批次形状为 (None, None, None)

标签: python tensorflow keras deep-learning conv-neural-network


【解决方案1】:

Dense 需要固定大小的输入/输出,因为它的权重变量的数量必须是固定的。

您的情况有两种解决方案。

  1. 使用 GAP(全局平均池化)而不是 Flatten。 GAP 的输出大小是前一层的通道数。因此,它的大小在您的情况下是固定的。
  2. 使用没有密集层的全卷积网络。在这种情况下,网络的输出是二维的,而不是一维的。所以y的大小应该是那个大小。

以下内容是应艾伦 M 的要求而添加的。
这是一个代码示例:

# The original number of Conv filters are one.
# But I set it 16 to depict how GAP works.
# And B/H/W means BatchSize/Height/Width.

#1. using GAP
I = Input((None, None, 1)) # output shape=(B, H(None), W(None), 1)
c = Conv2D(filters=16, kernel_size=(1, 1))(I)  # output shape=(B, H, W, 16)
f = GlobalAveragePooling2D()(c) # output shape=(B, 16) <- space data(H/W) are aggregated by average
o = Dense(10, activation="softmax")(f) # output shape = (B, 10)
m = Model(I, o)

#2. all conv
I = Input((None, None, 1)) # output shape=(B, H, W, 1)
c = Conv2D(filters=16, kernel_size=(1, 1))(I) # output shape=(B, H, W, 16)
o = Conv2D(filters=10, kernel_size=(1, 1), activation="softmax")(c)
    # output shape=(B, H, W, 10)
m = Model(I, o)
# The output size of all conv is H * W * 10, where 10 is the number of classes.
# so the shape of y should be (B, H, W, 1) or (B, H, W) or (B, H, W, 10).
# That is pixel-wise classification or semantic segmentation.

【讨论】:

  • 请编辑您的问题以包含问题的代码示例以及您建议的一项或两项更正。
【解决方案2】:

Flatten 方法不将输入大小作为参数。

model = Sequential()
I = Input((None, None, 1))
c = Conv2D(filters=1, kernel_size=(1, 1))(I)
f = Flatten()
o = Dense(10, activation="softmax")(I)
m = Model(I, o)
m.compile(loss="categorical_crossentropy", optimizer=SGD(), metrics=["accuracy"])

这应该可以解决您的问题。

【讨论】:

  • 你没有将 Flatten() 层连接到任何东西,你只是将它从模型中移除。
  • 这并没有解决问题......仍然得到同样的错误。顺便说一句,您更改了模型的整个结构,将输入连接到了 conv 层和 softmax 层
【解决方案3】:

我认为问题是由于您的变量 input_sizes。它在这里说,如果您使用的是全连接层,则不能改变 input_sizes。见:How to train images, when they have different size ?

【讨论】:

  • 我知道处理可变尺寸图像的常规方法并尝试做其他事情,将在没有 FC 层的情况下尝试
  • 试过去掉FC层,还是一样的问题,就是Flatten层的问题。当我移除 Flatten 层并仍然使用 FC 层时,当我在 FC 层之前添加全局平均拉动时,它运行良好。
猜你喜欢
  • 1970-01-01
  • 2018-02-28
  • 2017-05-10
  • 2017-03-24
  • 2017-04-28
  • 2018-10-24
  • 2016-10-03
  • 1970-01-01
  • 2019-10-12
相关资源
最近更新 更多