第10节卷积神经网络CNN及其numpy复现
2023-04-18 16:57:21 时间
文章目录
引子
- BP算法容易陷入局部最优,其次BP的图像不能直接输入到网络中.
- 梯度消失,BP仅仅适用于3层以内,多层了容易出现梯度消失.
- 猫眼睛具有局部感受野,其次大脑皮层具有分层处理.
- Hinton教授提出
- 具有多个隐含层的神经网络具有更好的特征学习能力,每一层特征的抽取都是前一层的抽象,学习到的特征能更好的刻画数据.也恰恰符合生物大脑的认知.
- 通过逐层初始化的逐层预训练,可以找到一个接近最优的神经网络的权值,然后通过微调对整个网络进行优化训练,从而大幅减少训练多层神经网络所需要的时间.
CNN基础
- 卷积神经网络包含了由卷积层和子采样层构成的特征抽取器.一个卷积层包含若干个特征平面(featureMap)每个特征平面由一些矩形排列的神经元组成.统一特征平面的神经元共享权值.共享权值就是卷积核.
- 卷积核的作用是减少网络各个层之间的连接,同事降低了过拟合的风险.子采样也叫池化,通常有均值采样和最大值采样.
- 卷积网络:输入层+n个卷积层和池化层组成+全连接的感知机
局部感知野
- 图像像素之间是邻近像素相关性比较大,越远的像素相关性越小.
- 每个神经元都对局部进行感知,然后更高层对局部信息增和起来得到全局信息.
卷积操作
- 卷积计算就是利用卷积核对相邻的像素点进行加权求和的过程.然后用relu函数进行激活操作.
- 权值相同即权值共享,以及多卷积核.
pooling池化层
池化:对不同位置的特征进行聚合统计称为池化.目的就是减少特征,降低了信息输出的维度.
- 子采样有两种方式,一种是均值采样(mean-pooling)一种是最大值子采样(max-pooling)
- 均值子采样的卷积核中每个权重都是0.25,卷积核在原图inputX上的滑动的步长为2。均值子采样的效果相当于把原图模糊缩减至原来的1/4。
- 最大值子采样的卷积核中各权重值中只有一个为1,其余均为0,卷积核中为1的位置对应inputX被卷积核覆盖部分值最大的位置。卷积核在原图inputX上的滑动步长为2。最大值子采样的效果是把原图缩减至原来的1/4,并保留每个2*2区域的最强输入。实现了非线性映射
- 多卷积的目的:单卷积学习到的往往是局部的,层数越高,学到的特征就月全局化.
全连接层与分类层
- 卷积relu+pooling+卷积relu+几层全连接+ 分类
numpycnn实现
import skimage.data
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import numpycnn
# 读取图像
img = skimage.data.chelsea()
# 转成灰度图像
img = skimage.color.rgb2gray(img)
# 初始化卷积核
l1_filter = np.zeros((2, 3, 3))
# 检测垂直边缘
l1_filter[0, :, :] = np.array([[[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]]])
# 检测水平边缘
l1_filter[1, :, :] = np.array([[[1, 1, 1], [0, 0, 0], [-1, -1, -1]]])
"""
第一个卷积层
"""
# 卷积操作
l1_feature_map = numpycnn.conv(img, l1_filter)
# ReLU
l1_feature_map_relu = numpycnn.relu(l1_feature_map)
# Pooling
l1_feature_map_relu_pool = numpycnn.pooling(l1_feature_map_relu, 2, 2)
"""
第二个卷积层
"""
# 初始化卷积核
l2_filter = np.random.rand(3, 5, 5, l1_feature_map_relu_pool.shape[-1])
# 卷积操作
l2_feature_map = numpycnn.conv(l1_feature_map_relu_pool, l2_filter)
# ReLU
l2_feature_map_relu = numpycnn.relu(l2_feature_map)
# Pooling
l2_feature_map_relu_pool = numpycnn.pooling(l2_feature_map_relu, 2, 2)
"""
第三个卷积层
"""
# 初始化卷积核
l3_filter = np.random.rand(1, 7, 7, l2_feature_map_relu_pool.shape[-1])
# 卷积操作
l3_feature_map = numpycnn.conv(l2_feature_map_relu_pool, l3_filter)
# ReLU
l3_feature_map_relu = numpycnn.relu(l3_feature_map)
# Pooling
l3_feature_map_relu_pool = numpycnn.pooling(l3_feature_map_relu, 2, 2)
"""
结果可视化
"""
fig0, ax0 = plt.subplots(nrows=1, ncols=1)
ax0.imshow(img).set_cmap("gray")
ax0.set_title("Input Image")
ax0.get_xaxis().set_ticks([])
ax0.get_yaxis().set_ticks([])
plt.show()
plt.savefig("in_img1.png", bbox_inches="tight")
plt.close(fig0)
# 第一层
fig1, ax1 = plt.subplots(nrows=3, ncols=2)
ax1[0, 0].imshow(l1_feature_map[:, :, 0]).set_cmap("gray")
ax1[0, 0].get_xaxis().set_ticks([])
ax1[0, 0].get_yaxis().set_ticks([])
ax1[0, 0].set_title("L1-Map1")
ax1[0, 1].imshow(l1_feature_map[:, :, 1]).set_cmap("gray")
ax1[0, 1].get_xaxis().set_ticks([])
ax1[0, 1].get_yaxis().set_ticks([])
ax1[0, 1].set_title("L1-Map2")
ax1[1, 0].imshow(l1_feature_map_relu[:, :, 0]).set_cmap("gray")
ax1[1, 0].get_xaxis().set_ticks([])
ax1[1, 0].get_yaxis().set_ticks([])
ax1[1, 0].set_title("L1-Map1ReLU")
ax1[1, 1].imshow(l1_feature_map_relu[:, :, 1]).set_cmap("gray")
ax1[1, 1].get_xaxis().set_ticks([])
ax1[1, 1].get_yaxis().set_ticks([])
ax1[1, 1].set_title("L1-Map2ReLU")
ax1[2, 0].imshow(l1_feature_map_relu_pool[:, :, 0]).set_cmap("gray")
ax1[2, 0].get_xaxis().set_ticks([])
ax1[2, 0].get_yaxis().set_ticks([])
ax1[2, 0].set_title("L1-Map1ReLUPool")
ax1[2, 1].imshow(l1_feature_map_relu_pool[:, :, 1]).set_cmap("gray")
ax1[2, 0].get_xaxis().set_ticks([])
ax1[2, 0].get_yaxis().set_ticks([])
ax1[2, 1].set_title("L1-Map2ReLUPool")
plt.show()
plt.savefig("L1.png", bbox_inches="tight")
plt.close(fig1)
# 第二层
fig2, ax2 = plt.subplots(nrows=3, ncols=3)
ax2[0, 0].imshow(l2_feature_map[:, :, 0]).set_cmap("gray")
ax2[0, 0].get_xaxis().set_ticks([])
ax2[0, 0].get_yaxis().set_ticks([])
ax2[0, 0].set_title("L2-Map1")
ax2[0, 1].imshow(l2_feature_map[:, :, 1]).set_cmap("gray")
ax2[0, 1].get_xaxis().set_ticks([])
ax2[0, 1].get_yaxis().set_ticks([])
ax2[0, 1].set_title("L2-Map2")
ax2[0, 2].imshow(l2_feature_map[:, :, 2]).set_cmap("gray")
ax2[0, 2].get_xaxis().set_ticks([])
ax2[0, 2].get_yaxis().set_ticks([])
ax2[0, 2].set_title("L2-Map3")
ax2[1, 0].imshow(l2_feature_map_relu[:, :, 0]).set_cmap("gray")
ax2[1, 0].get_xaxis().set_ticks([])
ax2[1, 0].get_yaxis().set_ticks([])
ax2[1, 0].set_title("L2-Map1ReLU")
ax2[1, 1].imshow(l2_feature_map_relu[:, :, 1]).set_cmap("gray")
ax2[1, 1].get_xaxis().set_ticks([])
ax2[1, 1].get_yaxis().set_ticks([])
ax2[1, 1].set_title("L2-Map2ReLU")
ax2[1, 2].imshow(l2_feature_map_relu[:, :, 2]).set_cmap("gray")
ax2[1, 2].get_xaxis().set_ticks([])
ax2[1, 2].get_yaxis().set_ticks([])
ax2[1, 2].set_title("L2-Map3ReLU")
ax2[2, 0].imshow(l2_feature_map_relu_pool[:, :, 0]).set_cmap("gray")
ax2[2, 0].get_xaxis().set_ticks([])
ax2[2, 0].get_yaxis().set_ticks([])
ax2[2, 0].set_title("L2-Map1ReLUPool")
ax2[2, 1].imshow(l2_feature_map_relu_pool[:, :, 1]).set_cmap("gray")
ax2[2, 1].get_xaxis().set_ticks([])
ax2[2, 1].get_yaxis().set_ticks([])
ax2[2, 1].set_title("L2-Map2ReLUPool")
ax2[2, 2].imshow(l2_feature_map_relu_pool[:, :, 2]).set_cmap("gray")
ax2[2, 2].get_xaxis().set_ticks([])
ax2[2, 2].get_yaxis().set_ticks([])
ax2[2, 2].set_title("L2-Map3ReLUPool")
plt.show()
plt.savefig("L2.png", bbox_inches="tight")
plt.close(fig2)
# 第三层
fig3, ax3 = plt.subplots(nrows=1, ncols=3)
ax3[0].imshow(l3_feature_map[:, :, 0]).set_cmap("gray")
ax3[0].get_xaxis().set_ticks([])
ax3[0].get_yaxis().set_ticks([])
ax3[0].set_title("L3-Map1")
ax3[1].imshow(l3_feature_map_relu[:, :, 0]).set_cmap("gray")
ax3[1].get_xaxis().set_ticks([])
ax3[1].get_yaxis().set_ticks([])
ax3[1].set_title("L3-Map1ReLU")
ax3[2].imshow(l3_feature_map_relu_pool[:, :, 0]).set_cmap("gray")
ax3[2].get_xaxis().set_ticks([])
ax3[2].get_yaxis().set_ticks([])
ax3[2].set_title("L3-Map1ReLUPool")
plt.show()
plt.savefig("L3.png", bbox_inches="tight")
plt.close(fig3)
相关文章
- (数据科学学习手札141)利用Learn Git Branching轻松学习git常用操作
- 8条github使用小技巧
- 在jupyterlab中实现实时协同功能
- 这个好玩又实用的jupyter插件我真的爱了
- 盘点2021最佳数据可视化项目
- scikit-learn 1.0 版本新特性及变动前瞻性预览
- 这款拓展让你的jupyter lab更高效
- 用了这个jupyter插件,我已经半个月没打开过excel了
- Conda太慢?试试这个加速工具!
- jupyter lab最强代码补全插件
- 轻松解决Github连接缓慢、图裂问题
- (数据科学学习手札67)使用Git管理Github仓库
- (数据科学学习手札66)在ubuntu服务器上部署shiny
- 怎么更改jupyter打开的网页?
- aix系统vim如何删除字符?
- centos vim不能用
- centos vim怎么编辑文件内容?
- 装完jupyter打开不开网页
- 怎么配置spyder开发环境?
- 64位系统能用32位的eclipse吗?