如何计算dense层输出参数值

How to calculate dense layer output parameter value

我是 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, activation='relu'))

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

我的疑惑:

  1. 程序员是如何决定这个密集层的值“512”的?
  2. 是完全随机的吗?因为我知道在这个例子中,flatten 有 256 个参数,所以逻辑上说他们将它乘以 2 得到 512 的值。但是,这个逻辑在我读过的任何其他情况下都不遵循。
  3. 这个致密层如何影响训练?
  4. 如果我输入的值太大,就像在下面的代码中一样,按照我将展平参数 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()
    

ValueError: rng_mrg cpu-实现不支持超过 (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

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

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

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

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

  • AlexNet 使用 2000 个单元输入最终输出 1000 个 类
  • VGG16 使用 4000 个单元,最终输出 1000 个 类

因此,根据经验,您可以尝试使用 2 倍到 4 倍的这些比率进行游戏,看看它能给您带来什么。您尝试创建的层将有 150 亿个参数。仅此一项就比我见过的最大架构大大约 100 倍。

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