深度学习-实验1

news2024/11/24 8:41:54

一、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 = 500

num1 = 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.data
  b.data = b.data - 0.1 * b.grad.data
  w.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 correct

w = 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 sdata

num_examples = 500

num1 = 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)#先经过一遍全连接层,得到out
        self.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)
    #算下loss
    loss = 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 / partition


def net(X):
  return softmax(torch.mm(X.view((-1, 784)), W) + b)

准确率计算

def evaluate_accurcy(data_iter): #测试集正确率计算
    right_count, all_num = 0.0, 0
    for 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_num


def 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.0
    for 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 transforms

mnist_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 = 10



class 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)#先经过一遍全连接层,得到out
        self.softmax = nn.Softmax()
        out = self.softmax(out)#使用out经过激活函数
        return out

net = SoftmaxRegression(input_dim,output_dim)
lr = 0.1
CEloss = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr)

num_epoch = 5

def evaluate_accurcy(data_iter): #测试集正确率计算
    right_count, all_num = 0.0, 0
    for 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_num

def corrcet_num(predicted_probs, labels):
    predicted_labels = torch.argmax(predicted_probs, dim=1)
    correct = (predicted_labels == labels).sum().item()
    return correct

for epoch in range(num_epoch):
    train_right_sum, train_all_sum, train_loss_sum = 0.0, 0, 0.0
    for X, y in train_loader:
      # 前向传播
      y_pred = net(X)
      #算下loss
      loss = 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.coloradmin.cn/o/909777.html

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

相关文章

node配合charles写文件并下载

利用charles的Copy URL 和Copy cURL Request 进行抓取喜马拉雅的m4a文件 将抓取的下载链接粘贴进txt,利用如下代码去重,并生成新的sh文件,执行sh文件即可下载 const fs require("fs");//need config const inputFile "input.txt"; const outputFile &q…

JCTools Mpsc源码详解(一)

Jctools介绍--jctools是一个Java开源并发非阻塞数据结构实现,其中主要实现了非阻塞Map和非阻塞queue,旨在为Java提供高性能并发数据结构实现; jctool的特点--为什么性能高: lazyset--putOrderedObject,使用loadload内存屏障,写不会立即可见大量的位运算伪共享-通过pad类实现内…

嵌入式系统中常见内存的划分方法

看到有小伙伴在讨论关于单片机内存的话题,今天就结合STM32给大家描述一下常见的划分区域。 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全…

npm install 安装依赖,报错 Host key verification failed

设置 git 的身份和邮箱 git config --global user.name "你的名字" > 用户名 git config --global user.email “你的邮箱" > 邮箱进入 > 用户 > [你的用户名] > .ssh文件夹下,删除 known_hosts 文件即可 进入之后有可能会看到 known_hosts…

亿赛通电子文档安全管理系统 RCE漏洞

亿赛通电子文档安全管理系统 RCE漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现小龙POC检测: 五、 修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失…

【学会动态规划】 最长递增子序列(26)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

【Django】 Task5 DefaultRouter路由组件和自定义函数

文章目录 【Django】 Task5 DefaultRouter路由组件和自定义函数1.路由组件1.1路由组件介绍1.2SimpleRouter1.3DefaultRouter1.4DefaultRouter示例1.5查看访问服务接口url 2.自定义函数 【Django】 Task5 DefaultRouter路由组件和自定义函数 Task5 主要了解了DefaultRouter路由…

如何使用LLM实现文本自动生成视频

推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 介绍 基于扩散的图像生成模型代表了计算机视觉领域的革命性突破。这些进步由Imagen,DallE和MidJourney等模型开创,展示了文本条件图像生成的卓越功能。有关这些模型内部工作的…

SpringMVC 反射型跨站点脚本攻击

解决方案&#xff1a; 服务端校验&#xff0c;添加拦截器 配置web,xml <filter><filter-name>xssFilter </filter-name><filter-class>com.fh.filter.XssFilter </filter-class></filter> XssFilter package com.fh.filter;import com…

【C++】运算符重载 | 赋值运算符重载

Ⅰ. 运算符重载 引入 ❓什么叫运算符重载&#xff1f; 就是&#xff1a;运用函数&#xff0c;将现有的运算符重新定义&#xff0c;使其能满足各种自定义类型的运算。 回想一下&#xff0c;我们以前运算的对象是不是都是int、char这种内置类型&#xff1f; 那我们自定义的“…

编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1,并推送其到私有仓库

Docker 镜像是一个特殊的文件系统&#xff0c;除了提供容器运行时所需的程序、库、资源、配置等文件外&#xff0c;还包含了一些为运行时准备的一些配置参数&#xff08;如匿名卷、环境变量、用户等&#xff09;。镜像不包含任何动态数据&#xff0c;其内容在构建之后也不会被改…

存储系统性能优化中IOMMU的作用是什么?

一、IOMMU原理 IOMMU(Input/Output Memory Management Unit)是一种用于管理计算机内存的技术,它允许将物理内存映射到虚拟地址空间。IOMMU通过使用专用的硬件来管理和优化内存访问,从而提高系统性能和稳定性。本文将详细介绍IOMMU的原理,并介绍一些应用案例和典型的问题解…

Android13新特性之通知权限提升

Android13新特性之通知权限提升 随着移动通信的高速发展&#xff0c;保障通信的安全性变得尤为重要。在Android 13的最新版本中&#xff0c;通知权限的管理得到了进一步加强。为了实现安全的通信和确保用户的隐私&#xff0c;必须正确申请通知权限。本文将详细探讨如何在Andro…

时空智友企业流程化管控系统文件上传漏洞复现

0x01 产品简介 时空智友企业流程化管控系统是一个功能丰富、灵活可定制的企业管理工具。通过该系统&#xff0c;企业能够实现流程的自动化、协同的提升、数据的洞察和决策的优化&#xff0c;从而提高工作效率、管理水平和企业竞争力。 0x02 漏洞概述 时空智友企业流程化管控系…

Embedding 向量生成GPT数据使用相关

如果使用python3.6的版本&#xff0c;使用pycharm创建工程&#xff0c;那么默认会使用 docx包&#xff0c;这样运行程序会爆异常&#xff0c;突然想起以前请教的一个大神&#xff0c;想当 初&#xff0c;这个问题困扰了我 两天时间&#xff0c;在此记录一下&#xff1a; pytho…

ReactiveApi

reactivity api: https://v3.vuejs.org/api/reactivity-api 1. 获取响应式数据 API传入返回备注reactiveplain-object对象代理深度代理对象中的所有成员readonlyplain-object or proxy对象代理只能读取代理对象中的成员&#xff0c;不可修改refany{ value: ... }对value的访问…

华为数通方向HCIP-DataCom H12-821题库(单选题:01-20)

第01题 下面关于OSPF邻居关系和邻接关系描述正确的是 A、邻接关系由 OSPF的 DD 报文维护 B、OSPF 路由器在交换 Hello 报文之前必须建立邻接关系 C、邻居关系是从邻接关系中选出的为了交换路由信息而形成的关系 D、并非所有的邻居关系都可以成为邻接关系 答案&#xff1a;D 解析…

STM32F4X 定时器中断

STM32F4X 定时器中断 什么是定时器STM32F4X 定时器分类有关定时器的概念预分频(PSC)自动重装载值(ARR) STM32F4X定时器例程定时器相关函数定时器例程 什么是定时器 定时器(Timer)最基本的功能就是定时&#xff0c;比如定时翻转LED灯&#xff0c;定时向串口发送数据等。除此之外…

vue3 计算两个表单得到第三个表单数据

<el-formref"ruleFormRef"label-width"150px"label-suffix":":rules"rules":disabled"drawerProps.isView":model"drawerProps.rowData"><el-form-item label"云平台名称" prop"cloudId&…

HTTP和HTTPS的区别及通信原理

文章目录 HTTP特性http解决无状态的问题&#x1f36a;cookiesessiontoken 常见状态码报文和字段方法 HTTPS补充知识常见的加密方式数字摘要 &#xff08;数字指纹&#xff09; && 数字签名 加密过程 HTTP 何为http&#xff1f; http是超文本传输协议&#xff0c;Hyper…