NNDL作业5

作业一

  1. 图1使用卷积核 ( 1 − 1 ) \begin{pmatrix} 1 & -1 \end{pmatrix} (11),输出特征图
  2. 图1使用卷积核 ( 1 − 1 ) \begin{pmatrix} 1\\ -1\\ \end{pmatrix} (11),输出特征图
  3. 图2使用卷积核 ( 1 − 1 ) \begin{pmatrix} 1 & -1 \end{pmatrix} (11),输出特征图
  4. 图2使用卷积核 ( 1 − 1 ) \begin{pmatrix} 1\\ -1\\ \end{pmatrix} (11),输出特征图
  5. 图3使用卷积核 ( 1 − 1 ) \begin{pmatrix} 1 & -1 \end{pmatrix} (11) ( 1 − 1 ) \begin{pmatrix} 1\\ -1\\ \end{pmatrix} (11) ( 1 − 1 − 1 1 ) \begin{pmatrix} 1 &-1 \\ -1&1 \end{pmatrix} (1111) ,输出特征图
    使用单层的卷积网络的网络的结构
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函数不熟练

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值