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


261

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

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

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

简而言之,如何利用下面的图像来理解/可视化模型的属性,尤其是图层的属性? 在此处输入图片说明

Answers:


412

单位:

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

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

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

形状

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

例如:形状(30,4,10)是指具有3个维度的数组或张量,在第一个维度中包含30个元素,在第二个维度中包含4个元素,在第三个维度中包含10个元素,总计30 * 4 * 10 = 1200个元素或数字。

输入形状

层之间流动的是张量。张量可以看作是具有形状的矩阵。

在Keras中,输入层本身不是层,而是张量。它是发送到第一个隐藏层的起始张量。该张量必须与训练数据具有相同的形状。

示例:如果您有30张RGB大小为50x50像素的图像(3通道),则输入数据的形状为(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)
  • 一维卷积和递归层使用 (batch_size, sequence_length, features)

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

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

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

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

每层的“单位”将定义输出形状(由该层产生的张量的形状,并将其作为下一层的输入)。

每种类型的层都以特定方式工作。密集层具有基于“单位”的输出形状,卷积层具有基于“过滤器”的输出形状。但是它总是基于某些图层属性。(有关每层输出的信息,请参见文档)

让我们展示一下“密集”图层的情况,这是图形中显示的类型。

致密层的输出形状为(batch_size,units)。因此,是的,单位(图层的属性)也定义了输出形状。

  • 隐藏层1:4个单位,输出形状:(batch_size,4)
  • 隐藏层2:4个单位,输出形状:(batch_size,4)
  • 最后一层:1个单位,输出形状:(batch_size,1)

重物

权重将完全根据输入和输出形状自动计算。同样,每种类型的层都以某种方式起作用。但是权重将是一个能够通过一些数学运算将输入形状转换为输出形状的矩阵。

在密集层中,权重将所有输入相乘。它是一个矩阵,每个输入一列,每个单位一行,但这对于基本工作通常并不重要。

在图像中,如果每个箭头上都有一个乘法数字,则所有数字共同构成权重矩阵。

凯拉斯的形状

之前,我举了一个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)

7
关于input_shape=参数的一个问题仍然存在:参数的第一个值指向哪个维度?我看到类似的东西input_shape=(728, ),所以在我看来,第一个参数是指列(固定),第二个是行(可以自由变化)。但是,这与Python的行主要数组顺序如何?
Maxim.K

17
该逗号不会产生第二维。这只是用于创建tuple仅包含一个元素的python表示法。input_shape(728,)与相同batch_input=(batch_size,728)。这意味着每个样本具有728个值。
DanielMöller17年

@DanielMöller:能否请您详细说明一下“输入元素”和“尺寸”之间的区别?我认为上面的图具有三维输入层,因此使dim = 3,所以我想知道我在这里缺少什么,因为我看到您写道输入是一维的……
海伦

1
向量具有一个维度,但是元素很多。它具有形状(n,)-矩阵具有二维,维度0具有m个元素,维度1具有n个元素,总计mxn个元素,形状为(m,n)。如果您将一个“多维数据集”想象成几个小立方体,每个小立方体都有数据,那么它将是3D,具有mxnxo元素,形状为(m,n,o)。
DanielMöller18年

2
@王子,顺序很重要。您可以将Keras配置为使用data_format = 'channels_first'data_format='channels_last'。我建议最后使用始终使用频道(Keras的默认设置)。它与所有其他层更加兼容。
DanielMöller18年

11

输入尺寸说明如下:

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

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

a)输入数据(或流的维度,例如#N个传感器轴,以发出时间序列信号或RGB颜色通道(3):建议字=>“ InputStream Dimension”

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

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

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

“ N维输入”

d)此展开的输入图像数据中的特殊输入形状(例如(30,50,50,3),如果展开的Keras,则为(30,250,3)

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个非常不同的英语版本,那么您需要非常熟练的语言才能与不同的说话者交谈)。也许在编程语言中也是如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.