首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有tensorflow Conv网的Keras

带有tensorflow Conv网的Keras
EN

Stack Overflow用户
提问于 2019-06-11 14:30:39
回答 3查看 330关注 0票数 3

我使用python 3和anaconda,使用keras和,我的目标是创建一个具有可变输入大小的Conv层的网络。

我发现这里使用这段代码

代码语言:javascript
运行
复制
i = Input((None, None, 1))
o = Conv2D(1, 3, 3)(i)
model = Model(i, o)
model.compile('sgd', 'mse')

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

代码语言:javascript
运行
复制
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:“平坦”输入的形状没有完全定义(got (无,无,1) )。确保将完整的"input_shape“或"batch_input_shape”参数传递给模型的第一层。

似乎问题是输入形状的扁平层,当我删除它,它是好的。

我怎样才能使它更好地发挥与可变的大小?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2021-02-27 01:44:31

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

在你的案例中有两种解决方案。

  1. 使用GAP(全球平均池)而不是扁平。GAP的输出大小是前一层的通道数。所以,它的大小在你的情况下是固定的。
  2. 使用不具有稠密层的全卷积网。在这种情况下,网络的输出是二维的,而不是一维的。所以y的大小应该是这个大小。

下面是为艾伦M的请求添加。

下面是一个代码示例:

代码语言:javascript
运行
复制
# 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.
票数 0
EN

Stack Overflow用户

发布于 2019-06-11 14:49:53

平坦方法不以输入大小作为参数。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2019-06-11 19:58:32

我认为问题是由于你的变量input_sizes。这里说,如果您使用的是完全连接的层,则不能更改input_sizes。请参阅:如何训练图像,当它们有不同的大小?

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56546049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档