深度学习-实验1

一、Pytorch基本操作考察(平台课+专业课)

  1. 使用𝐓𝐞𝐧𝐬𝐨𝐫初始化一个 𝟏×𝟑的矩阵 𝑴和一个 𝟐×𝟏的矩阵 𝑵,对两矩阵进行减法操作(要求实现三种不同的形式),给出结果并分析三种方式的不同(如果出现报错,分析报错的原因)同时需要指出在 计算过程中发生了什么
import torch
a = torch.rand(1,3)
b = torch.rand(2,1)
print('a=',a)
print('b=',b)
print(a-b)
print(torch.sub(a,b))
a.sub_(b)
  1. 利用 𝐓𝐞𝐧𝐬𝐨𝐫创建两个大小分别 𝟑×𝟐 和 𝟒×𝟐的 随机数矩阵 𝑷和 𝑸,要求服从均值为 0 ,标准差 0.01 为的 正态分布 ;② 对第二步得到的矩阵 𝑸 进行形状变换得到 𝑸的转置 𝑸𝑻;③ 对上述得到的矩阵 𝑷和矩阵 𝑸𝑻 求矩阵相乘
import torch
import numpy as np
x = np.random.normal(0,0.01,3*2)
y = np.random.normal(0,0.01,4*2)
P = torch.from_numpy(x).clone().view(3,2)
print("P矩阵为:",P)
Q = torch.from_numpy(y).clone().view(4,2)
print("Q矩阵为:",Q)
Qt = Q.t()
print("Qt矩阵为:",Qt)
R = torch.mm(P,Qt)
print("P矩阵与Qt矩阵相乘的结果为:",R)
  1. 给定公式𝑦3=𝑦1+𝑦2=𝑥2+𝑥3 且 𝑥=1。利用学习所得到的 Tensor 的相关知识,求 𝑦3对 𝑥的梯度,即 𝑑𝑦3𝑑𝑥。要求在计算过程中,在计算 𝑥3 时中断梯度的追踪, 观察结果并进行原因分析
import torch
x = torch.tensor(1.,requires_grad=True)
y1 = x**2
y2 = x**3
y3 = y1+y2
y3.backward()
print("计算x的梯度:",x.grad)
import torch
x = torch.tensor(1.,requires_grad=True)
y1 = x**2
with torch.no_grad():y2 = x**3
y3 = y1+y2
y3.backward()
print("不计算x三次方的梯度:",x.grad)

二、手动实现logistic回归

  1. 要求动手从 0 实现 logistic 回归 (只借助 Tensor 和 Numpy 相关的库)在 人工构造的数据集上进行训练和测试,并从 loss 以及训练集上的准确率等多个角度对结果进行分析

导入包

import torch
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import torch.nn as nn

生成训练集

#标准化数据
def sdata(data):sdata = np.interp(data, (data.min(), data.max()), (0, 1))return sdata
num_examples = 500num1 = np.c_[np.random.normal(3, 1, (num_examples , 2)),np.ones(num_examples)]
num2 = np.c_[np.random.normal(1, 1, (num_examples , 2)),np.zeros(num_examples)]
num = np.vstack((num1,num2))
np.random.shuffle(num)#打乱数据
np.savetxt('test',(num))#将数据等比例压缩在0-1之间
snum1 = sdata(num[:,0]).reshape(num_examples*2,1)
snum2 = sdata(num[:,1]).reshape(num_examples*2,1)
snum = np.concatenate((snum1,snum2,num[:,2].reshape(num_examples*2,1)), axis=1)#将numpy格式的数据转为tensor格式
num1_tensor = torch.tensor((np.c_[snum[:,0],snum[:,1]]),dtype=torch.float)
num2_tensor = torch.tensor(snum[:,2],dtype=torch.float).unsqueeze(1)#绘制数据的图像
column_values = num[:,2]
xy0 = snum[column_values == 0]
xy1 = snum[column_values == 1]
plt.plot(xy0[:,0],xy0[:,1],'bo', label='x_1')
plt.plot(xy1[:,0],xy1[:,1],'ro', label='x_1')

运行结果:
在这里插入图片描述
损失函数:二元交叉熵

def binary_loss(y_pred, y):loss = nn.BCELoss()return loss(y_pred , y)

优化算法:梯度优化算法

def sgd(w,b):w.data = w.data - 0.1 * w.grad.datab.data = b.data - 0.1 * b.grad.dataw.grad.zero_()b.grad.zero_()

构建模型和模型训练

#sigmoid函数
def sigmoid(x):return 1 / (1 + torch.exp(-x))def logistic_regression(x):return sigmoid(torch.mm(x, w) + b)#正确率计算
def accu(y_pred,y):correct = (y_pred == y).sum()/y.numel()return correctw = torch.rand(2, 1, requires_grad=True)##torch.rand默认随机产生的数据都是0-1
b = torch.zeros(1, requires_grad=True)#模型训练
for nums in range(1,1000):y_pred = logistic_regression(num1_tensor)loss = binary_loss(y_pred, num2_tensor)loss.backward()sgd(w,b)if nums%200==0 :mask = y_pred.ge(0.5).float()acc = accu(mask,num2_tensor)print('第',nums,'次循环后','los =',f"{loss.data.float().item():.3f}",' acc =',f"{acc.item():.3f}")
print('第',nums+1,'次循环后','los =',f"{loss.data.float().item():.3f}",' acc =',f"{acc.item():.3f}")

运行结果:
在这里插入图片描述
绘制图像

cline_x = np.arange(0, 1, 0.01)
cline_y = (-w[0].data[0] * cline_x - b.data[0]) / w[1].data[0]column_values = num[:,2]
xy0 = snum[column_values == 0]
xy1 = snum[column_values == 1]plt.plot(cline_x, cline_y, 'g', label='cutting line')
plt.plot(xy0[:,0],xy0[:,1],'bo', label='label=0')
plt.plot(xy1[:,0],xy1[:,1],'ro', label='label=1')
plt.legend(loc='best')

运行结果:
在这里插入图片描述

  1. 利用torch.nn实现logistic回归在人工构造的数据集上进行训练和测试,并对结果进行分析并从loss以及训练集上的准确率等多个角度 对结果进行分析
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np# 构造训练数据集
# 假设特征向量为2维,标签为0或1
def sdata(data):sdata = np.interp(data, (data.min(), data.max()), (0, 1))return sdatanum_examples = 500num1 = np.c_[np.random.normal(3, 1, (num_examples , 2)),np.ones(num_examples)]
num2 = np.c_[np.random.normal(1, 1, (num_examples , 2)),np.zeros(num_examples)]
num = np.vstack((num1,num2))
np.random.shuffle(num)#打乱数据
np.savetxt('test',(num))#将数据等比例压缩在0-1之间
snum1 = sdata(num[:,0]).reshape(num_examples*2,1)
snum2 = sdata(num[:,1]).reshape(num_examples*2,1)
snum = np.concatenate((snum1,snum2,num[:,2].reshape(num_examples*2,1)), axis=1)#将numpy格式的数据转为tensor格式
train_features = torch.tensor((np.c_[snum[:,0],snum[:,1]]),dtype=torch.float)
train_labels = torch.tensor(snum[:,2],dtype=torch.float).unsqueeze(1)# 定义 logistic 回归模型
class LogisticRegression(nn.Module):def __init__(self, input_dim):#继承super().__init__()self.linear = nn.Linear(input_dim, 1)#设置一个全连接层def forward(self, x):out = self.linear(x)#先经过一遍全连接层,得到outself.sigmoid = nn.Sigmoid()out = self.sigmoid(out)#使用out经过激活函数return out# 初始化模型和损失函数
net = LogisticRegression(2)
BCEloss = nn.BCELoss()#损失函数
optimizer = optim.SGD(net.parameters(), lr=0.01)##优化器# 迭代训练
num_epochs = 6000
for epoch in range(num_epochs):# 前向传播outputs = net(train_features)#算下lossloss = BCEloss(outputs.flatten(), train_labels.float().squeeze())# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()#参数更新# 打印最终的损失
print(f"Final loss: {loss.item()}")# 在训练集上进行预测
with torch.no_grad():predicted_labels = net(train_features).round()# 计算训练集上的准确率
accuracy = (predicted_labels == train_labels).sum().item() / len(train_labels)
print(f"Accuracy on the training set: {accuracy}")

运行结果:
在这里插入图片描述

动手实现softmax回归

  1. 要求动手从 0 实现 softmax 回归 (只借助 Tensor 和 Numpy 相关的库)在 Fashion MNIST 数据集上进行训练和测试 ,并从 loss 、训练集以及测试集上的准确率等多个角度对结果进行分析

导入数据

# 1、加载Fashion-MNIST数据集(采用已划分好的训练集和测试集)
#训练集
mnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=True,download=True,transform=transforms.ToTensor())
#测试集
mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=False,download=True,transform=transforms.ToTensor()
)

数据加载

BATCH_SIZE = 500
train_loader = torch.utils.data.DataLoader(dataset = mnist_train,batch_size=BATCH_SIZE,shuffle=True,num_workers=0
)test_loader = torch.utils.data.DataLoader(dataset = mnist_test,batch_size=BATCH_SIZE,shuffle=False,num_workers=0
)

损失函数:交叉熵损失函数(代码略)

优化算法:SGD(代码略)

搭建softmax回归模型

def softmax(X):X_exp = torch.exp(X)partition = X_exp.sum(1, keepdim=True)return X_exp / partitiondef net(X):return softmax(torch.mm(X.view((-1, 784)), W) + b)

准确率计算

def evaluate_accurcy(data_iter): #测试集正确率计算right_count, all_num = 0.0, 0for x, y in data_iter:right_count += (net(x).argmax(dim=1) == y).float().sum().item()all_num += y.shape[0]return right_count / all_numdef corrcet_num(predicted_probs, labels):predicted_labels = torch.argmax(predicted_probs, dim=1)correct = (predicted_labels == labels).sum().item()return correct

模型训练

lr = 0.1
num_epochs = 5
W = torch.normal(0, 0.1, (784, 10), dtype=torch.float32).requires_grad_()
b = torch.normal(0, 0.01, (1, 10), dtype=torch.float32).requires_grad_()for epoch in range(num_epochs):train_right_sum, train_all_sum, train_loss_sum = 0.0, 0, 0.0for X, y in train_loader:y_pred = net(X)loss = CEloss(y_pred, y).sum()loss.backward()sgd([W, b], lr, BATCH_SIZE)train_loss_sum += loss.item()train_right_sum += corrcet_num(y_pred,y) #训练集正确数量train_all_sum += y.shape[0]test_acc = evaluate_accurcy(test_loader)  # 测试集正确率print('epoch:{}|loss:{}'.format(epoch, train_loss_sum/train_all_sum))print('训练集正确率:{}|测试集正确率:{}'.format(train_right_sum/train_all_sum, test_acc))

输出结果:
在这里插入图片描述

  1. 利用 torch.nn 实现 softmax 回归在 Fashion MNIST 数据集上进行训练和测试,并从 loss ,训练集以及测试集上的准确率等多个角度对结果进行分析
import torch
import torch.nn as nn
from torch import tensor
import torch.optim as optim
import numpy as np
import torchvision
import torchvision.transforms as transformsmnist_train = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=True,download=True,transform=transforms.ToTensor())  # 将所有数据转换为Tensor
mnist_test = torchvision.datasets.FashionMNIST(root='~/Datasets/FashionMNIST',train=False,download=True,transform=transforms.ToTensor()
)BATCH_SIZE = 256
train_loader = torch.utils.data.DataLoader(dataset = mnist_train,batch_size=BATCH_SIZE,shuffle=True,num_workers=0
)test_loader = torch.utils.data.DataLoader(dataset = mnist_test,batch_size=BATCH_SIZE,shuffle=False,num_workers=0
)input_dim = 784
output_dim = 10class SoftmaxRegression(nn.Module):def __init__(self, input_dim , output_dim):#继承super().__init__()self.linear = nn.Linear(input_dim, output_dim)#设置一个全连接层def forward(self, x):x = x.view(-1,input_dim)out = self.linear(x)#先经过一遍全连接层,得到outself.softmax = nn.Softmax()out = self.softmax(out)#使用out经过激活函数return outnet = SoftmaxRegression(input_dim,output_dim)
lr = 0.1
CEloss = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr)num_epoch = 5def evaluate_accurcy(data_iter): #测试集正确率计算right_count, all_num = 0.0, 0for x, y in data_iter:right_count += (net(x).argmax(dim=1) == y).float().sum().item()all_num += y.shape[0]return right_count / all_numdef corrcet_num(predicted_probs, labels):predicted_labels = torch.argmax(predicted_probs, dim=1)correct = (predicted_labels == labels).sum().item()return correctfor epoch in range(num_epoch):train_right_sum, train_all_sum, train_loss_sum = 0.0, 0, 0.0for X, y in train_loader:# 前向传播y_pred = net(X)#算下lossloss = CEloss(y_pred, y)# 反向传播和优化loss.backward()optimizer.step()optimizer.zero_grad()#参数更新train_loss_sum += loss.item()train_right_sum += corrcet_num(y_pred,y) #训练集正确数量train_all_sum += y.shape[0]test_acc = evaluate_accurcy(test_loader)print('epoch:{}|loss:{}'.format(epoch, train_loss_sum/train_all_sum))print('训练集正确率:{}|测试集正确率:{}'.format(train_right_sum/train_all_sum, test_acc))

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

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

相关文章

深度学习处理文本(NLP)

文章目录 引言1. 反向传播1.1 实例流程实现1.2 前向传播1.3 计算损失1.4 反向传播误差1.5 更新权重1.6 迭代1.7 BackPropagation & Adam 代码实例 2. 优化器 -- Adam2.1 Adam解析2.2 代码实例 3. NLP任务4. 神经网络处理文本4.1 step1 字符数值化4.2 step 2 矩阵转化为向量…

【数据结构练习】单链表OJ题(一)

目录 一、移除链表元素思路1:思路2: 二、反转链表三、链表的中间节点四、链表中倒数第k个节点五、回文结构六、合并两个有序链表 一、移除链表元素 题目: 思路1: 在原来的链表上进行修改,节点的数据是val的删除&am…

Redis三种持久化方式详解

一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储,如固态磁盘(SSD)。Redis提供了一系列持久性选项。其中包括: RDB(快照):RDB持久性以指定的时间间隔执行数据集的时间点…

数据结构(7)

B树 B树中允许一个节点拥有多个key。设定参数M,构造B树 1.每个结点最多右M-1个key,并且以升序排列 2.每个结点最多右M个子结点 3.根节点至少右两个子结点 通过磁盘预读,将数据放到B树中,3层B树可容纳1024*1024*1024差不多10亿…

自动化部署及监测平台基本架构

声明 本文是学习 政务计算机终端核心配置规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 核心配置自动化部署及监测技术要求 自动化部署及监测平台基本架构 对于有一定规模的政务终端核心配置应用,需要配备自动化部署及监测平台&am…

element plus 的图片上传组件回显

element图片回显是通过修改file-list属性的url属性实现的。 <!-- 图片上传 --><el-form-item label"景区图片" prop"s_img"><el-uploadlist-type"picture-card":action"网址":on-change"handleChange":befor…

机器学习理论笔记(二):数据集划分以及模型选择

文章目录 1 前言2 经验误差与过拟合3 训练集与测试集的划分方法3.1 留出法&#xff08;Hold-out&#xff09;3.2 交叉验证法&#xff08;Cross Validation&#xff09;3.3 自助法&#xff08;Bootstrap&#xff09; 4 调参与最终模型5 结语 1 前言 欢迎来到蓝色是天的机器学习…

探索最短路径问题:寻找优化路线的算法解决方案

1. 前言&#xff1a;最短路径问题的背景与重要性 在现实生活中&#xff0c;我们常常面临需要找到最短路径的情况&#xff0c;如地图导航、网络路由等。最短路径问题是一个关键的优化问题&#xff0c;涉及在图中寻找两个顶点之间的最短路径&#xff0c;以便在有限时间或资源内找…

VUE调用高德地图之电子围栏

最近项目上电子围栏功能&#xff0c;就是地图上限定的区域内实现限行功能&#xff0c;用我们身边的事物来举例&#xff0c;共享单车的限行、限停区域就是电子围栏。由此可见&#xff0c;电子围栏最基础的做法就是在地图上实现多边形覆盖物。 效果图大概如下&#xff1a; 照例…

基于Java+SpringBoot+vue前后端分离华强北商城二手手机管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

数据仓库一分钟

简介 数据仓库&#xff08;Data Warehouse&#xff09;简称DW或DWH&#xff0c;是数据库的一种概念上的升级&#xff0c;可以说是为满足新需求设计的一种新数据库&#xff0c;而这个数据库是需容纳更多的数据&#xff0c;更加庞大的数据集&#xff0c;从逻辑上讲数据仓库和数据…

补充1 MATLAB_GUI_通过普通按钮PushButton的回调函数ButtonDownFcn创建一个长按回调按钮

目录 一、实例效果二、补充的知识点&#xff08;两种回调函数&#xff09;三、步骤  1. 先建一个空白的GUI。  2.在GUI Figure 上添加一个按钮&#xff08;PushButton&#xff09;组件&#xff0c;并设置其属性&#xff0c;例如位置、大小和文本等。  3.CtrS保存一下GUI。…

从零开始的Hadoop学习(二)| Hadoop介绍、优势、组成、HDFS架构

1. Hadoop 是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念—Hadoop生态圈。 2. Hadoop 的优势 高可靠性&#xff1a;Hadoop底层维护多…

【C++STL基础入门】vector运算和遍历、排序、乱序算法

文章目录 前言一、vector运算符1.1 比较运算符vector有哪些比较运算符&#xff1f;示例代码注意 1.2 下标运算符 二、算法2.1 算法需要的头文件2.2 遍历算法2.3 排序算法从大到小从小到大 2.4 乱序算法 总结 前言 C标准库提供了丰富的容器和算法&#xff0c;其中vector是最常用…

《中国区块链发展报告(2023)》发布 和数集团推动区块链发展

北京区块链技术应用协会与社会科学文献出版社日前在京共同发布《区块链蓝皮书&#xff1a;中国区块链发展报告&#xff08;2023&#xff09;》。蓝皮书归纳梳理了2022年区块链产业发展现状及趋势&#xff0c;并结合行业热点Web3.0、AIGC&#xff0c;探讨我国区块链发展的热点话…

Python可视化工具库实战

Matplotlib Matplotlib 是 Python 的可视化基础库&#xff0c;作图风格和 MATLAB 类似&#xff0c;所以称为 Matplotlib。一般学习 Python 数据可视化&#xff0c;都会从 Matplotlib 入手&#xff0c;然后再学习其他的 Python 可视化库。 Seaborn Seaborn 是一个基于 Matplo…

【Unity】【Amplify Shader Editor】ASE入门系列教程第二课 硬边溶解

新建材质&#xff08;不受光照影响&#xff09; 拖入图片 设置 添加节点&#xff1a; 快捷键&#xff1a;K 组合通道&#xff1a;快捷键 V 完成图

解决运行在微信小程序中报[ app.json 文件内容错误] app.json: app.json 未找到(env: Windows,mp,1.05.2204

找到project.config.json文件夹 添加 "miniprogramRoot": "unpackage/dist/dev/mp-weixin/", 即可

Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

Prompt任务&#xff08;Prompt Tasks&#xff09; 通过设计提示&#xff08;prompt&#xff09;模板&#xff0c;实现使用更少量的数据在预训练模型&#xff08;Pretrained Model&#xff09;上得到更好的效果&#xff0c;多用于&#xff1a;Few-Shot&#xff0c;Zero-Shot 等…

MetaMask Mobile +Chrome DevTools 调试Web3应用教程

注&#xff1a;本教程来源网络&#xff0c;有兴趣的可以直接到这里查看。 写好了WEB3应用&#xff0c;在本地调试用得好好的&#xff0c;但是用钱包软件访问就报莫名的错&#xff0c;但是又不知道是什么原因&#xff0c;排查的过程非常浪费时间 。 因此在本地同一局域网进行调试…