对于任何 Keras 层(Layer
类),有人可以解释如何理解 、 、 等之间的input_shape
区别units
吗dim
?
例如,文档说units
指定图层的输出形状。
在下图中的神经网络hidden layer1
有 4 个单元。这是否直接转化为对象的units
属性Layer
?或者units
在 Keras 中是否等于隐藏层中每个权重的形状乘以单元数?
对于任何 Keras 层(Layer
类),有人可以解释如何理解 、 、 等之间的input_shape
区别units
吗dim
?
例如,文档说units
指定图层的输出形状。
在下图中的神经网络hidden layer1
有 4 个单元。这是否直接转化为对象的units
属性Layer
?或者units
在 Keras 中是否等于隐藏层中每个权重的形状乘以单元数?
“神经元”或“细胞”的数量,或该层内部的任何内容。
它是每一层的属性,是的,它与输出形状有关(我们稍后会看到)。在您的图片中,除了在概念上与其他层不同的输入层外,您具有:
形状是模型配置的结果。形状是表示数组或张量在每个维度中有多少元素的元组。
例如:形状(30,4,10)
是指一个数组或 3 维张量,第一维包含 30 个元素,第二维包含 4 个元素,第三维包含 10 个元素,总共 30*4*10 = 1200 个元素或数字。
层间流动的是张量。张量可以看作是具有形状的矩阵。
在 Keras 中,输入层本身并不是一个层,而是一个张量。这是您发送到第一个隐藏层的起始张量。此张量必须与您的训练数据具有相同的形状。
示例:如果您有 30 张 50x50 像素的 RGB 图像(3 个通道),则输入数据的形状为(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 个通道,输入形状为(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 有两种方法,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)
输入维度澄清:
不是直接的答案,但我刚刚意识到术语“输入维度”可能会令人困惑,所以要小心:
单是“维度”这个词就可以指:
a)输入数据(或流)的维度,例如发送时间序列信号的传感器轴的#N,或 RGB 颜色通道 (3):建议术语 =“输入流维度”
b)输入特征(或输入层)的总数/长度(MINST 彩色图像为 28 x 28 = 784)或 FFT 变换的频谱值中的 3000,或
“输入层/输入特征维度”
c)输入的维度(维度数)(通常是 Keras LSTM 中预期的 3D)或(样本行数、传感器数、值数..)3 就是答案。
“输入的 N 维”
d) 在这个展开的输入图像数据中的特定输入形状(例如 (30,50,50,3),或者如果展开 Keras,则为 (30, 2500, 3) :
在 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 个高度不同的英语版本,那么您需要非常熟练地与不同的说话者交谈)。可能这在编程语言中也是一样的。