我正在尝试改进下面的cnn架构 . 我正在使用cnn进行图像分类 . 任何人都可以建议对下面的架构进行任何更改,以减少培训时间而不会失去太多的准确性吗?
建筑笔记:
它有一个由16个滤波器组成的卷积层,利用一个3,3窗口来处理神经网络的初始输入 .
接下来是最大汇集层2,2
接下来,是另一个卷积层,其大小与第一层相同,以便保留从先前层传递的数据 .
在前2层之后是包含32个过滤器的第三个卷积层,因为这允许网络开始查看更多细节并为更多数据开辟空间 .
第三层产生全局平均汇集层,然后将其馈送到完全连接的层 .
第一个完全连接的隐藏层使用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()
1 回答
大多数训练计算都发生在第一个
Conv2D
层:在该层中有
(224 - 2)*(224 - 2) = 49284
个大小为3x3
和16
个过滤器的空间块,总共提供了近800k(准确的788544)卷积操作,用于前向和后向传递 . 这并没有考虑您的批量大小 .我建议你做的是在第一层使用striding,例如
strides=(2, 2)
将减少补丁数量4次 . 此外,网络通过跨步进行下采样 . 这意味着您可以摆脱下一个MaxPooling2D
图层,只使用卷积图层获得相同的要素图大小 .当然,网络会失去一些灵活性,但它不应该影响准确性 .