对于任何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个单元生成一个。

情况二比较简单,没有那么复杂,每个单元激活后只产生一个输出。