CNN变体网络之--AlexNet

AlexNet与LeNet-5区别

AlexNet不同于LeNet-5的地方:

  • 使用了最大池化
  • 使用了ReLu激活函数
  • ReLu激活函数之后,使用了本地响应归一化:LRN(Local Response Normalization)

LRN功能

LRN:能够使得最强烈的激活来抑制同一位置但是在不同特征图中的神经元(这种竞争激活特性已经在生物神经元中被观察到)。这种特性鼓励不同特征图变得专业化,推动它们分离并迫使它们去探索新的功能,最终改进泛化。

LRN公式

b_{x, y}^{i} = a_{x, y}^{i}(k + \alpha \sum_{j = j_{loww}}^{j_{high}}(a_{x, y}^{j})^{- \beta} )\;\;\;\;\;\; (1)

其中,x, y表示第x行,第y列,i表示第i个特征图,a_{x, y}^{i}表示经过ReLu后的输出,b_{x, y}^{i}表示第i个特征图中第x行,第y列的值经过归一化后的输出
\begin{split} j_{low} &= max(0, i - \frac{r}{2})\;\;\;\;\;\;(2)\\ j_{high} & = min(i + \frac{r}{2}, f_{n} - 1) \;\;\;\;\;\;(2) \end{split}
其中,k, r, \alpha是超参数,k被称为偏置参数,r被称为深度半径,f_{n}是特征图的数量。
在AlexNet中,超参数设置如下:r = 2, \alpha = 0.00002, \beta = 0.75, k = 1
如果r = 2并且神经元被激活,那么它将抑制位于其上面和下面的特征图中的神经元的激活

AlexNet网络架构

AlexNet网络架构

例子

还是在HSI上实验一下,切分数据集的函数如我之前的《CNN变体网络之--LeNet》里面一样。
为了和LeNet作比较,我直接把激活函数换成了ReLu,然后在每一个激活之后加了个LRU。

  • AlexNet
model = keras.Sequential()
model.add(layers.Conv2D(input_shape = (X_train.shape[1], X_train.shape[2], X_train.shape[3]),
                        strides = (1, 1), filters = 6, kernel_size = (5, 5), padding = 'same',
                        activation = 'relu'))
model.add(layers.BatchNormalization())
model.add(layers.AveragePooling2D(pool_size = (2, 2)))
model.add(layers.Conv2D(filters = 16, kernel_size = (5, 5), strides = (1, 1), padding = 'valid', activation = 'relu'))
model.add(layers.BatchNormalization())
model.add(layers.AveragePooling2D(pool_size = (2, 2)))
model.add(layers.Conv2D(filters = 120, kernel_size = (5, 5), strides = (1, 1), padding = 'valid', activation = 'relu'))
model.add(layers.BatchNormalization())
model.add(layers.Flatten())
model.add(layers.Dense(84, activation = 'relu'))
model.add(layers.Dense(y_train.shape[1], activation = 'softmax'))
model.compile(loss = keras.losses.CategoricalCrossentropy(),optimizer = keras.optimizers.SGD(),
             metrics = ['accuracy'])
model.summary()
history = model.fit(X_train, y_train, validation_split=0.2, epochs=n_epochs,
                    batch_size=batch_size)
plt.figure()
plt.plot(history.history['loss'], label='train_loss')
plt.plot(history.history['val_loss'], label='val_loss')
plt.legend()
plt.xlabel('epochs')
plt.ylabel('loss')
plt.title('AlexNet-5_train')

plt.figure()
plt.plot(history.history['accuracy'], label='train_accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.legend()
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.title('Alex-5_accuracy')

plt.show()

test = model.evaluate(X_test, y_test)
print(test)

image.png
  • 实验结果图


    AlexNet损失

    AlexNet准确率
  • 实验结果:
    9225/9225 [==============================] - 105s 11ms/sample - loss: 0.1829 - accuracy: 0.9514

参考资料:
机器学习实战
https://blog.csdn.net/wmy199216/article/details/71171401

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容