当前位置: 首页 > 知识库问答 >
问题:

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

洪鸿
2023-03-14

我将python 3用于anaconda,将keras用于over tensorflow,我的目标是创建一个具有可变输入大小的Conv层的网络

我在这里找到了使用此代码的

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:“展平”输入的形状没有完全定义(get(None,None,1)。确保将完整的“input\u shape”或“batch\u input\u shape”参数传递给模型中的第一层。

看起来问题是扁平层的输入形状,当我移除它时,它就好了。

如何才能让它在可变尺寸下发挥出色?

谢谢

共有3个答案

容阳焱
2023-03-14

我认为问题是由于您的input\U大小可变。这里说,如果您使用的是完全连接的层,就不能改变input\u大小。请参见:当图像大小不同时,如何训练图像?

乜昆
2023-03-14

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

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

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

邹山
2023-03-14

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

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

  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.
 类似资料:
  • 我有一个很像tensorflow语音命令演示的模型,只是它需要一个大小可变的1D数组作为输入。现在,我发现很难使用tflite\u convert将此模型转换为tflite,因为tflite\u convert需要输入形状。 据说tf lite需要固定大小的输入以提高效率,您可以在推理过程中调整输入大小,作为模型的一部分。然而,我认为这将涉及截断我不想要的输入。有什么方法可以让TF lite发挥作

  • 在CS231n关于卷积神经网络的课程中,在ConvNet中注: > INPUT[32x32x3]将保存图像的原始像素值,在这种情况下是宽32、高32和具有三个颜色通道R、G、B的图像。 CONV层将计算连接到输入中局部区域的神经元的输出,每个神经元在其权重和输入卷中连接到的小区域之间计算一个点积。如果我们决定使用12个过滤器,这可能会导致体积,例如[32x32x12]。 从文档中,我了解到INPU

  • 问题内容: 我是Tensorflow的新手,所以我不明白为什么输入占位符经常根据用于训练的批次大小来确定尺寸。 在此示例中,我在此处以及在Mnist官方教程中找到了 那么确定尺寸并创建模型输入并对其进行训练的最佳和正确方法是什么? 问题答案: 您在此处指定模型输入。您希望将批处理大小保留为,这意味着您可以使用可变数量的输入(一个或多个)来运行模型。批处理对于有效使用您的计算资源很重要。 下一条重要

  • 我一直在从头开始创建卷积神经网络,对于如何对待隐藏卷积层的内核大小有点困惑。例如,假设我有一个图像作为并将其通过以下层。 卷积层,kernel_size=(5,5)并具有32个输出通道 吞吐量的新维度=(32,28,28) null 由于最初的输入是二维图像,我不知道如何对隐藏层进行卷积,因为现在的输入是三维的。

  • 问题内容: 我正在尝试将固定大小的数组转换为可变大小的数组(切片): 但是编译器抛出错误: 我应该如何转换? 问题答案: 使用让您在阵列上切片。另请参阅此博客文章,以获取有关数组和切片的更多信息。

  • 这个问题相当抽象,不一定与tensorflow或keras有关。假设您想要训练一个语言模型,并且您想要为您的LSTM使用不同大小的输入。我特别关注这篇论文:https://www.researchgate.net/publication/317379370_A_Neural_Language_Model_for_Query_Auto-Completion. 除其他外,作者使用单词嵌入和一种热字符编