对于任何Keras层(层类),有人能解释一下如何理解input_shape,单位,暗淡等之间的区别吗?
例如,文档说单位指定一个层的输出形状。
在神经网络的图像中,隐藏层1有4个单元。这是否直接转换为图层对象的单位属性?或者Keras中的单位是否等于隐藏层中每个权重的形状乘以单位的数量?
简而言之,如何理解/可视化模型的属性-特别是层-与下面的图像?
对于任何Keras层(层类),有人能解释一下如何理解input_shape,单位,暗淡等之间的区别吗?
例如,文档说单位指定一个层的输出形状。
在神经网络的图像中,隐藏层1有4个单元。这是否直接转换为图层对象的单位属性?或者Keras中的单位是否等于隐藏层中每个权重的形状乘以单位的数量?
简而言之,如何理解/可视化模型的属性-特别是层-与下面的图像?
单位:
“神经元”或“细胞”的数量,或任何层内的东西。
它是每个层的属性,是的,它与输出形状相关(我们将在后面看到)。在你的图片中,除了输入层,它在概念上与其他层不同,你有:
隐藏层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)。然后你的输入层张量,必须有这个形状(详见“形状在keras”一节)。
每种类型的层都需要输入一定数量的维度:
密集层需要输入(batch_size, input_size) 或者(batch_size, 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)。是的,单位,层的属性,也定义了输出形状。
隐藏层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有两种方法,顺序模型和函数API模型。我不喜欢使用顺序模型,以后你将不得不忘记它,因为你将需要带有分支的模型。
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)
张量的形状
请记住,在定义层时忽略批处理大小:
inpTensor:(无人,3) hidden1Out:(无人,4) hidden2Out:(无人,4) finalOut:(郎,1)
输入尺寸澄清:
不是一个直接的答案,但我刚刚意识到术语“输入维度”可能会令人困惑,所以要小心:
“维度”一词单独可以指:
a)发送时间序列信号的传感器轴# N或RGB颜色通道(3)等输入数据(或流)的维度:建议term = "输入流维度"
b)输入特征(或输入层)的总数/长度(MINST彩色图像为28 x 28 = 784)或FFT变换谱值中的3000,或
“输入层/输入特征维”
c)输入的维度(维度#)(在Keras LSTM中通常是3D)或(# of Rows of Samples, # of Sensors, # of Values..) 3是答案。
“N维数输入”
d)特定的输入形状(例如;(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中,它指的是总时间步长
这个术语已经非常混乱了,我们生活在一个非常混乱的世界!!
我发现机器学习的一个挑战是处理不同的语言或方言和术语(比如如果你有5-8个不同版本的英语,那么你需要非常熟练地与不同的人交谈)。这可能在编程语言中也是一样的。
添加这个答案,以详细说明在第一层的输入形状。 我创建了两个相同图层的变化
案例1:
model =Sequential()
model.add(Dense(15, input_shape=(5,3),activation="relu", kernel_initializer="he_uniform", kernel_regularizer=None,kernel_constraint="MaxNorm"))
model.add(Dense(32,activation="relu"))
model.add(Dense(8))
案例2:
model1=Sequential()
model1.add(Dense(15,input_shape=(15,),kernel_initializer="he_uniform",kernel_constraint="MaxNorm",kernel_regularizer=None,activation="relu"))
model1.add(Dense(32,activation="relu"))
model1.add(Dense(8))
plot_model(model1,show_shapes=True)
现在把这些画出来,总结一下
案例1
[![Case1模型摘要][2]][2].使用实例 [2]: https://i.stack.imgur.com/WXh9z.png
案例2
总结
如果你仔细观察,在第一种情况下,输入是二维的。第一层输出为每一行x个单元生成一个。
情况二比较简单,没有那么复杂,每个单元激活后只产生一个输出。