当前位置: 首页 > article >正文

12.02 深度学习-卷积

# 卷积 是用于图像处理 能够保存图像的一些特征 卷积层 如果用全连接神经网络处理图像 计算价格太大了 图像也被转为线性的对象导致失去了图像的空间特征 只有在卷积神经网络cnn的最后一层使用全连接神经网络

# 图像处理的三大任务

# 目标检测 对图像中的目标进行框出来

# 图像分割

# 图像分类

# 卷积核的参数是要变的 这个值有个最优解 线性回归求这个最优解

# 卷积的计算 先卷再积 卷 左右上下移动 积 对应位置矩阵 对应位置相乘再相加 最后得到一个特征矩阵跟卷积结果一样的size

# import os

# current_path=os.path.dirname(__file__) #  将脚本文件所在的目录路径赋值给变量 current_path, 所在文件夹路径

# path2=os.path.relpath(路径1) # 获取路径1 文件到当前文件的相对路径

# 在神经网络中加入卷积层 为卷积神经网络 cnn

# cv2读 图像 然后 torch创建卷积核

import os

import cv2

from torch import nn

import torch

import torch.nn.functional as F

import matplotlib.pyplot as plt

def demo1():

    path="assets/1.png"

    # print(path)

    # 读取图像

    img=cv2.imread(path)

    # 创建卷积核 一个卷积核就是卷积层

    conv=nn.Conv2d(in_channels=3,out_channels=1,kernel_size=3,stride=1,padding=0)  # 传入输入图像的通道数 和输出的特征图数量 卷积核大小   步长(卷积核移动的规格) 填充

    # 这个会自动初始化一个卷积和的参数

    # conv(图像tensor数组) 传入图像进行卷积 得到特征图 tensor 的应该为 n,c,h,w 或者c,h,w

    # 传入图像的通道数应该跟in_channels一致 且数据类型为tensor.float

    # 转为tensor,并归一化到[0, 1]  

    img = torch.tensor(img, dtype=torch.float32) / 255.0

   

    # 转换维度

    img=img.permute(2,0,1).unsqueeze(0)

    # print(img.shape)        

    # 卷积

    img=conv(img) # 卷积操作的tensor 必须为float

    # print(img.shape)

    # 用 plt 显示出来

    plt.imshow(img[0][0].detach().numpy(),cmap="gray")

    plt.show()

    pass

def demo2():

    # 一个四通道的图像 通过卷积核处理 这个卷积核应该也有四个通道 对应处理rgba 也可以说是4个卷积核吧 然后 每个通道进行卷积 然后加起来 为一个特征图 输出多个特征图 就要有多个卷积核每个卷积核参数不一样

    # 然后再卷积的话 上面输出的特征图数量就会被下一个卷积和当做通道

    # 如果 一个四通道的卷积核 核大小为3 且有偏置 如果输出32和特征图 那么有 32*4*3*3+32 个参数 特征图数量*每个卷积核的通道数 *卷积核的规格 +偏置数 每一个卷积核对应1个偏置

    # 输出多个特征图 后面每一个特征图 对图像注意的地方不同

    # 边缘填充: 通过上面的卷积计算,我们发现最终的特征图比原始图像要小,如果想要保持图像大小不变, 可在原图周围添加padding来实现。更重要的,边缘填充还更好的保护了图像边缘数据的特征。

    # 让边缘的数据利用更充分 在原图上进行边缘填充

   

    # 卷积结果 特征图的大小的计算 (W-F+2P) / S +1  W:图像的大小 W*W 卷积核大小F*F 边缘填充 P 步长:S 宽高不一样就各自算各自的 宽高 都带一遍公式


 

    pass

# 构建卷积神经网络

def demo3():

    class MyNet(nn.Module):

        def __init__(self, *args, **kwargs):

            super().__init__(*args, **kwargs)

            # 卷积层

            self.conv1=nn.Conv2d(in_channels=1,out_channels=32,kernel_size=3,stride=1,padding=0)

            self.conv2=nn.Conv2d(in_channels=32,out_channels=128,kernel_size=3,stride=1,padding=0)

            self.conv3=nn.Conv2d(in_channels=128,out_channels=512,kernel_size=3,stride=1,padding=0)

            # 线性层 线性层的输入是 特征的数量 特征的总数量是不是 图片数乘图片规格 表示每一个特征图的每个点啊

            self.fc=nn.Linear(512*26*26,10)

        # 前向传播

        def forward(self,x):

            # 每一层用激活函数激活

            x=F.relu(self.conv1(x))

            x=F.relu(self.conv2(x))

            x=F.relu(self.conv3(x))

            # 线性层全连接输出 先展平为2维 因为线性层输入是一个二维的矩阵

            x=x.view(x.shape[0],-1) # x.size(0):这部分获取x的第0维的大小。在PyTorch中,张量的维度通常按照以下顺序表示

            # x.view(x.size(0),-1):这个操作将x重塑为一个新的形状,其中第0维(batch_size)保持不变,而其他维度被“展平”(flattened)为一个长向量。这是在很多神经网络架构中常见的操作,

            # 特别是在将卷积层的输出传递给全连接层(fully connected layer)之前。因为全连接层期望的输入是一个二维张量,其中第一维是批次大小,第二维是每个样本的特征数量。

            return F.softmax(self.fc(x))

    net1=MyNet()

    input=torch.randn(4,1,32,32,dtype=torch.float32)

    output=net1.forward(input)

    print(output)

# 卷积参数共享

# 卷积神经网络只考虑卷积核的参数 以卷积核为单位 全链接 以每一个节点为单位而且还要与上层全链接 参数个数直接爆炸          

# 卷积就是把这些数据放到多个维度上单维度的数量就少了

if __name__=="__main__":

    # demo1()

    # demo2()

    demo3()

    pass


http://www.kler.cn/a/420890.html

相关文章:

  • 【算法】【优选算法】位运算(下)
  • STM32 PWM波形详细图解
  • 构建自己的docker的ftp镜像
  • 攻防世界-fileclude-文件包含
  • 华为HarmonyOS 让应用快速拥有账号能力 -- 2 获取用户头像昵称
  • 为什么编程语言会设计不可变的对象?字符串不可变?NSString *s = @“hello“变量s是不可变的吗?Rust内部可变性的意义?
  • 东方隐侠网安瞭望台第8期
  • 手游手游手游手游手游手游手游
  • c语言基础之二维数组
  • node.js基础学习-fs模块-文件操作(六)
  • 深度学习常用测试命令解释
  • 数据分析:探索数据背后的秘密与挑战
  • 3d/伪3d统计图形
  • ISO26262-(Timing Monitoring)在多核MCU的TPU上功能安全ASILB与ASILD有什么区别
  • MacOS 命令行详解使用教程
  • LlaSMol—— 建立一个大型、高质量的指令调整数据集 SMolInstruct 用于开发一个化学任务的大语言模型
  • Flink面试题推荐
  • Springboot(四十九)SpringBoot3整合jetcache缓存
  • 微软的重大突破:bitnet.cpp 开启 AI 本地CPU运行新时代
  • 【机器学习】Sigmoid函数在深层神经网络中存在梯度消失问题,如何设计一种改进的Sigmoid激活函数,既能保持其概率预测优势,又能避免梯度消失?
  • Linux 系统中常用的命令
  • scroll-view组件,在iOS设备上禁用橡皮筋回弹效果
  • VTK知识学习(16)- 基本数据结构之单元类型
  • React进阶面试题(四)
  • Unity中,Canva的三种渲染模式
  • 数字与字母互换python