Keras 输入说明:input_shape、units、batch_size、dim 等
Keras input explanation: input_shape, units, batch_size, dim, etc
对于任何 Keras 层 (Layer
class),有人可以解释如何理解 input_shape
、units
、dim
等之间的区别吗.?
例如,文档说 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 种截然不同的英语版本,那么你需要非常熟练地与不同的说话者交谈).大概这在编程语言中也是一样的吧。
对于任何 Keras 层 (Layer
class),有人可以解释如何理解 input_shape
、units
、dim
等之间的区别吗.?
例如,文档说 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 种截然不同的英语版本,那么你需要非常熟练地与不同的说话者交谈).大概这在编程语言中也是一样的吧。