360

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

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

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

简而言之,如何使用下图理解/可视化模型的属性 - 特别是图层? 在此处输入图像描述

4

2 回答 2

586

单位:

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

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

  • 隐藏层 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 中的形状”部分)。

每种类型的层都需要具有一定维数的输入:

  • 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).

重量

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

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

在图像中,如果每个箭头上都有一个乘数,那么所有的数字加在一起就形成了权重矩阵。

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)

张量的形状

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

  • 输入张量:(None,3)
  • 隐藏1出:(None,4)
  • hidden2Out:(None,4)
  • 最终输出:(None,1)
于 2017-06-25T16:32:23.713 回答
17

输入维度澄清:

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

单是“维度”这个词就可以指:

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

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

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

c)输入的维度(维度数)(通常是 Keras LSTM 中预期的 3D)或(样本行数、传感器数、值数..)3 就是答案。

“输入的 N 维”

d) 在这个展开的输入图像数据中的特定输入形状(例如 (30,50,50,3),或者如果展开 Keras,则为 (30, 2500, 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 中,它指的是总的 Time Steps

这个词一直很混乱,我们生活在一个非常混乱的世界!!

我发现机器学习的挑战之一是处理不同的语言或方言和术语(例如,如果您有 5-8 个高度不同的英语版本,那么您需要非常熟练地与不同的说话者交谈)。可能这在编程语言中也是一样的。

于 2018-07-23T07:54:41.297 回答