python-卷积神经网络的学习

更新时间:2023-05-12 02:54:15 阅读: 评论:0

python-卷积神经⽹络的学习
⽬录
CNN学习第三天
由于很多知识都不了解,所以,我先⽤python写⼀写代码,了解⼀些CNN的内部原理。
我参考的博客是这篇:
⽤的编译环境是:python 3.9.1,pycharm community
开始敲代码。。。
import cv2
import matplotlib.pyplot as plt
然后⼀天就过去了……
总结:被matplotlib给玩弄了。。。好多依赖库没有下载成功导致⽆法运⾏。⼀整天都在进⾏下载库的操
作。最后还是把⾃⼰以前能够运⾏的代码⾥的库包的⽂件夹⼀个⼀个复制过来,才最终解决了下载库的问题。。。吐了。。
CNN学习第四天
终于搞定了BUG,开始敲代码
import cv2
import matplotlib.pyplot as plt
img_path ='./img/michi_1.jpg'# 图⽚的路径
bgr_img = cv2.imread(img_path)# 读取图⽚的BGR三个通道(注意顺序B\G\R),返回值是np.array()
gray_img = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)# 将BGR格式转换成灰度图⽚,转换的公式为 GRAY = B×0.114 + G×0.587 + R×0.299
gray_img = gray_img.astype("float32")/255# 使⽤plt绘制热图,需要⼆维数组的值标准化[0, 1]
plt.imshow(gray_img, cmap='gray')# 形成了灰⾊渐变的热图。注意区分plt.imshow()和cv2.imshow()
plt.show()
接着敲代码
import numpy as np
filter_vals = np.array([[-1,-1,1,1],[-1,-1,1,1],[-1,-1,1,1],[-1,-1,1,1]])
# 变化产⽣更丰富的过滤器
filter_1 = filter_vals
filter_2 =-filter_1
filter_3 = filter_1.T
filter_4 =-filter_3
filters = np.array([filter_1, filter_2, filter_3, filter_4])
fig = plt.figure(figsize=(10,5))
for i in range(4):
ax = fig.add_subplot(1,4, i+1, xticks=[], yticks=[])# 设置 1⾏4列,⼀列⼀个图像
ax.imshow(filters[i], cmap='gray')
ax.t_title('Filter %s'%str(i+1))# 设置图⽚标题
width, height = filters[i].shape
for x in range(width):
for y in range(height):
ax.annotate(str(filters[i][x][y]), xy=(y,x),
horizontalalignment='center',
verticalalignment='center',
color='white'if filters[i][x][y]<0el'black')
plt.show()
参考博客:
RGB 模式中,数值的取值范围是 0 ~ 255,如果超出这个范围就应该截断,所以我们需要优化下程序⼩于 0 时,像素值取 0,⼤于 255 时取 255,其它情况保持现值。
CNN学习第五天
开始变难了。。。
敲代码,⼀开始⼜是被导⼊库的问题绊住了。。
# ======= 定义简单卷积神经⽹络 ========
import torch
as nn
functional as F
"""
在定义⾃已的⽹络的时候,需要继承nn.Module类,
并重新实现构造函数__init__ 和 forward 这两个⽅法
"""
class Net(nn.Module):# ⾃定义⽹络层,继承nn.Module类
def__init__(lf, weight):# 申明各个层的定义,weight是卷积核(4,1,4,4)
"""
创建⼀个卷积神经⽹络
:param in_channels: 输⼊通道数量
:param out_channels: 输出通道数量
:param kernel_size: 卷积核的⼤⼩,类型为int或者元组
:param bias: 是否将⼀个学习到的 bias 增加输出中,默认是 True。
"""
super(Net, lf).__init__()# 调⽤⽗类的构造函数
k_height, k_width = weight.shape[2:]# 获得卷积核的⾼、宽
lf.pool = nn.MaxPool2d(kernel_size=4, stride=4)# 表⽰最⼤池化的窗⼝⼤⼩为4×4的正⽅形,步长是每次向右或者向下移动4步
def forward(lf, x):# 实现层之间的连接关系,实际上就是前向传播的过程
"""
前向传播函数
:param x:  输⼊,tensor 类型
:return: 返回结果
"""
conv_x = lf.conv(x)# 上⾯的nn.Conv2d,进⾏卷积操作后,conv_x -> (N, C, H, W)
activated_x = F.relu(conv_x)# relu: f(x) = max(0, x)
pooled_x = lf.pool(activated_x)# 池化
return conv_x, activated_x, pooled_x
weight = torch.from_numpy(filters).unsqueeze(1).type(torch.FloatTensor)# filters 的⼤⼩为 4 4 4, weight 的⼤⼩被增加为 4 1 4 4,  1的维度是针对输⼊的⼀个通道
model = Net(weight)
# 为 gray img 添加 1 个 batch 维度,以及 1 个 channel 维度,并转化为 tensor
gray_img_tensor = torch.from_numpy(gray_img).unsqueeze(0).unsqueeze(1)
conv_layer, activated_layer, pooled_layer = model(gray_img_tensor)
接着是卷积可视化
# ======= 可视化卷积输出 ========
def viz_layer(layer, n_filters=4):
fig = plt.figure(figsize=(20,20))
for i in range(n_filters):
ax = fig.add_subplot(1, n_filters, i +1, xticks=[], yticks=[])
ax.imshow(np.squeeze(layer[0, i].data.numpy()), cmap='gray')
ax.t_title('Output %s'%str(i +1))
# 输出原图
plt.imshow(gray_img, cmap='gray')
# 可视化卷积输出
viz_layer(conv_layer)
# 可视化卷积后激活函数后的输出
viz_layer(activated_layer)
plt.show()
新知识学习汇总
1、cv2
1.1 cv
2.imread()
img = cv.imread(filename[, flags])
1. 功能:这是中的处理图⽚的函数,使⽤时需 import cv2。读取的是图像的真实数据,读取通道的顺序为BGR(即使图⽚是RGBA四
通道,cv2.imread()⽅法仍然读取的是BGR三通道),可以操作图像每个元素。
2. filename:需要打开图⽚的路径,可以是绝对路径或者相对路径,路径中不能出现中⽂。
3. flag:图像的通道和⾊彩信息(默认值为1)
flag = -1,  8位深度,原通道
flag = 0,  8位深度,1通道
flag = 1,  8位深度,3通道
flag = 2,原深度, 1通道
flag = 3,原深度, 3通道
flag = 4,  8位深度,3通道
cv2.IMREAD_COLOR:默认参数,读⼊⼀副彩⾊图⽚,忽略alpha通道
cv2.IMREAD_GRAYSCALE:读⼊灰度图⽚
cv2.IMREAD_UNCHANGED:顾名思义,读⼊完整图⽚,包括alpha通道
4. 返回值img:数据类型是np.array()类型。
参考博客:、
1.2 cv
2.cvtColor(p1,p2)
cv2.imread()接⼝读图像,读进来直接是BGR 格式,数据格式在 0~255,由于不是我们最常见的RGB格式,颜⾊肯定有区别。
cv2.cvtColor(p1,p2) 是颜⾊空间转换函数,p1是需要转换的图⽚,p2是转换成何种格式。
cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图⽚
参考博客:
具体转换的算法参考
1.3 cv
2.imshow(wname,img)
第⼀个参数是显⽰图像的窗⼝的名字;
第⼆个参数是要显⽰的图像(imread读⼊的图像),窗⼝⼤⼩⾃动调整为图⽚⼤⼩
⽐较:plt.imshow()
在中,imshow⽅法⾸先将⼆维数组的值标准化为0到1之间的值,然后根据指定的渐变⾊依次赋予每个单元格对应的颜⾊,就形成了热图。imshow⽅法常⽤的⼏个参数如下
1. cmap
cmap是colormap的简称,⽤于指定渐变⾊,默认的值为viridis, 在matplotlib中,内置了⼀系列的渐变⾊,⽤法如下
plt.imshow(data, cmap='Greens')
参考博客:
2、
使⽤Module类来⾃定义⽹络层,在__init__构造函数中申明各个层的定义,在forward中实现层之间的连接关系,实际上就是前向传播的过程。
①我们在定义⾃已的⽹络的时候,需要继承nn.Module类,并重新实现构造函数__init__和forward这两个⽅法。
(1)⼀般把⽹络中具有可学习参数的层(如全连接层、卷积层等)放在构造函数_init_()中,当然我也可以吧不具有参数的层也放在⾥⾯;
(2)⼀般把不具有可学习参数的层(如ReLU、dropout、BatchNormanation层)可放在构造函数中,也可不放在构造函数中,如果不放在构造函数__init__⾥⾯,则在forward⽅法⾥⾯可以使⽤nn.functional来代替
(3)forward⽅法是必须要重写的,它是实现模型的功能,实现各个层之间的连接关系的核⼼。
参考博客:、
2.Conv2d()
①⽤法
Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=True,padding_mode=‘zero s’)
②参数
in_channels:输⼊的通道数⽬ 【必选】
out_channels: 输出的通道数⽬ 【必选】
kernel_size:卷积核的⼤⼩,类型为int 或者元组,当卷积是⽅形的时候,只需要⼀个整数边长即可,卷积不是⽅形,要输⼊⼀个元组表⽰ ⾼和宽。【必选】
stride: 卷积每次滑动的步长为多少,默认是 1 【可选】
padding: 设置在所有边界增加 值为 0 的边距的⼤⼩(也就是在feature map 外围增加⼏圈 0 ),例如当 padding =1 的时候,如果原来⼤⼩为 3 × 3 ,那么之后的⼤⼩为 5 × 5 。即在外围加了⼀圈 0 。【可选】
dilation:控制卷积核之间的间距【可选】
groups:控制输⼊和输出之间的连接。(不常⽤)【可选】
bias: 是否将⼀个 学习到的 bias 增加输出中,默认是 True 。【可选】
padding_mode : 字符串类型,接收的字符串只有 “zeros” 和 “circular”。【可选】
注意:参数 kernel_size,stride,padding,dilation 都可以是⼀个整数或者是⼀个元组,⼀个值的情况将会同时作⽤于⾼和宽 两个维度,两个值的元组情况代表分别作⽤于 ⾼ 和 宽 维度。
参考博客:、
③计算原理
(N, Cin, H, W)表⽰N(batch size)张图⽚,Cin个输⼊通道,H⾏,W列。
四个参数分别表⽰ (batch_size, C_in, H_in, W_in)
分别对应,批处理⼤⼩,输⼊通道数,图像⾼度(像素),图像宽度(像素)

本文发布于:2023-05-12 02:54:15,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/593810.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:卷积   通道   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图