首页 文章

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

提问于
浏览
88

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

例如,doc说 units 指定图层的输出形状 .

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

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

2 回答

  • 2

    单位:

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

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

    • 隐藏层1:4个单位(4个神经元)

    • 隐藏层2:4个单位

    • 最后一层:1个单位

    形状

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

    Ex: 形状 (30,4,10) 表示具有3个维度的数组或张量,第一维包含30个元素,第二维包含4个元素,第三维包含10个元素,总共30 * 4 * 10 = 1200个元素或数字 .

    输入形状

    在层之间流动的是张量 . 张量可以被视为具有形状的矩阵 .

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

    Example: 如果您在RGB(3个通道)中有30个50x50像素的图像,则输入数据的形状为 (30,50,50,3) . 然后输入图层张量必须具有此形状(请参阅"shapes in 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)

    • Details on how to prepare data for recurrent layers

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

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

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

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

    每层的“单位”将定义输出形状(由层产生的张量的形状,并且将是下一层的输入) .

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

    让我们看一下“密集”图层会发生什么,这是图中显示的类型 .

    致密层的输出形状为 (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

    但是当直接处理张量时,通常会指出张量有多少维度 . 例如,具有形状(25,10909)的张量具有2个维度 .


    在Keras中定义图像

    Keras有两种方法, Sequential 模型或功能API Model . 我不喜欢使用顺序模型,以后你不得不忘记它,因为你会想要带分支的模型 .

    PS:这里我忽略了其他方面,比如激活功能 .

    With the Sequential model

    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
    

    With the functional API Model

    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)
    

    Shapes of the tensors

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

    • inpTensor: (None,3)

    • hidden1Out: (None,4)

    • hidden2Out: (None,4)

    • finalOut: (None,1)

  • 148

    Input Dimension Clarified:

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

    它(单词维度)可以参考:

    a) The dimension of Input Data (or stream) ,例如用于传输时间序列信号的传感器轴#N,或RGB颜色通道(3):建议字=> "InputStream Dimension"

    b) The total number /length of Input Features (或输入层)(MINST彩色图像为28 x 28 = 784)或FFT变换后的光谱值为3000,或者

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

    c)输入的 dimensionality (维数#)(通常是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个高度不同的英语版本,那么你需要非常高的熟练程度来与不同的发言者交谈) . 可能在编程语言中也是如此 .

相关问题