sca*_*row 191 neural-network deep-learning keras keras-layer tensor
对于任何Keras层(Layer类),可有人解释如何理解之间的区别input_shape,units,dim,等?
例如,doc说明了units指定图层的输出形状.
在神经网络的图像下面hidden layer1有4个单位.这是否直接转换为对象的units属性Layer?或者units在Keras中,隐藏层中每个权重的形状是否等于单位数?
Dan*_*ler 304
"神经元"或"细胞"的数量,或其中的任何层.
它是每一层的属性,是的,它与输出形状有关(我们将在后面看到).在您的图片中,除了输入图层(概念上与其他图层不同)之外,您还有:
形状是模型配置的结果.形状是表示每个维度中数组或张量具有多少元素的元组.
例如:形状(30,4,10)是指具有3维的阵列或张量,在第一维中包含30个元素,在第二维中包含4个元素,在第三维中包含10个元素,总共30*4*10 = 1200个元素或数字.
在层之间流动的是张量.张量可以被视为具有形状的矩阵.
在Keras中,输入层本身不是层,而是张量.它是您发送到第一个隐藏层的起始张量.此张量必须与训练数据具有相同的形状.
示例:如果您在RGB(3个通道)中有30个50x50像素的图像,则输入数据的形状为(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
Run Code Online (Sandbox Code Playgroud)
可选地,或当某些类型的模型需要时,您可以通过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:这里我忽略了其他方面,比如激活功能.
使用Sequential模型:
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
Run Code Online (Sandbox Code Playgroud)
使用功能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)
Run Code Online (Sandbox Code Playgroud)
张量的形状
请记住,在定义图层时忽略批量大小:
(None,3) (None,4) (None,4) (None,1) 小智 7
输入尺寸说明如下:
这不是一个直接的答案,但我刚刚意识到“输入维度”一词可能会令人困惑,因此请注意:
它(仅单词一词)可以指代:
a)输入数据(或流)的维度,例如#N个传感器轴以发出时间序列信号,或RGB颜色通道(3):建议字=>“ InputStream Dimension”
b)输入要素(或输入层)的总数/长度(MINST彩色图像为28 x 28 = 784)或FFT转换后的“光谱值”中为3000,或
“输入层/输入要素尺寸”
c)输入的维数(维数)(通常是Keras LSTM中期望的3D)或(#RowofSamples,#of Senors,#of Values ..)3是答案。
“输入的N维”
d)此展开的输入图像数据中的特殊输入形状(例如(30,50,50,3),如果展开的Keras,则为(30,250,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'))
Run Code Online (Sandbox Code Playgroud)
在Keras LSTM中,它指的是总时间步长
这个词很混乱,是正确的,我们生活在一个非常混乱的世界中!!
我发现机器学习中的挑战之一是处理不同的语言或方言和术语(例如,如果您有5-8个非常不同的英语版本,那么您需要非常熟练的语言才能与不同的说话者交谈)。也许在编程语言中也是如此。