一、ReLU激活函数
公式:
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0,x)
f(x)=max(0,x)
图像:
1. 为什么要用ReLU激活函数
由于sigmoid函数在输入远离中心点时导数会很小,会出现梯度消失的现象。使用ReLU激活函数时则不会出现梯度消失的现象。 但是当输入为负数时ReLU函数会死掉,拐点不可导。所以需要做特殊处理。 ReLU还有其他变型可参考: ReLU函数及变型.
二、卷积神经网络
1、卷积???卷个der
a 、卷积干什么
注:图片截自B站up主ELe实验室,讲课视频。 由上图可知通过卷积核卷积得出的结果可以将图像的特征提取出来上图卷积核所提取出来的特征为竖直特征。
b、怎么卷积
如图所示: 卷积就是用卷积核吧图像上的和卷积核上的数字相乘再相加。全部如此操作即可得出以下。(注:三维的数据通过三维的卷积核卷积出来的是一维的数据)
2、LeNet-5卷积神经网络结构(卷积核与通道数必须一致)
以上只是各个层的中文翻译,不完全是LeNet-5的真实模型。真实原始模型如下 :
由此图我们可以看出卷积神经网络包含的基本模块:卷积层 、池化层(下采样层)、全连接层。
a、卷积层
- 输入图片: 32*32
- 核大小: 5*5
- 核个数: 6
- 输出大小:(32-5+1)= 28
公式:
m
=
n
?
f
+
1
m = n - f + 1
m=n?f+1 (m 表示结果边长、n 表示原始边长、f 表示核边长)
b、池化层(下采样层)
池化层就是如上图所示的蓝色方框,对于方框内的数据进行处理(1.取方框内最大值 2. 取方框内平均值。等等等等…)
c、全连接层
将一系列卷积池化再卷积再池化后所得出的数据进行平铺后送入神经网络中进行学习,找出分类。
三、代码
from keras.datasets import mnist
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from numpy.core.fromnumeric import reshape
from tensorflow.keras.optimizers import SGD
import matplotlib.pyplot as plt
from tensorflow.keras.utils import to_categorical
from keras.layers import Conv2D
from keras.layers import AveragePooling2D
from keras.layers import Flatten
(X_train , Y_train),(X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(60000,28,28,1)/255.0
X_test = X_test.reshape(10000,28,28,1)/255.0
Y_train = to_categorical(Y_train,10)
Y_test = to_categorical(Y_test,10)
model = Sequential()
model.add(Conv2D(filters=6,kernel_size=(5,5),strides=(1,1),input_shape = (28,28,1),padding='valid',activation='relu'))
model.add(AveragePooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=16,kernel_size=(5,5),strides=(1,1),padding='valid',activation='relu'))
model.add(AveragePooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(units=120, activation='relu'))
model.add(Dense(units=84, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss= 'categorical_crossentropy' , optimizer=SGD(lr = 0.08), metrics=['accuracy'])
model.fit(X_train,Y_train,epochs=50,batch_size=128)
loss, accuracy = model.evaluate(X_test,Y_test)
print("loss"+str(loss))
print("accuracy"+str(accuracy))
分析:
1、 model.add(Conv2D(filters=6,kernel_size=(5,5),strides=(1,1),input_shape = (28,28,1),padding=‘valid’,activation=‘relu’))
filters: 卷积核数量 kernel_size: 卷积核尺寸 strides: 每次进行卷积后移动步长 input_shape: 输入图像尺寸(只需要在最开始输入数据时使用即可) padding: 填充模式(valid:不加填充模式) activation: 激活函数
2、model.add(Flatten()) 平铺数据变成一维数组
以上是B站ele实验室 上课学习笔记,大部分图片来自上课课件截图。
|