带有可变输入大小的tensorflow转换网的Keras

时间:2019-06-11 14:30:39

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

我将python 3与anaconda结合使用,并将keras与tensorflow结合使用,我的目标是创建一个具有可变输入大小的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:“平面”输入的形状未完全定义   (获得(无,无,1)。请确保传递完整的“ input_shape”或   模型中第一层的参数“ batch_input_shape”。

似乎问题出在Flatten层的输入形状上,当我删除它时就可以了。

如何使它在可变大小下正常播放?

谢谢

3 个答案:

答案 0 :(得分:0)

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

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

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

下面是根据 Allen 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.

答案 1 :(得分:-1)

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

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

答案 2 :(得分:-1)

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