如何计算密集层输出参数值

时间:2018-02-05 11:25:57

标签: python deep-learning classification keras-layer

我是keras的新手并且已经阅读了关于使用keras进行深度学习分类的博客文章,但是,即使在阅读了很多这些分类之后,我也无法弄清楚他们每个人是如何计算出第一个密集层的参数值之后的在他们的代码中展平图层。 例如:

from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten

def createModel():
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same', activation='relu',input_shape=input_shape))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
  

model.add(Dense(512,激活=' relu'))

model.add(Dropout(0.5))
model.add(Dense(nClasses, activation='softmax'))

我的怀疑:

  1. 程序员是如何决定价值的?512'对于这个致密的层?
  2. 完全是随机的吗?因为我知道在这个例子中,flatten有256个参数,所以逻辑说他们将它乘以2得到512的值。但是,这个逻辑并没有跟随我读过的任何其他情况。
  3. 这个密集层如何影响培训?
  4. 如果我输入的值太大,就像在下面的代码中一样,按照逻辑我将flatten参数86400乘以2即172800,我得到以下错误:

    model = Sequential()
    model.add(Conv2D(32, (3, 3),input_shape=input_shape))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    
    
    model.add(Conv2D(64, (3, 3) ))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Conv2D(96, (3, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Flatten())
    
    
    > model.add(Dense(172800))
    
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(4))
    model.add(Activation('softmax'))
    
    model.summary()
    
  5. ValueError:rng_mrg cpu-implementation不支持超过(2 ** 31 -1)个样本

    提示:禁用大多数Theano优化后重新运行可以为您提供创建此节点的回溯。这可以通过设置Theano标志' optimizer = fast_compile'来完成。如果这不起作用,可以使用' optimizer = None'禁用Theano优化。 提示:使用Theano标志' exception_verbosity = high'获取此应用节点的调试打印和存储映射占用空间。

    这是我对没有第一层密集层的模型的总结

    Layer (type)             Output Shape                 Param #   
    =================================================================
    conv2d_4 (Conv2D)      (None, 254, 254, 32)            896       
    _________________________________________________________________
    activation_4 (Activation)    (None, 254, 254, 32)      0         
    _________________________________________________________________
    max_pooling2d_4 (MaxPooling2 (None, 127, 127, 32)      0         
    _________________________________________________________________
    dropout_4 (Dropout)          (None, 127, 127, 32)      0         
    _________________________________________________________________
    conv2d_5 (Conv2D)            (None, 125, 125, 64)      18496     
    _________________________________________________________________
    activation_5 (Activation)    (None, 125, 125, 64)      0         
    _________________________________________________________________
    max_pooling2d_5 (MaxPooling2 (None, 62, 62, 64)        0         
    _________________________________________________________________
    dropout_5 (Dropout)          (None, 62, 62, 64)        0         
    _________________________________________________________________
    conv2d_6 (Conv2D)            (None, 60, 60, 96)        55392     
    _________________________________________________________________
    activation_6 (Activation)    (None, 60, 60, 96)        0         
    _________________________________________________________________
    max_pooling2d_6 (MaxPooling2 (None, 30, 30, 96)        0         
    _________________________________________________________________
    dropout_6 (Dropout)          (None, 30, 30, 96)        0         
    _________________________________________________________________
    flatten_2 (Flatten)          (None, 86400)             0         
    _________________________________________________________________
    activation_7 (Activation)    (None, 86400)             0         
    _________________________________________________________________
    dropout_7 (Dropout)          (None, 86400)             0         
    _________________________________________________________________
    dense_2 (Dense)              (None, 4)                 345604    
    _________________________________________________________________
    activation_8 (Activation)    (None, 4)                 0         
    
    Total params: 420,388
    Trainable params: 420,388
    Non-trainable params: 0
    

    当我完全消除这一层时,我的代码可以工作,或者即使我把更小的值,我的代码仍然可以工作但是,我不想在不知道原因的情况下盲目地设置参数。

1 个答案:

答案 0 :(得分:1)

深度学习中的许多设计决策归结为实用规则,这些规则在尝试不同的选项后似乎运行良好。

倒数第二层的大小就是其中一个例子。通过为网络提供更多深度(更多层)和/或使其更宽(更多通道),我们增加了模型的理论学习能力。但是,简单地为网络提供10000个具有172800个通道的密集层可能无法提高性能,甚至根本无法工作。

理论上,512完全是任意的。实际上,它在我在其他架构中看到的大小范围内。我理解你决定将输入单元的数量连接到输出单元的数量,速率为2.虽然完全有可能这是深度学习中最有想法的人,但我常常看到大小的例子。第二个到最后一个密集层的数字连接到最后一层中的输出类数。

  • AlexNet使用2000个单位输入1000个类的最终输出
  • VGG16使用4000个单位输入1000个班级的最终输出

因此,根据经验,您可以尝试使用2x到4x的速率,并查看它的位置。您尝试创建的图层将有150亿个参数。仅这一点大约比我见过的最大架构大100倍。

此时我想停止猜测更多建议,因为它取决于很多因素。