深度学习numpy与tensor基础知识、关系与区别,通过pytorch构建网络加载数据

2023-05-16

文章目录

  • 一、numpy在深度学习中的经典用法
    • 1、生成numpy数组
    • 2、获取元素
    • 3、Numpy的数学运算
    • 4、数组变形
      • 4.1、更改数组形状
      • 4.2、合并数组
    • 5、批量处理
    • 6、通用函数
    • 7、广播机制
  • 二、torch基础概述
    • 1、tensor概述
    • 2、创建tensor
    • 3、修改tensor维度
    • 4、索引操作
    • 5、广播机制
    • 6、示例
  • 三、通过pytorch构建神经网络
    • 1、构建网络层
    • 2、前向传播
    • 3、反向传播
    • 4、训练与测试模型
    • 5、神经网络工具箱nn
      • 5.1、nn.Module
      • 5.2、nn.functional
    • 6、优化器
    • 7、数据处理工具

开局首先一句话

import numpy as np
import torch

一、numpy在深度学习中的经典用法

1、生成numpy数组

  • 直接转换np.array(list1)
  • random模块生成np.random.random([3,3])
  • 创建特定形状np.zeros([3,3])
  • arange/linspace模块生成np.arange(1,4,0.5),只有一个数字的话为1-数字

2、获取元素

  • 与python中类似,直接nd11[3:6]
  • random.choice函数可以从指定样本中随机抽取数据

3、Numpy的数学运算

  • 对应相乘:A*B/np.numtiply(a,b)
  • 点乘运算:np.dot()

4、数组变形

4.1、更改数组形状

  • reshape改变向量的维度(不改变向量本身)
import numpy as np
arr = np.arange(6).reshape(2,-1)
  • resize改变向量的维度(修改向量本身)np.arange(6).resize(2,-1)
  • T转置 np.arrange(12).reshape(3,4).T
  • revel展平
import numpy as np
arr = np.arange(6).reshape(2,-1)
print(arr)
print(arr.ravel('F'))#按列优先展平
print(arr.ravel())#按行优先展平
  • flatten 将矩阵转成向量,卷积与全连接层之间进行
a = np.floor(10*np.random.random((3,4)))
print(a)
print(a.flatten())
  • squeeze压缩掉含1的维度arr.squeeze().shape
  • transposearr2 = np.arange(24).reshape(2,3,4).transpose(1,2,0)

4.2、合并数组

  • append在后面添加np.append(a,b,axis=0)0为行合并,1为列合并
  • concatenate沿指定轴连接数组或者矩阵np.concatenate((a,b),axis=0)
  • stack沿指定轴堆叠数组或矩阵np.stack((a,b),axis=0)

5、批量处理

import numpy as np

data_train = np.random.randn(10000,2,3)
print(data_train.shape)
np.random.shuffle(data_train)
batch_size = 100
for i in range(0,len(data_train),batch_size):
    x_batch_sum = np.sum(data_train[i:i+batch_size])
    print("第{}批次,该批次数据的和:{}".format(i,x_batch_sum))

6、通用函数

两种基本对象:ndarry和ufunc对象

  • math与numpy:numpy.sin比math.sin快近10倍
  • 循环与向量:向量要比循环快的多

7、广播机制

import numpy as np
A = np.arange(0,40,10).reshape(4,1)
B = np.arange(0,3)
C = A + B
print(C)

二、torch基础概述

1、tensor概述

  • torch.add(x,y)和x.add(y)等价
  • x.add(y)不会修改自身数据,x.add_(y)修改自身数据

2、创建tensor

import torch
torch.Tensor([1,2,3,4])
torch.Tensor(2,3)
torch.Tensor([[1,2],[3,4]])
  • torch.Tensor默认浮点型数据,torch.tensor从数据中推断数据类型。
  • torch.tensor(1)返回固定值1,torch.Tensor(1)返回大小为1的张量,随机初始值。

3、修改tensor维度

  • 大部分与numpy类似
  • 添加维度torch.unsqueeze(y,0)
  • view(-1)展平数组,只能由torch.Tensor.view()来调用

4、索引操作

import torch

torch.manual_seed(100)
x = torch.randn(2,3)
x[0:]
x[:,-1]
mask = x > 0
torch.masked_select(x,mask)
torch.nonzero(mask)

5、广播机制

import torch
import numpy as np
A = np.arange(0,40,10).reshape(4,1)
B = np.arange(0,3)
A1 = torch.from_numpy(A)
B1 = torch.from_numpy(B)
C = A1 + B1

6、示例

import torch as t
from matplotlib import pyplot as plt
import numpy
t.manual_seed(100)
x = t.unsqueeze(t.linspace(-1,1,100),dim = 1)
y = 3*x.pow(2) + 2 + 0.2*t.rand(x.size())
plt.scatter(x.numpy(),y.numpy())
plt.show()

w = t.randn(1,1,requires_grad=True)
b = t.randn(1,1,requires_grad=True)

lr = 0.01
for ii in range(800):
    y_pred = x.pow(2).mm(w) + b
    loss = 0.5*(y_pred - y)**2
    loss = loss.sum()
    
    loss.backward()
    with t.no_grad():
        w -= lr * w.grad
        b -= lr * b.grad
        
        w.grad.zero_()
        b.grad.zero_()

plt.plot(x.numpy(),y_pred.detach().numpy(),'r',label = 'predict')
plt.scatter(x.numpy(),y.numpy())
plt.xlim(-1,1)
plt.ylim(2,6)
plt.show()
print(w,b)

三、通过pytorch构建神经网络

1、构建网络层

可以借助nn工具箱class Net(torch.nn.Module)

class Net(nn.Module):
    def __init__(self, in_dim, n_hidden_1, n_hidden_2, out_dim):
        super(Net, self).__init__()
        self.layer1 = nn.Sequential(nn.Linear(in_dim, n_hidden_1),nn.BatchNorm1d(n_hidden_1))
        self.layer2 = nn.Sequential(nn.Linear(n_hidden_1, n_hidden_2),nn.BatchNorm1d(n_hidden_2))
        self.layer3 = nn.Sequential(nn.Linear(n_hidden_2, out_dim))
        
    def forward(self,x):
        x = F.relu(self.layer1(x))
        x = F.relu(self.layer2(x))
        x = self.layer3(x)
        return x

2、前向传播

来自nn.Module的需要示例化,来自nn.fuctional的不需要实例化

    def forward(self,x):
        x = F.relu(self.layer1(x))
        x = F.relu(self.layer2(x))
        x = self.layer3(x)
        return x

3、反向传播

直接让损失函数调用loss即可 loss.backward()

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

model = Net(28*28, 300, 100, 10)
model.to(device)

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=lr, momentum=momentum)

losses, acces, eval_losses, eval_acces = [],[],[],[]
for epoch in range(num_epochs):
    train_loss = 0
    train_acc = 0
    model.train()
    if epoch%5 == 0:
        optimizer.param_groups[0]['lr'] *= 0.1
    for img,label in train_loader:
        img = img.to(device)
        label = label.to(device)
        img = img.view(img.size(0),-1) #这里为28*28
        
        out = model(img)
        loss = criterion(out,label)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        train_loss += loss.item()
        _, pred = out.max(1)
        num_correct = (pred == label).sum().item()
        acc = num_correct/img.shape[0] #这里的train_batch_size
        train_acc += acc
        
    losses.append(train_loss/len(train_loader))
    acces.append(train_acc/len(train_loader))

4、训练与测试模型

首先要记得调用module.train(),这样就可以把所有的module设置为训练模式;同样训练阶段要调用module.eval()。

optimizer.zero_grad()#缺省情况下梯度是累加的,要首先进行清零
loss.backward()#自动生成梯度
optimizer.step()#执行优化器

5、神经网络工具箱nn

可以避免手动设置requires_grad=Ture

5.1、nn.Module

nn已经实现了绝大多数层,并作为自己的子类,能自动检测到parameter

5.2、nn.functional

  • nn.Xxx继承于nn.Module,需要先实例化并传入参数,然后以函数调用的方式实例化对象并传入数据,能够与nn.Sequential结合使用,nn.functional则不能。
  • nn.Xxx不需要自己定义和管理weight、bias参数
  • 可以通过nn.Xxx的方式定义Dropout

6、优化器

封装在torch.optim当中,各种优化方法都是继承了基类optim.Optimizer

import torch.optim as optim
optimizer = optim.SGD(model.parameters(), lr=lr, momentum=momentum)

7、数据处理工具

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习numpy与tensor基础知识、关系与区别,通过pytorch构建网络加载数据 的相关文章

  • Java中的final

    1 final 在 Java 中的作用 final作为 Java 中的关键字可以用于三个地方 用于修饰类 类属性和类方法 特征 xff1a 凡是引用final 关键字的地方皆不可修改 xff01 1 修饰类 xff1a 表示该类不能被继承
  • 分享程序员面试的7个技巧

    金九银十又开始了 xff0c 不过这几年因为疫情的影响 xff0c 职场面试竞争力也变得格外的紧张 xff0c 这个时候除了实打实的技能 xff0c 面试的时候还需要更多的技巧 xff0c 双管齐下才能赢得更大的胜算 xff0c 技能方面就
  • Qt:在QtCreator中使用Clang-Tidy和Clazy检查C++代码质量

    QtCreator在前几天发布了4 6 0的版本 xff0c 增加了两个非常棒的新功能 xff0c 分别是Clang Tidy和Clazy 官方的blog链接 xff1a Qt Creator 4 6 0 released 这些功能能够帮助
  • surfaceView中添加控件

    最近想研究下WIFI ROBOT android 端的现实方法 xff0c 视频和虚拟摇杆都用到了SurfaceView 虚拟摇杆在前面一编讲了 xff0c 这里就把百度出的surfaceview 中加控件的说一下 xff0c 图中 xff
  • Docker中遇到无法删除的容器解决方案

    记录一下 xff0c 一个困扰了我一两天的问题 情况记录 在win10下的Docker中 xff0c 因为之前很少用windows xff0c 所以在某一次需要重启的时候就直接重启了 xff0c 但是在重启的就忘记了先关掉Docker xf
  • 融云SDK集成(一)集成SDK并连接成功

    声明 xff1a 此博客仅为个人学习记录使用 最近无聊时浏览了一下各大招聘网站发现 xff0c 招聘要求上都有写到有im经验或者是集成过融云环信的经验 这里博主特意去了解一下XMPP协议以及使用OpenFire服务器搭建了简易的即时聊天de
  • ESP8266开发中的流水账

    ESP8266开发中的流水账 1 开发环境 Windows下推荐使用AI Thinker打包的Eclipse开发环境 xff0c 直接下载后几本不用配置就可以使用了 同时 xff0c 一旦ESPRESSIF有了新的SDK xff0c 更新项
  • Futaba S-BUS协议解析

    一 协议说明 S BUS协议实际上通过串口进行数据发送 但是需要注意的是 xff0c S BUS的逻辑电平是反的 xff0c 需用如下电路对电平反相 xff0c 再接到串口接收的管脚 三极管可以用8050 串口配置为波特率100kbps x
  • 树莓派3-改装wifi外置天线(转)

    添加U FL底座 把U FL底座焊接到背面J13附近 xff0c 并更改0欧电阻连接 具体操作如下图所示 图 1 U FL座焊接位置 图 2 箭头所指处刮掉阻焊层 xff0c 增加焊接强度 图 3 更改0欧电阻的连接
  • linex命令大全

    1 uname a 查看内核版本 2 cat etc issue 查看当前linux的版本 3 设置ssh客户端的中文编码 export LC ALL 61 zh CN GB2312 export LANG 61 zh CN GB2312
  • 超声波测距模块HC-SR04简介

    一 模块引脚分析 可以看到模块有四个引脚 xff0c 分别是 Vcc xff1a 5V输入 xff0c 网上说3 3V输入也可以 xff0c 没试过 Trig xff1a 触发信号输入 Echo xff1a 回响信号输出 Gnd xff1a
  • 三款EDA工具,AD、PADS与Allegro的简单介绍

    一 市面上原理图设计和pcb绘制的软件主要有如下三个 xff1a 1 Altium Designer 简称AD 2 PADS 3 Cadence的Allegro 简称阿狸狗 二 三款软件的简单介绍 Altium Designer xff1a
  • BLDC无刷直流电机驱动电路-硬石电子

    1 BLDC无刷直流电机驱动电路 xff0c 因为BLDC是三相完全一样的驱动电路 xff0c 下图为其中一相电路图 xff0c 其他两相完全一样 主要元器件 xff1a 高速光耦 xff1a TLP715 MOS管驱动IC xff1a I
  • STM32F103如何使用串口下载程序

    1 从STM32参考手册上 xff0c 可以查阅到 xff0c STM32的启动模式 xff0c 共有下列三种 xff0c 可以通过BOOT0和BOOT1电平的不同组合 xff0c 来选择不同的启动模式 主闪存启动模式 xff1a 即运行模
  • keil提示用STLINK下载程序提示Error: Flash Download failed - Target DLL has been cancelled的一种情况

    keil版本为 xff1a V5 25 30 0 下载器为ST LINK 1 如下图 xff0c keil提示Error Flash Download failed Target DLL has been cancelled 2 原因是如下
  • STLINK引脚定义和接法

    1 如下图为STLINK实物图引脚定义 有一点需要注意 xff0c 其实20pin下面一排 xff0c 除了2脚是TVCC xff0c 其他脚都是GND 使用SW接法只需要四根线 xff1a 1 xff1a 3 3V 7 xff1a SWI
  • keil无法读取到jlink下载器,程序无法下载,报错No Cortex-M SW Device Found

    1 如题 xff0c 我用的芯片是STM32F103ZET6 xff0c 日常的接上下载器进行程序下载 xff0c 结果发现程序下载不进去 xff0c 错误提示如下 xff0c 一看就是Jlink没有连接上 进去设置里面查看 xff0c 确
  • 面试嵌入式工程师过程中的常见问题和回答

    1 请介绍一下你的嵌入式系统开发经验 an xff1a 首先 xff0c 回答此类问题时应该尽可能地详细和具体 可以从以下方面介绍自己的嵌入式系统开发经验 xff1a 1 开发环境和工具 xff1a 介绍自己使用过哪些开发环境和工具 xff
  • 【问题】使用opencv读取并处理图片后用plt显示图像颜色的偏色问题处理

    1 问题 x1f631 x1f631 x1f631 使用opencv读取并处理图片后用plt显示图像颜色偏色问题 xff0c 比如 xff0c 原始图像为黄色调 xff0c 结果显示为蓝色调 或者 xff0c 原始图像为蓝色调 xff0c
  • 常用docker命令,及一些坑

    常用docker命令 xff0c 及一些坑 常用命令 查看容器的root用户密码 span style color rgb 249 38 114 docker span logs lt 容器名orID gt span style color

随机推荐