我是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'))
我的怀疑:
如果我输入的值太大,就像在下面的代码中一样,按照逻辑我将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()
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
当我完全消除这一层时,我的代码可以工作,或者即使我把更小的值,我的代码仍然可以工作但是,我不想在不知道原因的情况下盲目地设置参数。
答案 0 :(得分:1)
深度学习中的许多设计决策归结为实用规则,这些规则在尝试不同的选项后似乎运行良好。
倒数第二层的大小就是其中一个例子。通过为网络提供更多深度(更多层)和/或使其更宽(更多通道),我们增加了模型的理论学习能力。但是,简单地为网络提供10000个具有172800个通道的密集层可能无法提高性能,甚至根本无法工作。
理论上,512完全是任意的。实际上,它在我在其他架构中看到的大小范围内。我理解你决定将输入单元的数量连接到输出单元的数量,速率为2.虽然完全有可能这是深度学习中最有想法的人,但我常常看到大小的例子。第二个到最后一个密集层的数字连接到最后一层中的输出类数。
因此,根据经验,您可以尝试使用2x到4x的速率,并查看它的位置。您尝试创建的图层将有150亿个参数。仅这一点大约比我见过的最大架构大100倍。
此时我想停止猜测更多建议,因为它取决于很多因素。