Keras中2D图像的张量形状

Ali*_*tad 1 keras tensorflow keras-layer

我是Keras的新手(以某种方式对TF),但我发现输入层的形状定义非常混乱.

因此在示例中,当我们有一个长度为20的1D向量用于输入时,形状被定义为

...Input(shape=(20,)...)
Run Code Online (Sandbox Code Playgroud)

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

...Input(shape=(28, 28, 1)...)
Run Code Online (Sandbox Code Playgroud)

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

我明白它取决于层,所以Conv1D,Dense或Conv2D采取不同的形状,但似乎第一个参数是隐含的?

根据文档,密集需要,(batch_size, ..., input_dim)但这是如何相关的例子:

密集(32,input_shape =(784,))

谢谢

Dan*_*ler 7

元组与数字

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错误消息或使用custom/lambda图层时要小心.

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

在内部,所有张量都将具有此附加维度作为第一维度.Keras会将其报告为None(适应您所拥有的任何批量大小的维度).

所以,input_shape=(784,)将被报道为(None,784).
input_shape=(28,28,1)将被报告为(None,28,28,1)

并且您的实际输入数据必须具有与报告的形状匹配的形状.