我正在尝试编写和学习不同的神经网络模型。我对输入维度有很多复杂性。我正在寻找一些教程,它显示了图层的差异以及如何为每个图层设置输入和输出。
答案 0 :(得分:2)
Keras documentation会显示每个图层所需的所有input_shape
。
在Keras中,您会看到以下形式的输入形状:
input_shape
用户定义的输入形状和传递到Reshape
图层的形状:
定义的输入形状将忽略批量大小,它只需要单个数据样本的大小。
例如,当您定义Dense
图层时,将其input_shape
表示为(10,)
,这意味着它需要十个数值作为输入。
keras一般显示的形状:
这些将以None
作为第一维。这表示您用于培训的批次的大小。批处理是包含许多数据样本的数组。由于批量大小是免费的,并且仅在您实际传递批次进行培训时才定义,因此Keras将其显示为None
。
在该Dense图层中,Keras会将(None, 10)
显示为输入形状。
数组形状:
在培训,预测等过程中,当您实际拥有批次及其大小时,keras将在错误消息中显示批次的实际形状,即(BatchSize,...其他尺寸......)。
对于我们的Dense(10)
,假设您通过了一个包含300个样本的批处理进行培训,那么keras会显示包含形状(300,10)
的错误消息
张量形状:
当您创建Lambda
图层或自定义图层以及创建自定义丢失函数时,张量形状将出现在更高级的用法中。
张量形状将遵循将批量大小作为第一维的想法。所以,请记住,无论何时直接使用张量,它们都会有(BatchSize, ...other dimensions...)
形状。
现在你知道了这些差异,我将继续使用下面None
的表单。在定义input_shape
时,请记住忽略None部分。
密集层通常采用单个值,而不是数组作为输入,因此,其输入形状为:(None, AnyNumberOfInputValues)
输出类似:(None, NumberOfNeuronsInThisLayer)
只有一个维度的卷积层。使用卷积时,想法是有渠道。
想象一下声音文件,它包含左右两个声道。每个通道是对应于波形的值的数组。
Keras为您提供channels_first
或channels_last
选项,这会更改图层的输入和输出:
(None, channels, length)
(None, length, channels)
输出也遵循“channels_first / channels_last”设置,它是这样的:(None, NumberOfFilters, ResultingLength)
- 首先是频道
默认设置为“channels_last”,您可以在每个图层或keras.json文件中定义它
与Conv1D相同的想法,使用频道,首先是频道,最后是频道。但现在,它有两个维度,如图像,每个通道与红色,绿色,蓝色相比。
(None, channels, pixelsX, pixelsY)
(None, pixelsX, pixelsY, channels)
在“channels_firts / channels_last”设置之后的输出类似于(None, NumberOfFilters, resultPixelsX, resultPixelsY)
的channels_first。
Lstm图层很难理解。他们有一些使用不同输入形状的选项,并且有一些有趣的教程,例如this one和this too。
通常,输入形状为(None, TimeSteps, InputDimension)
由于LSTM用于序列,因此您可以按时间步骤分离序列。输入维度只是具有多维值的可能性。
输出也会根据所选的选项而有所不同。它可能是(None, Timesteps, NumberOfCellsInTheLeyr)
或仅(None, NumberOfCells)
,具体取决于您是否选择返回序列。