Keras输入说明:input_shape,units,batch_size,dim等

时间:2017-06-25 14:29:03

标签: neural-network deep-learning keras keras-layer tensor

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

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

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

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

2 个答案:

答案 0 :(得分:231)

单元

  

"神经元"或"细胞"的数量,或其内部的任何层。

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

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

形状

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

Ex:形状(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)
  • 2D卷积层需要输入为:
    • 如果使用channels_last(batch_size, imageside1, imageside2, channels)
    • 如果使用channels_first(batch_size, channels, imageside1, imageside2)
  • 1D卷积和循环图层使用(batch_size, sequence_length, features)

现在,输入形状是您必须定义的唯一形状,因为您的模型无法知道它。只有您知道,根据您的训练数据。

所有其他形状都是根据每层的单位和特性自动计算的。

形状和单位之间的关系 - 输出形状

给定输入形状,所有其他形状都是图层计算的结果。

"单位"每层的定义将定义输出形状(由层生成的张量的形状,它将是下一层的输入)。

每种类型的图层都以特定的方式工作。密集层具有基于"单位"的输出形状,卷积层具有基于"滤波器"的输出形状。但它始终基于某些图层属性。 (请参阅文档了解每个图层输出的内容)

让我们来看看" 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:在这里我忽略了其他方面,例如激活功能。

使用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   

使用功能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)

答案 1 :(得分:3)

已澄清输入尺寸:

这不是直接的答案,但我刚刚意识到“输入维度”一词可能会令人困惑,因此请警惕:

它(仅单词维一词)可以指代:

a)输入数据(或流)的尺寸,例如用于传输时间序列信号或RGB彩色通道(3)的#N个传感器轴:建议字=>“ InputStream Dimension “

b)输入要素的总数/长度(或输入层)(MINST彩色图像的28 x 28 = 784)或FFT转换后的频谱值中的3000,或者

“输入层/输入要素尺寸”

c)输入的维度(维度数)(通常是Keras LSTM中期望的3D)或(#RowofSamples,#of Senors,#of Values ..)3是答案。

“输入的N维”

d)此展开的输入图像数据中的 SPECIFIC Input Shape (特殊输入形状)(例如,(30,50,50,3),如果展开,则为(30,250,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个非常不同的英语版本,那么您需要非常熟练的语言才能与不同的说话者交谈)。可能在编程语言中也是如此。