python

CNN变体网络之--AlexNet

2019-08-07  本文已影响60人  晨光523152

AlexNet与LeNet-5区别

AlexNet不同于LeNet-5的地方:

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。

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

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

上一篇 下一篇

猜你喜欢

热点阅读