我试图改进下面的cnn架构。我使用cnn进行图像分类。任何人都可以建议对下面的体系结构进行任何更改,这样可以减少培训时间而不会失去太多准确性吗?
建筑学注释:
它具有16个滤波器的卷积层,利用3,3窗口处理神经网络的初始输入。
随后是最大汇集层2,2
接下来,是另一个卷积层,其大小与第一层相同,以便保留从先前层传递的数据。
在前2层之后是包含32个过滤器的第三个卷积层,因为这允许网络开始查看更多细节并为更多数据腾出空间。
第3层产生了一个全局平均合并图层,然后将其输入完全连接的图层。
第一个完全连接的隐藏层使用64个单位,因为这是我估计在输出层之前允许黄油为网络提供更多空间来确定权重。
后面是Dropout图层,以帮助防止过度拟合,最后传递到进行预测的输出层。
输出层具有softmax激活功能,允许它保持数字0,1之间的概率分布。
CNN代码:
from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.models import Sequential
model = Sequential()
model.add(Conv2D(16, (3,3), input_shape=(224,224,3), activation = 'relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(16, (3,3), activation= 'relu'))
model.add(MaxPooling2D(pool_size =(2,2)))
model.add(Conv2D(32, (3,3), activation= 'relu'))
model.add(GlobalAveragePooling2D())
model.add(Dense(units=64, activation= 'relu'))
model.add(Dropout(0.3))
model.add(Dense(units= 133, activation = 'softmax'))
model.summary()
答案 0 :(得分:3)
大多数训练计算都发生在第一个Conv2D
层:
Conv2D(16, (3,3), input_shape=(224,224,3), activation = 'relu')
此图层中有(224 - 2)*(224 - 2) = 49284
个大小为3x3
和16
个过滤器的空间补丁,总共为前向提供了近800k(788544准确)卷积操作向后传球。这并没有考虑到您的批量大小。
我建议您在第一层使用striding,例如strides=(2, 2)
将减少补丁数量4次。此外,网络通过跨步进行下采样。这意味着您可以摆脱下一个MaxPooling2D
图层,只使用卷积图层获得相同的要素图大小。
当然,网络会失去一些灵活性,但它不应该影响准确性。