对于任何Keras层(Layer
类),有人可以解释如何理解input_shape
,units
,dim
等之间的区别吗?
例如,文档说units
指定图层的输出形状。
在hidden layer1
下面的神经网络图像中,有4个单位。这会直接转换为units
对象的Layer
属性吗?还是Keras中的units
等于隐藏层中每个权重的形状乘以单位数?
简而言之,如何利用下面的图像来了解/可视化模型的属性,尤其是图层的属性?
最佳答案
单位:
这是每一层的属性,是的,它与输出形状有关(我们将在后面看到)。在图片中,除了输入层(在概念上与其他层不同)之外,您具有:
形状
形状是模型配置的结果。形状是元组,表示每个维度中数组或张量具有多少个元素。
例如:形状
(30,4,10)
表示具有3个维度的数组或张量,在第一个维度中包含30个元素,在第二个维度中包含4个元素,在第三个维度中包含10个元素,总计30 * 4 * 10 = 1200个元素或数字。输入形状
层之间流动的是张量。张量可以看作是具有形状的矩阵。
在Keras中,输入层本身不是层,而是张量。它是您发送到第一个隐藏层的起始张量。该张量必须与训练数据具有相同的形状。
示例:如果您有30张RGB大小为50x50像素的图像(3 channel ),则输入数据的形状为
(30,50,50,3)
。然后,您的输入层张量必须具有此形状(请参见“keras中的形状”部分中的详细信息)。每种类型的层都需要输入一定数量的尺寸:
Dense
图层需要输入为(batch_size, input_size)
(batch_size, optional,...,optional, input_size)
channels_last
):(batch_size, imageside1, imageside2, channels)
channels_first
):(batch_size, channels, imageside1, imageside2)
(batch_size, sequence_length, features)
现在,输入形状是您必须定义的唯一形状,因为您的模型无法知道它。根据您的训练数据,只有您知道这一点。
所有其他形状都是根据每层的单位和特殊性自动计算的。
形状和单位之间的关系-输出形状
给定输入形状,所有其他形状都是图层计算的结果。
每层的“单位”将定义输出形状(由该层产生的张量的形状,并将其作为下一层的输入)。
每种类型的层都以特定方式工作。密集层具有基于“单位”的输出形状,卷积层具有基于“过滤器”的输出形状。但是它总是基于某些图层属性。 (有关每层输出的信息,请参见文档)
让我们展示一下“密集”图层(图表中显示的类型)会发生什么。
密集层的输出形状为
(batch_size,units)
。因此,是的,单位(图层的属性)也定义了输出形状。(batch_size,4)
。 (batch_size,4)
。 (batch_size,1)
。 重物
权重将完全根据输入和输出形状自动计算。同样,每种类型的层都以某种方式起作用。但是权重将是一个能够通过一些数学运算将输入形状转换为输出形状的矩阵。
在密集层中,权重将所有输入相乘。它是一个矩阵,每个输入只有一列,每个单位只有一行,但这对于基本工作通常并不重要。
在图像中,如果每个箭头上都有一个乘法数字,则所有数字共同构成权重矩阵。
凯拉斯的形状
之前,我给出了一个30幅图像,50x50像素和3个 channel 的示例,其输入形状为
(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)
(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)
(None,4)
(None,4)
(None,1)