【问题标题】:Shape of tensor for 2D image in KerasKeras中二维图像的张量形状
【发布时间】:2018-02-19 02:28:30
【问题描述】:

我是 Keras 的新手(不知何故是 TF),但我发现输入层的形状定义非常混乱。

所以在示例中,当我们有一个长度为 20 的一维向量作为输入时,形状被定义为

...Input(shape=(20,)...)

当需要为MNIST定义灰度图像的二维张量时,定义为:

...Input(shape=(28, 28, 1)...)

所以我的问题是为什么张量没有定义为(20)(28, 28)?为什么在第一种情况下添加第二个维度并留空?其次,必须定义通道数?

我知道这取决于层,因此 Conv1D、Dense 或 Conv2D 采用不同的形状,但第一个参数似乎是隐含的?

根据docs,密集需要(batch_size, ..., input_dim),但这与示例有什么关系:

Dense(32, input_shape=(784,))

谢谢

【问题讨论】:

  • 除了我的回答之外,我还建议您直接使用函数式 API 模型。序列模型只是构建复杂模型的限制,当人们习惯了序列模型后,他们往往会在无法使用的情况下尝试继续使用它。

标签: tensorflow keras keras-layer


【解决方案1】:

元组与数字

input_shape 必须是一个元组,所以只有(20,) 可以满足。数字 20 不是一个元组。 -- 有参数input_dim,让你的生活更轻松,如果你只有一个维度。这个参数可以取20。 (但实际上,我发现它只是令人困惑,我总是使用 input_shape 并使用元组,以保持一致的理解)。

Dense(32, input_shape=(784,))Dense(32, input_dim=784) 相同。

图片

图像不仅有像素,它们还有通道(红、绿、蓝)。
黑白图像只有一个通道。

所以,(28pixels, 28pixels, 1channel)

但请注意,任何地方的图像都没有义务遵循这种形状。您可以按照自己喜欢的方式塑造它们。但是有些层确实需要一定的形状,否则就无法工作。

某些层需要特定的形状

这是二维卷积层的情况,需要(size1,size2,channels)。他们需要这种形状,因为他们必须相应地应用卷积滤波器。

循环层也是如此,需要(timeSteps,featuresPerStep) 来执行它们的循环计算。

MNIST 模型

同样,没有任何义务以特定方式塑造您的形象。你必须根据你选择的第一层和你打算实现的目标来做。这是免费的东西。

许多示例根本不关心图像是 2d 结构的事物,它们只使用 784 像素的模型。够了。它们可能从Dense 层开始,需要(size,) 之类的形状

其他示例可能会关心并使用形状(28,28),但随后这些模型将不得不重新调整输入以适应下一层的需求。

2D 卷积层需要(28,28,1)

主要思想是:输入数组必须匹配input_shapeinput_dim

张量形状

不过,在阅读 Keras 错误消息或使用自定义/lambda 层时要小心。

我们之前定义的所有这些形状都省略了一个重要的维度:批量大小样本数

在内部,所有张量都将这个附加维度作为第一维度。 Keras 会将其报告为None(适用于您拥有的任何批量大小的维度)。

因此,input_shape=(784,) 将被报告为 (None,784)
input_shape=(28,28,1) 会报成(None,28,28,1)

并且您的实际输入数据的形状必须与报告的形状相匹配。

【讨论】:

  • 谢谢。这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2019-10-12
相关资源
最近更新 更多