作业一
- 图1使用卷积核 ( 1 − 1 ) \begin{pmatrix} 1 & -1 \end{pmatrix} (1−1),输出特征图
- 图1使用卷积核 ( 1 − 1 ) \begin{pmatrix} 1\\ -1\\ \end{pmatrix} (1−1),输出特征图
- 图2使用卷积核 ( 1 − 1 ) \begin{pmatrix} 1 & -1 \end{pmatrix} (1−1),输出特征图
- 图2使用卷积核 ( 1 − 1 ) \begin{pmatrix} 1\\ -1\\ \end{pmatrix} (1−1),输出特征图
- 图3使用卷积核
(
1
−
1
)
\begin{pmatrix} 1 & -1 \end{pmatrix}
(1−1),
(
1
−
1
)
\begin{pmatrix} 1\\ -1\\ \end{pmatrix}
(1−1),
(
1
−
1
−
1
1
)
\begin{pmatrix} 1 &-1 \\ -1&1 \end{pmatrix}
(1−1−11) ,输出特征图
使用单层的卷积网络的网络的结构
import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F
import numpy as np
#确定卷积网络
class MyNet(torch.nn.Module):
def __init__(self,kernel):
super().__init__()
self.weight = torch.nn.Parameter(data=kernel, requires_grad=False)
def forward(self, picture):
picture = F.conv2d(picture,self.weight,stride=1,padding=0)
return picture
图像创建的维数对应的变换的函数
def create_pic(kernel,picture):
#将kernel和picture都添加两层
kernel=torch.unsqueeze(kernel,0)
kernel=torch.unsqueeze(kernel,0)
#print(kernel.shape)
picture=torch.unsqueeze(picture, 0)
picture=torch.unsqueeze(picture, 0)
#print(picture.shape)
model = MyNet(kernel=kernel)
output =model(picture)
#将四维的张量降到两维
output=torch.squeeze(output)
#画图
plt.imshow(output,cmap='gray')
plt.show()
图片和卷积核的输入:
#生成图片
def create_pic1():
picture = torch.Tensor([[0,0,0,0,255,255,255,255],
[0,0,0,0,255,255,255,255],
[0,0,0,0,255,255,255,255],
[0,0,0,0,255,255,255,255]])
return picture
def create_pic2():
picture = torch.Tensor([[0,0,0,0,255,255,255,255],
[0,0,0,0,255,255,255,255],
[0,0,0,0,255,255,255,255],
[255,255,255,255,0,0,0,0],
[255,255,255,255,0,0,0,0],
[255,255,255,255,0,0,0,0]])
return picture
def create_pic3():
picture = torch.Tensor(
[[255,255,255,255,255,255,255,255,255],
[255,0 ,255,255,255,255,255,0 ,255],
[255,255,0 ,255,255,255,0 ,255,255],
[255,255,255,0 ,255,0 ,255,255,255],
[255,255,255,255,0 ,255,255,255,255],
[255,255,255,0 ,255,0 ,255,255,255],
[255,255,0 ,255,255,255,0 ,255,255],
[255,0 ,255,255,255,255,255,0 ,255],
[255,255,255,255,255,255,255,255,255],])
return picture
#确定卷积层
kernel1 = torch.tensor([[1.0,-1.0]])
kernel2 = torch.tensor([[ 1.0],
[-1.0]])
kernel3 = torch.tensor([[1.0,-1.0],
[-1.0,1.0]])
画图代码:
picture1=create_pic1()
picture2=create_pic2()
picture3=create_pic3()
create_pic(kernel1,picture1)
create_pic(kernel2,picture1)
create_pic(kernel1,picture2)
create_pic(kernel1,picture2)
create_pic(kernel1,picture3)
create_pic(kernel2,picture3)
create_pic(kernel3,picture3)
结果:
作业二
一.概念
用自己的语言描述“卷积、卷积核、特征图、特征选择、步长、填充、感受野”。
卷积:对应元素的张量乘法
卷积核:其实就是其中的一个张量,通常尺寸比较小,在整个卷积过程中相当于使用原张量的位置信息和数字信息的一种变换,而变换的结果和原张量有简单的尺寸变化
特征图:就是卷积的结果,体现出了卷积和原张量数据的作用的特征。
特征选择:选择不同的卷积核用来对原图像进行不同特征提取的过程,选择合适的特征能够更好地表现图像的特点
步长:卷积核每次计算卷积距离上一次计算在图像上下移动的像素值
填充:在图片的边缘填充0或者1为了避免边缘位置的像素的特征提取不充分和维持输入输出图像大小作用的方法。
感受野:与后层神经元关联的前层神经元的大小
二.探究不同卷积核的作用
原图
各种卷积核,比如模糊
突出层次:
突出边缘:
其实作用是最后我们在多层使用网络之后是不是能够得到很好的结果
im = Image.open(r'C:\Users\money\Desktop\无用图片\QQ图片20220625224850正方形.jpg').convert('L') # 读入一张灰度图的图片
im = np.array(im, dtype='float32') # 将其转换为一个矩阵
im = torch.from_numpy(im)
kernel1 = torch.tensor([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]], dtype=torch.float32)
kernel2 = torch.tensor([[0.0625, 0.125, 0.0625],
[0.125, 0.25, 0.125],
[0.0625, 0.125, 0.0625]], dtype=torch.float32)
kernel3 = torch.tensor([[0, -1, 0],
[-1, 5 ,-1],
[-1, 5, -1]], dtype=torch.float32) # 定义锐化
kernel4 = torch.tensor([[1/9, 1/9, 1/9],
[1/9, 9, 1/9],
[1/9, 1/9, 1/9]], dtype=torch.float32) # 均值卷积核
kernel5 = torch.tensor([[1/16,2/16,1/16],
[2/16,4/16,2/16],
[1/16,2/16,1/16]], dtype=torch.float32)
#print(im.shape[0],im.shape[1]) 448*448
# 可视化图片
ke_list=[kernel1,kernel2,kernel3,kernel4,kernel5]
for ii in ke_list:
create_pic(ii,im)
总结:
没写卷积的底层代码,用现成的函数,最好自己实现以下,使用conv2d函数不熟练