机器学习——卷积神经网络

卷积神经网络CNN

多层感知机MLP的层数足够,理论上可以用其提取出二位特征,但是毕竟复杂,卷积神经网络就可以更合适的来提取高维的特征。
而卷积其实是一种运算
在这里插入图片描述
二维离散卷积的公式
在这里插入图片描述
可以看成g是一个图像的像素点,f是每个像素点对应的权重,权重越大,重要程度越大,这里的权重f可以根据梯度反向传播的方式训练
在CNN中进行卷积运算的层称为卷积层,层中的权重f被称为卷积核
如果将f进行翻转,得到的参数在位置上是翻转的,对参数数值没有影响。这样的运算称为互相关。

卷积的运算例子

在这里插入图片描述

用卷积神经网络完成图像分类任务

class CNN(nn.Module):def __init__(self, num_classes=10):super().__init__()# 类别数目self.num_classes = num_classes# Conv2D为二维卷积层,参数依次为# in_channels:输入通道# out_channels:输出通道,即卷积核个数# kernel_size:卷积核大小,默认为正方形# padding:填充层数,padding=1表示对输入四周各填充一层,默认填充0self.conv1 = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1)# 第二层卷积,输入通道与上一层的输出通道保持一致self.conv2 = nn.Conv2d(32, 32, 3, padding=1)# 最大池化,kernel_size表示窗口大小,默认为正方形self.pooling1 = nn.MaxPool2d(kernel_size=2)# 丢弃层,p表示每个位置被置为0的概率# 随机丢弃只在训练时开启,在测试时应当关闭self.dropout1 = nn.Dropout(p=0.25)self.conv3 = nn.Conv2d(32, 64, 3, padding=1)self.conv4 = nn.Conv2d(64, 64, 3, padding=1)self.pooling2 = nn.MaxPool2d(2)self.dropout2 = nn.Dropout(0.25)# 全连接层,输入维度4096=64*8*8,与上一层的输出一致self.fc1 = nn.Linear(4096, 512)self.dropout3 = nn.Dropout(0.5)self.fc2 = nn.Linear(512, num_classes)# 前向传播,将输入按顺序依次通过设置好的层def forward(self, x):x = F.relu(self.conv1(x))x = F.relu(self.conv2(x))x = self.pooling1(x)x = self.dropout1(x)x = F.relu(self.conv3(x))x = F.relu(self.conv4(x))x = self.pooling2(x)x = self.dropout2(x)# 全连接层之前,将x的形状转为 (batch_size, n)x = x.view(len(x), -1)x = F.relu(self.fc1(x))x = self.dropout3(x)x = self.fc2(x)return x
#%%
batch_size = 64 # 批量大小
learning_rate = 1e-3 # 学习率
epochs = 5 # 训练轮数
np.random.seed(0)
torch.manual_seed(0)# 批量生成器
trainloader = DataLoader(trainset, batch_size=batch_size, shuffle=True)
testloader = DataLoader(testset, batch_size=batch_size, shuffle=False)model = CNN()
# 使用Adam优化器
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
# 使用交叉熵损失
criterion = F.cross_entropy# 开始训练
for epoch in range(epochs):losses = 0accs = 0num = 0model.train() # 将模型设置为训练模式,开启dropoutwith tqdm(trainloader) as pbar:for data in pbar:images, labels = dataoutputs = model(images) # 获取输出loss = criterion(outputs, labels) # 计算损失# 优化optimizer.zero_grad()loss.backward()optimizer.step()# 累积损失num += len(labels)losses += loss.detach().numpy() * len(labels)# 精确度accs += (torch.argmax(outputs, dim=-1) \== labels).sum().detach().numpy()pbar.set_postfix({'Epoch': epoch, 'Train loss': f'{losses / num:.3f}', 'Train acc': f'{accs / num:.3f}'})# 计算模型在测试集上的表现losses = 0accs = 0num = 0model.eval() # 将模型设置为评估模式,关闭dropoutwith tqdm(testloader) as pbar:for data in pbar:images, labels = dataoutputs = model(images)loss = criterion(outputs, labels)num += len(labels)losses += loss.detach().numpy() * len(labels)accs += (torch.argmax(outputs, dim=-1) \== labels).sum().detach().numpy()pbar.set_postfix({'Epoch': epoch, 'Test loss': f'{losses / num:.3f}', 'Test acc': f'{accs / num:.3f}'})
# 该工具包中有AlexNet、VGG等多种训练好的CNN网络
from torchvision import models 
import copy# 定义图像处理方法
transform = transforms.Resize([512, 512]) # 规整图像形状def loadimg(path):  # 加载路径为path的图像,形状为H*W*Cimg = plt.imread(path)# 处理图像,注意重排维度使通道维在最前img = transform(torch.tensor(img).permute(2, 0, 1))# 展示图像plt.imshow(img.permute(1, 2, 0).numpy())plt.show()# 添加batch size维度img = img.unsqueeze(0).to(dtype=torch.float32)img /= 255 # 将其值从0-255的整数转换为0-1的浮点数return imgcontent_image_path = os.path.join('style_transfer', 'content', '04.jpg')
style_image_path = os.path.join('style_transfer', 'style.jpg')# 加载内容图像
print('内容图像')
content_img = loadimg(content_image_path)
# 加载风格图像
print('风格图像') 
style_img = loadimg(style_image_path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/25289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024前端面试准备4-Vue相关

Vue2.0 1. 双向绑定原理 Vue是采用数据劫持发布订阅模式的方式,通过Object.defienProperty()来劫持各个属性的setter\getter,在数据发送变动时发布消息给订阅者,触发相应的监听回调。主要分为以下几个步骤: observe的数据对象进行递归遍历&a…

正态分布公式

正态分布(也称为高斯分布)的概率密度函数(PDF)公式如下: 对于均值为 (\mu) ,标准差为 (\sigma) 的正态分布,其概率密度函数为: f ( x ) 1 2 π σ 2 e − ( x − μ ) 2 2 σ 2 f(…

【计网复习】应用层总结(不含HTTP和错题重点解析)

应用层总结(不含HTTP和错题重点解析) 应用层简介 应用层的主要功能常见的应用层协议小林对于应用层通常的解释 网络应用模型 客户端-服务器模型(Client-Server Model, C/S) 特点优点缺点应用场景 对等网络模型(Peer-to…

算法 | 用贪心求解背包动态规划、回溯、分支限界法求解0-1背包

背包问题 普通背包: 贪心时间复杂度:O(nlogn) 首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心 选择策略,将尽可能多的单位重量价值最高的物品装入背包。若 将这种物品全部装入背包后,背包内的物品总重量未超过C&a…

IO流字符流(FileReader与FileWriter)

目录 FileReader 空参read方法 带参read方法👇 FileWriter void write(intc) 写出一个字符 void write(string str) 写出一个字符串 void write(string str,int off,int len) 写出一个字符串的一部分 void write(char[] cbuf) …

Web前端伯乐在线:探索技术的深度与广度

Web前端伯乐在线:探索技术的深度与广度 在浩瀚的互联网海洋中,Web前端技术犹如一艘航行在波涛汹涌的海洋中的巨轮,承载着无数的创新与可能。而在这个领域里,伯乐在线就像一座灯塔,照亮着前行者的道路,引领…

备战 清华大学 上机编程考试-冲刺前50%,倒数第5天

T1:多项式求和 小K最近刚刚习得了一种非常酷炫的多项式求和技巧,可以对某几类特殊的多项式进行运算。非常不幸的是,小K发现老师在布置作业时抄错了数据,导致一道题并不能用刚学的方法来解,于是希望你能帮忙写一个程序…

C语言 树与二叉树基础部分

树与二叉树基础部分 树的基础概念二叉树的性质二叉树的遍历前序遍历中序遍历后序遍历层序遍历根据遍历结果恢复二叉树 二叉树的创建第一种第二种 二叉树的其他典型操作查找指定元素(一般二叉树)二叉树的高度(深度)二叉树的拷贝二叉…

!力扣102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] /*** Definition for…

大模型应用工程化过程

近年来,以人工智能为代表的新一代信息技术加速应用,特 别是基于大模型、大数据、大算力的 ChatGPT 的发布,标志着人 工智能技术取得里程碑式突破,推动科技创新进入新阶段。随着 大模型技术的迅猛发展和场景价值的不断涌现&#xf…

9.2 Go 接口的实现

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Day44 代码随想录打卡|二叉树篇---找树左下角的值

题目(leecode T513): 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 方法:本题需要找二叉树左下角的值,因此该节点首先是在最后一行&#xff0…

搭建智慧互联网医院系统教学:源码解析与在线问诊APP开发

本篇文章,小编将以“源码解析与在线问诊APP开发”为切入点,详细介绍搭建智慧互联网医院系统的过程。 一、智慧互联网医院系统的架构设计 系统架构概述 -前端 -后端 -数据库 功能模块划分 -用户 -预约 -挂号 -问诊、 -病历 -管理 -药品 -配送…

Web前端发展路线:深度解析与未来展望

Web前端发展路线:深度解析与未来展望 在数字化时代的浪潮中,Web前端技术日新月异,成为推动互联网行业发展的重要引擎。本文将从四个方面、五个方面、六个方面和七个方面,深入探讨Web前端的发展路线,为您揭示这一领域的…

C++ 分治法找到第K大的数

有一个整数数组&#xff0c;请你根据快速排序的思路&#xff0c;找出数组中第 k 大的数。 例如&#xff1a; 输入 [1,3,5,2,2], 找出数组中第2大的数&#xff0c;输出 3. #include <iostream>using namespace std; #include <stack> #include <string> #i…

Pytorch 从零实现 Transformer

前言 之前虽然了解过 Transformer 架构&#xff0c;但是没有自己实现过。 最近阅读 transformers 库中 Llama 模型结构&#xff0c;于是想试着亲手实现一个简单的 Transformer。 在实现过程中加深了理解&#xff0c;同时发现之前阅读 Llama 中一些错误的地方&#xff0c;因此…

【实战项目二】Python爬取豆瓣影评

目录 一、环境准备 二、编写代码 一、环境准备 pip install beautifulsoup4 pip intall lxml pip install requests我们需要爬取这些影评 二、编写代码 我们发现每个影评所在的div的class都相同&#xff0c;我们可以从这入手 from bs4 import BeautifulSoup import request…

Java数据结构与算法(爬楼梯动态规划)

前言 爬楼梯就是一个斐波那契数列问题&#xff0c;采用动态规划是最合适不过的。 实现原理 初始化:dp[0]1;dp[1]2; 转移方程&#xff1a;dp[i]dp[i-1]d[i-2]; 边界条件:无 具体代码实现 class Solution {public int climbStairs(int n) {if(n1){return 1;}int[] dpnew i…

Qwen2大模型微调入门实战(完整代码)

Qwen2是通义千问团队的开源大语言模型&#xff0c;由阿里云通义实验室研发。以Qwen2作为基座大模型&#xff0c;通过指令微调的方式实现高准确率的文本分类&#xff0c;是学习大语言模型微调的入门任务。 指令微调是一种通过在由&#xff08;指令&#xff0c;输出&#xff09;对…

倩女幽魂手游攻略:云手机自动搬砖辅助教程!

《倩女幽魂》手游自问世以来一直备受玩家喜爱&#xff0c;其精美画面和丰富的游戏内容让人沉迷其中。而如今&#xff0c;借助VMOS云手机&#xff0c;玩家可以更轻松地进行搬砖&#xff0c;提升游戏体验。 一、准备工作 下载VMOS云手机&#xff1a; 在PC端或移动端下载并安装VM…