Keras 中二维图像的张量形状
Shape of tensor for 2D image in Keras
我是 Keras 的新手(不知何故是 TF 的新手),但我发现输入层的形状定义非常混乱。
所以在示例中,当我们有一个长度为 20 的一维向量作为输入时,形状定义为
...Input(shape=(20,)...)
而当需要为MNIST定义灰度图像的二维张量时,定义为:
...Input(shape=(28, 28, 1)...)
所以我的问题是为什么张量没有定义为(20)
和(28, 28)
?为什么在第一种情况下添加了第二个维度并将其留空?同样在第二,必须定义通道数?
我知道这取决于层,因此 Conv1D、Dense 或 Conv2D 具有不同的形状,但似乎第一个参数是隐式的?
根据 docs,密集需要 (batch_size, ..., input_dim)
但这与示例有何关联:
谢谢
元组与数字
input_shape
必须是一个元组,所以只有(20,)
可以满足。数字 20
不是元组。 -- 有参数 input_dim
,如果你只有一个维度,可以让你的生活更轻松。这个参数可以取20
。 (但实际上,我发现它只是令人困惑,我总是使用 input_shape
并使用元组,以保持一致的理解)。
Dense(32, input_shape=(784,))
等同于 Dense(32, input_dim=784)
。
图片
图像不仅有像素,还有通道(红、绿、蓝)。
black/white 图像只有一个通道。
所以,(28pixels, 28pixels, 1channel)
但请注意,没有义务在任何地方都遵循这种形状的图像。你可以按照你喜欢的方式塑造它们。但是有些层确实需要一定的形状,否则就无法工作。
有些图层需要特定的形状
这是二维卷积层的情况,需要 (size1,size2,channels)
。他们需要这种形状,因为他们必须相应地应用卷积滤波器。
循环层也是如此,需要 (timeSteps,featuresPerStep)
来执行它们的循环计算。
MNIST 模型
同样,没有任何义务以特定方式塑造您的形象。你必须根据你选择的第一层和你想要实现的目标来做。这是一件免费的事情。
许多示例根本不关心图像是二维结构的东西,它们只使用采用 784 像素的模型。够了。它们可能从 Dense
层开始,需要像 (size,)
这样的形状
其他示例可能会关心并使用形状 (28,28)
,但是这些模型将不得不重塑输入以适应下一层的需要。
2D 卷积层将需要 (28,28,1)
。
主要思想是:输入数组必须匹配input_shape
或input_dim
。
张量形状
不过,在阅读 Keras 错误消息或使用自定义/lambda 层时要小心。
我们之前定义的所有这些形状都忽略了一个重要的维度:批量大小或样本数量。
在内部,所有张量都将此附加维度作为第一维度。 Keras 会将其报告为 None
(将适应您拥有的任何批量大小的维度)。
因此,input_shape=(784,)
将被报告为 (None,784)
。
input_shape=(28,28,1)
将被报告为 (None,28,28,1)
并且您的实际输入数据的形状必须与报告的形状相匹配。
我是 Keras 的新手(不知何故是 TF 的新手),但我发现输入层的形状定义非常混乱。
所以在示例中,当我们有一个长度为 20 的一维向量作为输入时,形状定义为
...Input(shape=(20,)...)
而当需要为MNIST定义灰度图像的二维张量时,定义为:
...Input(shape=(28, 28, 1)...)
所以我的问题是为什么张量没有定义为(20)
和(28, 28)
?为什么在第一种情况下添加了第二个维度并将其留空?同样在第二,必须定义通道数?
我知道这取决于层,因此 Conv1D、Dense 或 Conv2D 具有不同的形状,但似乎第一个参数是隐式的?
根据 docs,密集需要 (batch_size, ..., input_dim)
但这与示例有何关联:
谢谢
元组与数字
input_shape
必须是一个元组,所以只有(20,)
可以满足。数字 20
不是元组。 -- 有参数 input_dim
,如果你只有一个维度,可以让你的生活更轻松。这个参数可以取20
。 (但实际上,我发现它只是令人困惑,我总是使用 input_shape
并使用元组,以保持一致的理解)。
Dense(32, input_shape=(784,))
等同于 Dense(32, input_dim=784)
。
图片
图像不仅有像素,还有通道(红、绿、蓝)。
black/white 图像只有一个通道。
所以,(28pixels, 28pixels, 1channel)
但请注意,没有义务在任何地方都遵循这种形状的图像。你可以按照你喜欢的方式塑造它们。但是有些层确实需要一定的形状,否则就无法工作。
有些图层需要特定的形状
这是二维卷积层的情况,需要 (size1,size2,channels)
。他们需要这种形状,因为他们必须相应地应用卷积滤波器。
循环层也是如此,需要 (timeSteps,featuresPerStep)
来执行它们的循环计算。
MNIST 模型
同样,没有任何义务以特定方式塑造您的形象。你必须根据你选择的第一层和你想要实现的目标来做。这是一件免费的事情。
许多示例根本不关心图像是二维结构的东西,它们只使用采用 784 像素的模型。够了。它们可能从 Dense
层开始,需要像 (size,)
其他示例可能会关心并使用形状 (28,28)
,但是这些模型将不得不重塑输入以适应下一层的需要。
2D 卷积层将需要 (28,28,1)
。
主要思想是:输入数组必须匹配input_shape
或input_dim
。
张量形状
不过,在阅读 Keras 错误消息或使用自定义/lambda 层时要小心。
我们之前定义的所有这些形状都忽略了一个重要的维度:批量大小或样本数量。
在内部,所有张量都将此附加维度作为第一维度。 Keras 会将其报告为 None
(将适应您拥有的任何批量大小的维度)。
因此,input_shape=(784,)
将被报告为 (None,784)
。
input_shape=(28,28,1)
将被报告为 (None,28,28,1)
并且您的实际输入数据的形状必须与报告的形状相匹配。