pytorch学习笔记三

pytorch学习笔记三——transformer pytorch学习笔记三——transformer预备知识代码学习逻辑模型架构机器翻译任务实现主体部分模型构建Encoder-DecoderEncoder部分残差连接和层归一、位置前馈、多头注意力Decoder部分题外话 预备知识 transformer经典论文:attention is all you need 代码学习逻辑 从整体到局部 关注每一部分数据流向(输入->运算->输出 矩阵维度变换) 模型架构 机器翻译任务 实现 主体部分 import math import to 阅读详情

pytroch学习笔记三————张量(具体运用)

处理图像

有几种方法可以将颜色变为数字,最常见的方法是RGB,颜色由三个数字定义,分别代表红绿蓝的强度

加载图像文件(imageio模块)

import imageio

img_arr = imageio.imread('img/bobby.jpg')
print(img_arr.shape)
# (720,1280,3)

此时img是一个具有3个维度的类numpy数组对象,2个空间维度:高度和宽度,以及第三个维度对应红绿蓝,但是处理图像数据的pytorch需要的张量排列是C×H×WC\times H\times WC×H×W(分别表示通道,高度,宽度)

改变布局

运用permute()方法使每一个新的维度得到一个合适的布局
A=T.permute(a1,a2,...,an)an的位置为n,这个语句代表着新生成的张量A在n位置上的维度对应着原始张量T在an位置上的维度

img=torch.from_numpy(img_arr)
out=img.permute(2,0,1)

到目前为止我们只描述了单幅图像,但我们需要多幅图像,所以我们可以预分配一个适当大小的张量并使用从目录中加载的图像填充它
所以变成了四个维度:N×C×H×WN\times C\times H\times WN×C×H×W


batch_size = 3
batch = torch.zeros(batch_size, 3, 256, 256, dtype=torch.uint8)

import os

data_dir = 'filepath'
filenames = [name for name in os.listdir(data_dir) 
    if os.path.splitext(name)[-1] == '.png']
for i, filename in enumerate(filenames):
    img_arr = imageio.imread(os.path.join(data_dir, filename))
    img_t = torch.from_numpy(img_arr)
    img_t = img_t.permute(2, 0, 1)
    img_t = img_t[:3] # 只保留三个通道,因为还有第4个通道代表着透明度
    batch[i] = img_t

正规化数据

为了能够使神经网络顺利的对图像进行处理,所以需要将数据转化成[0,1]或[-1,1]之间的数据,第一种做法可以将数据类型变为float后将像素值除255,第二种是计算输入数据的均值和标准差,并对其进行缩放,使每个通道的均值为0,标准差为1
第二种做法如下:

n_channels = batch.shape[1]
for c in range(n_channels):
    mean = torch.mean(batch[:, c])
    std = torch.std(batch[:, c])
    batch[:, c] = (batch[:, c] - mean) / std

三维图像:体数据

类似于二维图像,加载三维图像仅需要多加载一个深度维度,因此标准的三维图像的维度为:N×C×D×H×WN\times C\times D\times H\times WN×C×D×H×W,分别对应图片数量,通道,深度,高度,宽度
利用imageio模块中的volread()函数加载一个CT扫描样本,该函数接受将目录作为参数,并将所有医学数字成像和通信(Digital Imaging and Communication in Medicine, DICOM)文件汇编为一个Numpy三维数组
加载特定格式的医学图像如下:

import numpy as np
import torch
import imageio

dir_path = "filepath/2-LUNG 3.0  B70f-04083"
vol_arr = imageio.volread(dir_path, 'DICOM')

由于没有通道信息,布局与pytorch期望不同,所以要用unsqueeze()为通道维度留出空间

vol = torch.from_numpy(vol_arr).float()
vol = torch.unsqueeze(vol, 0)

表示表格数据

假定样本在表中的出现顺序没有意义,这样的表是独立样本的集合,不像时间序列那样

加载数据张量

import numpy as np
import torch
torch.set_printoptions(edgeitems=2, precision=2, linewidth=75)

import csv
wine_path = "filepath/winequality-white.csv"
wineq_numpy = np.loadtxt(wine_path, dtype=np.float32, delimiter=";",
                         skiprows=1)

col_list = next(csv.reader(open(wine_path), delimiter=';'))
wineq = torch.from_numpy(wineq_numpy)

当我们试图理解数据时,应该意识到有3种不同的数值,分别是:

  • 连续值:用数字表示是最直观的,他们是严格有序的
  • 序数值:对连续值的严格排序仍然存在,但是值之间的固定关系不再适用
  • 分类值:其值没有排序意义,也没有数字意义

表示分数

将除最后一列的数据变为输入值,将最后一列的数据变成输出值

data = wineq[:, :-1]
target = wineq[:, -1]

如果想将target张量变成标签张量,有2种方法
一种是简单直接将标签视为分数的整数向量,如果目标张量是字符串标签,如葡萄酒的颜色,那么为每一个字符分配一个整数将允许我们采用相同的方法
另一种则是构建分数的一个独热编码

独热编码

将10个分数编码到一个由10个元素组成的向量中,除了其中一个元素设置为1,其他的都设置为0
如果分数是完全分散的,没有隐含的顺序和距离,则独热编码更加的合适
利用scatter_()方法可获得一个独热编码,该方法将沿着参数提供的索引方向将源张量的值填充到输入张量中
scatter_()参数解释:因为是以下划线结尾,所以是直接修改张量

  • 指定一下两个参数的维度
  • 一个列张量,表示要散射的元素的索引张量
  • 包含要散射元素的张量,或要散射的单个标量
target_onehot = torch.zeros(target.shape[0], 10)
target_onehot.scatter_(1, target.unsqueeze(1), 1.0)
target_unsqueezed = target.unsqueeze(1)

数据归一化

data_mean = torch.mean(data, dim=0)
data_var = torch.var(data, dim=0)
data_normalized = (data - data_mean) / torch.sqrt(data_var)

寻找阈值

利用pytorch中的高级索引的功能,可以使用数据类型torch.bool来索引data(过滤data),使其包含索引张量中与True对应的项或行

bad_indexes = target <= 3 
bad_data = data[bad_indexes]

把葡萄酒分为好酒,中等酒和劣质酒3类,

bad_data = data[target <= 3]
mid_data = data[(target > 3) & (target < 7)]
good_data = data[target >= 7]

bad_mean = torch.mean(bad_data, dim=0)
mid_mean = torch.mean(mid_data, dim=0)
good_mean = torch.mean(good_data, dim=0)

for i, args in enumerate(zip(col_list, bad_mean, mid_mean, good_mean)):
    print('{:2} {:20} {:6.2f} {:6.2f} {:6.2f}'.format(i, *args))

乍一看劣质葡萄酒的二氧化硫含量跟高,可因此把二氧化硫作为分好酒劣质酒的标准
torch.lt是比较规范的小于

total_sulfur_threshold = 141.83
total_sulfur_data = data[:,6]
predicted_indexes = torch.lt(total_sulfur_data, total_sulfur_threshold)
actual_indexes = target > 5
n_matches = torch.sum(actual_indexes & predicted_indexes).item()
n_predicted = torch.sum(predicted_indexes).item()
n_actual = torch.sum(actual_indexes).item()
print(n_matches, n_matches / n_predicted, n_matches / n_actual)

处理时间序列

增加时间序列

import numpy as np
import torch
torch.set_printoptions(edgeitems=2, threshold=50, linewidth=75)
bikes_numpy = np.loadtxt(
    "filepath/hour-fixed.csv", 
    dtype=np.float32, 
    delimiter=",", 
    skiprows=1, 
    converters={1: lambda x: float(x[8:10])}) # <1>
bikes = torch.from_numpy(bikes_numpy)

按时间段调整数据

利用view来调整查看数据的形式,使其以24小时为一个单位
同时将其变成N×C×LN\times C\times LN×C×L(序列,通道,小时)的形式,还需要对其急性转置

daily_bikes = bikes.view(-1, 24, bikes.shape[1])
daily_bikes = daily_bikes.transpose(1, 2)

调整天气变量

天气状况有四个级别,将其调整为向量并与数据集连接起来

first_day = bikes[:24].long()
weather_onehot = torch.zeros(first_day.shape[0], 4)
weather_onehot.scatter_(
    dim=1, 
    index=first_day[:,9].unsqueeze(1).long() - 1,
    value=1.0)
torch.cat((bikes[:24], weather_onehot), 1)

daily_weather_onehot = torch.zeros(daily_bikes.shape[0], 4,
                                   daily_bikes.shape[2])
daily_weather_onehot.scatter_(
    1, daily_bikes[:,9,:].long().unsqueeze(1) - 1, 1.0)
daily_bikes = torch.cat((daily_bikes, daily_weather_onehot), dim=1)

但是这不是调整天气变量的唯一的方法,因为标签是有序数据关系,所以可以假设是连续变量的特殊值,可以用转换变量来处理,下面代码展示了几种方法:

daily_bikes[:, 9, :] = (daily_bikes[:, 9, :] - 1.0) / 3.0
temp = daily_bikes[:, 10, :]
temp_min = torch.min(temp)
temp_max = torch.max(temp)
daily_bikes[:, 10, :] = ((daily_bikes[:, 10, :] - temp_min)
                         / (temp_max - temp_min))
                         temp = daily_bikes[:, 10, :]

daily_bikes[:, 10, :] = ((daily_bikes[:, 10, :] - torch.mean(temp))
                         / torch.std(temp))

表示文本

不想写了直接贴代码做备份

import numpy as np
import torch
torch.set_printoptions(edgeitems=2, threshold=50)
with open('../data/p1ch4/jane-austen/1342-0.txt', encoding='utf8') as f:
    text = f.read()
lines = text.split('\n')
line = lines[200]
line
letter_t = torch.zeros(len(line), 128) # <1> 
letter_t.shape
for i, letter in enumerate(line.lower().strip()):
    letter_index = ord(letter) if ord(letter) < 128 else 0  # <1>
    letter_t[i][letter_index] = 1
    
def clean_words(input_str):
    punctuation = '.,;:"!?”“_-'
    word_list = input_str.lower().replace('\n',' ').split()
    word_list = [word.strip(punctuation) for word in word_list]
    return word_list

words_in_line = clean_words(line)
line, words_in_line
word_list = sorted(set(clean_words(text)))
word2index_dict = {word: i for (i, word) in enumerate(word_list)}

len(word2index_dict), word2index_dict['impossible']
word_t = torch.zeros(len(words_in_line), len(word2index_dict))
for i, word in enumerate(words_in_line):
    word_index = word2index_dict[word]
    word_t[i][word_index] = 1
    print('{:2} {:4} {}'.format(i, word_index, word))
    
print(word_t.shape)

word_t = word_t.unsqueeze(1)
word_t.shape
[(c, ord(c)) for c in sorted(set(text))]

ord('l')
PyTorch学习笔记(三):PyTorch主要组成模块 PyTorch学习笔记(二):PyTorch主要组成模块,本系列主要介绍Pytorch笔记,本章学习学习各种经典网络模型结构与训练实战。 深度学习步骤: (1)数据预处理:通过专门的数据加载,通过批训练提高模型表现,每次训练读取固定数量的样本输入到模型中进行训练 (2)深度神经网络搭建:逐层搭建,实现特定功能的层(如积层、池化层、批正则化层、LSTM层等) (3)损失函数和优化器的设定:保证反向传播能够在用户定义的模型结构上实现 (4)模型训练:使用并行计算加速训练,将数据按批加载,放入GPU中训练。 阅读详情

相关推荐

PyTorch学习笔记(三)——Dataset和DataLoader

目录一、一级目录1.1 二级目录1.1.1 三级目录 一、一级目录 1.1 二级目录 1.1.1 三级目录

⚡ 4217

permute()--对维度进行换位

permute(dims) 将tensor的维度换位。 参数:参数是一系列的整数,代表原来张量的维度。比如三维就有0,1,2这些dimension。 例: import torch import numpy as np a=np.array([[[1,2,3],[4,5,6]]]) unpermuted=torch.tensor(a) print(unpermuted.siz...

sky的博客 4215

从零构建智能监控系统:ZLMediaKit与SpringBoot的RTSP流处理实战

本文详细介绍了如何从零构建智能监控系统,结合ZLMediaKit与SpringBoot实现RTSP流处理。通过多协议支持、高性能架构设计及工业级部署优化,解决传统监控方案的兼容性差、延迟高等问题,适用于物联网和智能安防领域。

weixin_29002209的博客 370

【python计算机视觉】1、常用库及基本操作

目录一、python计算机视觉中常用的库(一)PIL(Python Image Library)图像处理库(二)Matplotlib(三)Numpy(四)Pytorch(五)torchvision(六)SKimage(七)OpenCV二、基本操作(一)利用PIL读取图像数据(二)使用Matplotlib显示图像(三)PIL类型与Numpy类型转换(四) Numpy类型与torch类型互换(五)保存张量为图像三、常用的函数(一)打开图像,返回张量(二)显示使用张量表示的图像(三)保存张量为图像 一、pyth

weixin_42780429的博客 3000

高通AI Engine SDK(QNN)使用教程(环境配置、模型转换、量化、推理、分析)

高通AI Engine使用教程

weixin_51031772的博客 1万+

使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第一部分

American fuzzy lop 是一款面向安全的模糊测试器,它采用一种新型的编译时插桩和遗传算法,可以自动发现干净、有趣的测试用例,从而触发目标二进制文件中新的内部状态。这显著提高了模糊测试代码的功能覆盖率。AFL 的地址是它已经有一段时间没有更新了。虽然 AFL 仍然运行良好,但有一个新项目 AFL++,它是 AFL 的一个分支,包含许多改进和新功能。AFL++ 的地址是,其源代码位于。在本文中,我们将研究如何使用 AFL++ 对 IoT 二进制文件进行模糊测试。

技术超强的网络安全平台 1084

pytorch搭建卷积神经网络【第十课_tensor_# 时间序列数据操作_4】

文章目录前言一、tensor打印配置二、读取txt三、 重构维度四、提取相关数据五、独热编码六、组合与拆分tensor七、正则化数据总结 前言 案例代码https://github.com/2012Netsky/pytorch_cnn/blob/main/4_time_series_bikes.ipynb 一、tensor打印配置 #!/usr/bin/env python # coding: utf-8 import numpy as np import torch torch.set_printopt

2d3d图像算法 halcon\opencv\c++\pcl\vtk\coluldcompare工具 程序员 学习者 955

Cadence HDL原理图库避坑指南:从Excel导入引脚到解决‘V- V+’报错(附FPGA实例)

本文详细介绍了Cadence HDL原理图库的高效构建与排错方法,重点讲解如何从Excel智能导入引脚数据并优化FPGA封装设计。通过数据预处理、智能导入和深度排错三个关键阶段,帮助工程师避免常见错误如‘V- V+’报错,提升设计效率和准确性。

weixin_28739079的博客 234

jupyter notebook内核挂掉的解决方案

jupyter notebook内核挂掉的解决方案

seaflyren的博客 2153

M2DGR数据集在一些SLAM框架上的配置与运行:ORB-SLAM系列、VINS-Mono、LOAM系列、FAST-LIO系列、hdl_graph_slam

为了说明以上这些SLAM框架的测试与数据集适配,以M2DGR数据集为例进行各自的配置与运行,方便我以后适配自己的数据集,运行的SLAM框架包括:ORB-SLAM2、ORB-SLAM3、VINS-Mono、A-LOAM、LeGO-LOAM、LIO-SAM、LVI-SAM、FAST-LIO2、FAST-LIVO、Faster-LIO、hdl_graph_slam。实验基于Ubuntu20.04,其中ORB、VINS-Mono、和LOAM系列的安装参考我以前的博客,有详细的安装方法,其他的框架在后面会简单介绍一下

zardforever123的博客 1万+

Diffix3D+复现

上下载模型,将其放在一个目录中,并将目录名填在demo代码中from_pretrained的cache_dir参数里。目录结构应该是"<PATH>/nvidia/difix/…给的requirements文件中pytorch和xformers的版本没有指定,这里测试过以下版本,可以成功运行。将readme中的demo代码新建一个python脚本复制进去,然后将脚本放在src目录中运行。如果遇到网络问题无法加载huggingface上的预训练模型,可以手动从。如果出现,以下错误重新。

NeverMakeIt的博客 1085

Pytorch view(-1)和permute的用法

Pytorch view和permute的用法 目录Pytorch view和permute的用法一. view的用法二. permute的用法 一. view的用法 首先把原先tensor中的数据按照行优先的顺序排成一个一维的数据(这里应该是因为要求地址是连续存储的),然后按照参数组合成其他维度的tensor。 比如 import torch import numpy as np a =np.array([[1,2,3],[4,5,6]]) a = torch.tensor(a) print(a.siz

weixin_39559994的博客 6013

进阶篇第8节:寄存器压力——寄存器溢出对性能的影响及优化

**摘要:GPU寄存器是最快的存储单元(1周期访问),但数量有限。过高的寄存器使用会导致溢出(变量存入慢速本地内存)或降低占用率(减少并发线程数),严重影响性能。优化方法包括复用变量、使用共享内存替代寄存器数组、限制寄存器数量(--maxrregcount)等。实际测试显示,将寄存器使用从48个降至24个可使性能提升37%。分析工具如Nsight Compute可帮助检测寄存器压力。面试常见问题涉及寄存器溢出的检测与优化策略。

PeterPan的博客 95

【pyTorch学习笔记③】PyTorch基础·上篇

PyTorch是Facebook发布的一款深度学习框架,继承了Torch灵活、动态的编程环境和用户友好的界面,支持以快速和灵活的方式构建动态神经网络,还允许在训练的过程中快速更改代码而不妨碍其性能,支持动态图形等尖端AI模型的能力,是快速实验的理想选择。

菜鸟博客 2825

【异常】Coze/扣子 Workflow 调用报 4200 错误深度解析

Coze API 的。

奶爸的编程之路,也就一周冷个三天 301

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

PyTorch 学习笔记(三):transforms的二十二个方法

本文截取自一个github上千星的火爆教程——《PyTorch 模型训练实用教程》,教程内容主要为在 PyTorch 中训练一个模型所可能涉及到的方法及函数的详解等,本文为作者整理的学习笔记(三),后续会继续更新这个系列,欢迎关注。 项目代码:https://github.com/tensor-yu/PyTorch_Tutorial 系列回顾: PyTorch 学习笔记(一):让PyTo...

公众号/知乎: AI算法札记,欢迎关注交流 2429

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Pytorch学习笔记(三)Pytorch的常用操作记录

查看Pytorch网络的各层输出(feature map)、权重、偏置 在使用Pytorch的时候,我总是在想我怎么看每一层的输出、权重、偏置,下面记录我自己的方法,应该是方式多样,但是我现在的水平没办法评价好坏,如果有更好的办法欢迎留言告知,我会珍惜每次学习的机会!!! weight and bias # Method 1 查看Parameters的方式多样化,直接访问即可 mode...

ROM的博客 5375

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【学习笔记】【Pytorch】三、常用的Transforms

一、Transforms模块介绍 二、transforms.ToTensor类的使用 1.使用说明 2.代码实现 三、transforms.Normalize类的使用 1.使用说明 2.代码实现 四、transforms.Resize类的使用 1.使用说明 2.代码实现 五、transforms.Compose类的使用 1.使用说明 2.代码实现 六、transforms.RandomCrop类的使用 1.使用说明 2.代码实现

qq_45772756的博客 1367

PyTorch学习笔记三

官方文档在torch.opim中,首先先构建一个优化器,传入模型和学习速率,接着调用step()方法进行调参,在每一个batch-size训练过程中,需将上一个batch-size训练的梯度参数进行清0.利用第一节中的损失函数加入优化器,训练10轮。利用损失函数所获得的梯度对各个神经节点进行调参优化。运用损失函数获得的梯度进行反向传播。🟢为更新输出、调整参数提供依据。首先加载数据集,构建神经网络。🟢计算输出值和目标的差距。交叉熵,训练分类问题时使用,公式如下。输入任意维度,输出相同维度。

weixin_50065828的博客 978

PyTorch学习笔记(三)

PyTorch学习笔记(三) 随机抽样 Random sampling torch.manual_seed torch.manual_seed(seed) 设定生成随机数的种子,并返回一个 torch._C.Generator 对象 参数: seed (int or long) – 种子 torch.initial_seed torch.initial_seed() 返回生成随机数的原始种子值(python long) torch.get_rng_state torch.get_rng_state

没有胡子的猫Asimov 1826

pytorch学习笔记(三)

1. 从某个数据集中拿数据,最原始不经过处理的数据(这里用的是sklearn的circle数据集)2. 看看数据什么样,用各种可视化的方法3. 将最原始的数据转成tensor4. 选取合适的模型并构建模型5. 数据集划分(训练集和测试集)6.开始训练:每个epoch得到预测值和实际值的差,计算loss,梯度下降,回传(每个模型都是一样的)7.测试:打印Acc和loss8.找个地方把模型存下来。

m0_52793409的博客 238

(三)pytorch学习笔记

作者:chen_h 微信号 & QQ:862251340 微信公众号:coderpai (一)pytorch学习笔记 (二)pytorch学习笔记 (三)pytorch学习笔记 快速搭建法 Torch 中提供了很多方便的途径, 同样是神经网络, 能快则快, 我们看看如何用更简单的方式搭建同样的回归神经网络. 快速搭建 我们先看看之前写神经网络时用到的步骤. 我们用 net1 代表这种方...

CoderPai的博客 431

Pytorch学习笔记(三)自用

涉及资源 1.官网DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ 2.莫烦python 个人网站 、 b站视频、参考代码、强化学习 3.函数搜索:https://pytorch.org/docs/stable/index.html 系列学习笔记: Pytorch学习笔记(一) Pytorch学习笔记(二) Pytorch学习笔记(三) 本周学习内容: dropout Batch Normolization 环境配置: python=3.7; torch=1

qq_39542170的博客 283

Pytorch学习笔记(三)

(6)在Pytorch中实现自己定义的层: 在Pytorch中实现自己定义的层需要继承torch.autograd.Function类,然后实现其中的forward和backward方法,代码如下所示:# -*- coding:utf-8 -*- import torch from torch.autograd import Variableclass MyReLU(torch.autograd.

kongshuchen的博客 2938
上一篇: pytorch学习笔记二
下一篇: pytorch学习笔记四
StrangeStranger
博客等级 码龄6年 24粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值