Keras输入解释:input_shape, units, batch_size, dim等

对于任何Keras层(Layer类),有人能解释一下如何理解input_shapeunitsdim等之间的区别吗?

例如,文档说units指定一个层的输出形状。

在下面的神经网络图像中hidden layer1有4个单元。这是否直接转换为Layer对象的units属性?或者Keras中的units是否等于隐藏层中每个权重的形状乘以单位数?

简而言之,如何理解/可视化模型的属性-特别是层-与下面的图像? enter image description here < / p >
288464 次浏览

单位:

“神经元”或“细胞”的数量,或任何层内的东西。

它是每个层的属性,是的,它与输出形状相关(我们将在后面看到)。在你的图片中,除了输入层,它在概念上与其他层不同,你有:

  • 隐藏层1:4个单元(4个神经元)
  • 隐藏层2:4个单位
  • 最后一层:1个单位

形状

形状是模型配置的结果。形状是元组,表示一个数组或张量在每个维度上有多少个元素。

(30,4,10)表示三维数组或张量,第一维包含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)
    • 李< / ul > < / >
    • 2D卷积层需要输入如下:
      • 如果使用channels_last: (batch_size, imageside1, imageside2, channels)
      • 如果使用channels_first: (batch_size, channels, imageside1, imageside2)
      • 李< / ul > < / > 1D卷积和循环层使用(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有两种方法,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)
        

        张量的形状

        请记住,在定义层时忽略批处理大小:

        • inpTensor: (None,3)
        • hidden1Out: (None,4)
        • hidden2Out: (None,4)
        • finalOut: (None,1)

输入尺寸澄清:

不是一个直接的答案,但我刚刚意识到术语“输入维度”;可能会让人困惑,所以要小心:

“维度”这个词;Alone可指:

a) 输入数据(或流)的维度如# N的传感器轴来发射时间序列信号,或RGB颜色通道(3):建议术语= "输入流维度"

b) 输入特征的总数/长度(或输入层)(对于MINST彩色图像,28 x 28 = 784)或FFT转换的光谱值中的3000,或

“输入层/输入特征维度”;

c)输入的维数 (# of dimensions)(在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

Case 1:Plot .

< p > [![Case1模型摘要][2]][2].使用实例 [2]: https://i.stack.imgur.com/WXh9z.png < / p >

案例2

Case 2 Plot

总结

enter image description here

如果你仔细观察,在第一种情况下,输入是二维的。第一层输出为每一行x个单元生成一个。

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