Keras 输入说明:input_shape、units、batch_size、dim 等

Keras input explanation: input_shape, units, batch_size, dim, etc

对于任何 Keras 层 (Layer class),有人可以解释如何理解 input_shapeunitsdim 等之间的区别吗.?

例如,文档说 units 指定图层的输出形状。

在下面的神经网络图像中 hidden layer1 有 4 个单元。这是否直接转换为 Layer 对象的 units 属性?或者 Keras 中的 units 是否等于隐藏层中每个权重的形状乘以单元数?

简而言之 understand/visualize 模型的属性 - 特别是图层 - 与下图的关系如何?

单位:

The amount of "neurons", or "cells", or whatever the layer has inside it.

它是每一层的一个属性,是的,它与输出形状有关(我们稍后会看到)。在你的图片中,除了输入层,它在概念上不同于其他层,你有:

  • 隐藏层 1:4 个单元(4 个神经元)
  • 隐藏层 2:4 个单元
  • 最后一层:1个单位

形状

形状是模型配置的结果。形状是表示数组或张量在每个维度中有多少元素的元组。

例如:一个形状(30,4,10)表示一个数组或张量有3维,第一维包含30个元素,第二维4个,第三维10个,总共有 30*4*10 = 1200 个元素或数字。

输入形状

层与层之间流动的是张量。张量可以看作是有形状的矩阵。

在Keras中,输入层本身并不是一个层,而是一个张量。这是您发送到第一个隐藏层的起始张量。该张量必须与您的训练数据具有相同的形状。

示例: 如果您有 30 张 50x50 像素的 RGB 图像(3 个通道),则输入数据的形状为 (30,50,50,3)。然后你的输入层张量,必须有这个形状(详见 "shapes in keras" 部分)。

每种类型的层都需要具有一定维数的输入:

  • Dense 层需要输入 (batch_size, input_size)
    • (batch_size, optional,...,optional, input_size)
  • 2D 卷积层需要以下输入:
    • 如果使用 channels_last(batch_size, imageside1, imageside2, channels)
    • 如果使用 channels_first(batch_size, channels, imageside1, imageside2)
  • 一维卷积和循环层使用 (batch_size, sequence_length, features)

现在,输入形状是您必须定义的唯一形状,因为您的模型无法识别它。根据您的训练数据,只有您自己知道。

其他所有形状都是根据各层的单位和特殊性自动计算的。

形状和单位之间的关系 - 输出形状

给定输入形状,所有其他形状都是层计算的结果。

每一层的"units"将定义输出形状(该层产生的张量的形状,并将作为下一层的输入)。

每种类型的层都以特定的方式工作。密集层的输出形状基于 "units",卷积层的输出形状基于 "filters"。但它总是基于某个层属性。 (有关每一层输出的内容,请参阅文档)

让我们展示一下 "Dense" 层会发生什么,这是图表中显示的类型。

致密层的输出形状为 (batch_size,units)。所以,是的,层的 属性 单位也定义了输出形状。

  • 隐藏层 1:4 个单元,输出形状:(batch_size,4)
  • 隐藏层 2:4 个单元,输出形状:(batch_size,4)
  • 最后一层:1 个单元,输出形状:(batch_size,1)

权重

权重将完全根据输入和输出形状自动计算。同样,每种类型的层都以特定方式工作。但是权重将是一个矩阵,能够通过一些数学运算将输入形状转换为输出形状。

在密集层中,权重乘以所有输入。它是一个矩阵,每个输入一列,每个单元一行,但这对于基础工作通常并不重要。

在图中,如果每个箭头上都有一个乘法数字,那么所有数字加在一起就构成了权重矩阵。

Keras 中的形状

之前,我举了一个例子,30张图片,50x50像素,3个通道,输入形状为(30,50,50,3)

由于输入形状是您唯一需要定义的形状,Keras 将在第一层要求它。

但在这个定义中,Keras 忽略了第一个维度,即批量大小。您的模型应该能够处理任何批量大小,因此您只定义其他维度:

input_shape = (50,50,3)
    #regardless of how many images I have, each image has this shape        

可选地,或者当某些类型的模型需要时,您可以通过 batch_input_shape=(30,50,50,3)batch_shape=(30,50,50,3) 传递包含批量大小的形状。这将您的训练可能性限制在这个独特的批量大小,因此只有在真正需要时才应使用它。

无论您选择哪种方式,模型中的张量都将具有批量维度。

所以,即使你使用了input_shape=(50,50,3),当keras给你发送消息,或者当你打印模型摘要时,它也会显示(None,50,50,3)

第一个维度是批量大小,它是 None 因为它会根据您提供的训练示例数量而有所不同。 (如果您明确定义了批量大小,那么您定义的数字将出现而不是 None

此外,在高级作品中,当您实际直接对张量进行操作时(例如,在 Lambda 层内或在损失函数中),批量大小维度将在那里。

  • 因此,在定义输入形状时,您忽略了批量大小:input_shape=(50,50,3)
  • 直接对张量进行运算时,形状又会变成(30,50,50,3)
  • 当 keras 向您发送消息时,形状将是 (None,50,50,3)(30,50,50,3),具体取决于它向您发送的消息类型。

昏暗

最后,dim是什么?

如果您的输入形状只有一维,则不需要将其作为元组提供,只需将 input_dim 作为标量即可。

因此,在您的模型中,您的输入层有 3 个元素,您可以使用这两个元素中的任何一个:

  • input_shape=(3,) -- 当你只有一个维度时逗号是必要的
  • input_dim = 3

但是在直接处理张量时,通常dim会指代一个张量有多少维。例如,形状为 (25,10909) 的张量有 2 个维度。


在 Keras 中定义图像

Keras 有两种实现方式,Sequential 模型,或函数式 API Model。我不喜欢使用顺序模型,以后你将不得不忘记它,因为你会想要带有分支的模型。

PS:这里我忽略了其他方面,比如激活函数。

使用顺序模型:

from keras.models import Sequential  
from keras.layers import *  

model = Sequential()    

#start from the first hidden layer, since the input is not actually a layer   
#but inform the shape of the input, with 3 elements.    
model.add(Dense(units=4,input_shape=(3,))) #hidden layer 1 with input

#further layers:    
model.add(Dense(units=4)) #hidden layer 2
model.add(Dense(units=1)) #output layer   

与函数 API 型号:

from keras.models import Model   
from keras.layers import * 

#Start defining the input tensor:
inpTensor = Input((3,))   

#create the layers and pass them the input tensor to get the output tensor:    
hidden1Out = Dense(units=4)(inpTensor)    
hidden2Out = Dense(units=4)(hidden1Out)    
finalOut = Dense(units=1)(hidden2Out)   

#define the model's start and end points    
model = Model(inpTensor,finalOut)

张量的形状

请记住,在定义层时忽略批量大小:

  • 输入张量:(None,3)
  • hidden1Out: (None,4)
  • hidden2Out: (None,4)
  • 最终输出:(None,1)

已澄清输入维度:

不是直接的答案,但我只是意识到术语“输入维度”可能会造成混淆,所以要小心:

单单“维”字可以指代:

a) 输入数据(或流)的维度 例如#N 个传感器轴来传送时间序列信号,或 RGB 颜色通道 (3):建议的术语= "输入流维度"

b) 输入特征的总数/长度(或输入层)(MINST 彩色图像为 28 x 28 = 784)或 FFT 转换后的频谱值中的 3000 , 或

“输入层/输入特征维度”

c) 输入的维数(维度数)(通常是 Keras LSTM 中预期的 3D)或(样本行数、传感器数、维度数值..) 3 是答案。

“输入的 N 维”

d) SPECIFIC Input Shape(例如(30,50,50,3)在这个展开的输入图像数据中,或者(30, 2500, 3)如果展开 Keras:

在Keras中,input_dim指的是输入层的维度/输入特征的个数

    model = Sequential()
    model.add(Dense(32, input_dim=784))  #or 3 in the current posted example above
    model.add(Activation('relu')) 

在Keras LSTM中,指的是总的Time Steps

这个词一直很混乱,我们生活在一个很混乱的世界!!

我发现机器学习的挑战之一是处理不同的语言或方言和术语(比如如果你有 5-8 种截然不同的英语版本,那么你需要非常熟练地与不同的说话者交谈).大概这在编程语言中也是一样的吧。