卷积神经网络基础
程序员文章站
2022-07-06 11:26:51
...
1.卷积神经网络
卷积神经网络是(卷积层+(可选)池化层)N+全连接层M
卷积层输入和输出都是矩阵,全连接是向量,所以最后需要展平。
全连接一定在后面,毕竟是一维,失去了维度信息。
可以用来分类和回归。
2.全卷积神经网络
卷积层+(可选)池化层)N+反卷积层K
可能输入和输出一样大–》做物体分割,判断像素点属于哪个物体
局部连接:图像具有区域性
参数共享:图像特征与位置无关
经过一次卷积,输出size = 输入size-卷积核size +1
但是,一直卷积,那深度卷积图像都没了,但是padding(补零)可以好一点
多通道图像:
所以不管我的图像几通道,输出图一定是单通道。
最大池化操作:用区域里最大值,步长为移动数,一般不补零,不重叠,没有用于求导得参数,用于减少图像尺寸,平移鲁棒性。
下面是代码层面:
其实与全连接代码只需要改动网络:
model = keras.models.Sequential()
# filter代表有多少个卷积核。kernelsize是核大小,padding是补零
model.add(keras.layers.Conv2D(
filters=32, kernel_size=3,
padding='same',
activation='relu',
input_shape=(28,28,1)
))
model.add(keras.layers.Conv2D(
filters=32, kernel_size=3,
padding='same',
activation='relu',
))
# 再添加一个pooling层,因为池化层步长和poolsize通常相等,所以设定一个就行
model.add(keras.layers.MaxPool2D(pool_size=2))
# 通常进行池化层后会对filter数目翻倍。因为池化后数据大量损失,翻倍filters来缓解,padding=same,输入输出尺寸不变
model.add(keras.layers.Conv2D(
filters=64, kernel_size=3,
padding='same',
activation='relu',
))
model.add(keras.layers.Conv2D(
filters=64, kernel_size=3,
padding='same',
activation='relu',
))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Conv2D(
filters=128, kernel_size=3,
padding='same',
activation='relu',
))
model.add(keras.layers.Conv2D(
filters=128, kernel_size=3,
padding='same',
activation='relu',
))
model.add(keras.layers.MaxPool2D(pool_size=2))
# 展平
model.add(keras.layers.Flatten())
# 连接全连接层
model.add(keras.layers.Dense(128,activation='relu'))
# 输出
model.add(keras.layers.Dense(10,activation="softmax"))
后面,我们使用selu代替relu作为**函数,结果发现训练曲线变得不那么陡峭,效果好很多!