1.1 PyTorch张量
张量是PyTorch的基本数据类型。张量是一个多维矩阵,类似于NumPy的ndarrays
按照维度来划分数据类型,零维是标量;一维是向量;二维是二维矩阵;多维是多维矩阵。
以一幅彩色图像为例,可以看为由H*W组成的R、G、B三个维度矩阵,其单位是像素。
1.1.1 初始化张量
张量的用途有很多,不仅可以用于图像的基本数据结构,还可以利用张量来初始化神经网络不同层的权重。
初始化张量方法一:
import torch
x = torch.tensor([[1,2]])
y = torch.tensor([[1],[2]])
初始化张量方法二:
import torch
x = [[1,2]];y=[[1],[2]]
x = torch.tensor(x);y = torch.tensor(y);
1.1.2 初始化张量常用函数
①torch.zeros((3,4)):生成一个张量对象,三行四列
②torch.ones((3,4)):生成一个张量对象,三行四列
③torch.randint(low=0, high=10, size=(3,4)):生成值介于0和10之间(包括小值不包括大值)的三行四列
④torch.rand(3,4):生成具有0和1之间随机数的三行四列。
1.2 张量运算
1.2.1 点乘(*)
import torch
x = torch.tensor([[1,2,3,4],[5,6,7,8]]);print(x*10)
1.2.2 相加(add)
import torch
x = torch.tensor([[1,2,3,4],[5,6,7,8]]);y = x.add(10)
print(x);print(y)
1.2.3重塑数据( view)
import torch
x = torch.tensor([1,2,3,4,5,6,7,8,9,10]);y = x.view(2,5);y1 = x.view(2,-1)
1.2.4 矩阵乘法(matmul)
import torch
x = torch.tensor([1,2,3,4]);y = torch.tensor([[1],[2],[3],[4]]);z = torch.matmul(x,y)
print(x);print(y);print(z)
1.2.5 最大值(max)
import torch
x = torch.tensor([[1,2,3,4],[2,3,4,5]])
all_max = x.max() ;print(all_max)
m,argm = x.max(dim=0) ;print(m,argm)
m,argm = x.max(dim=1) ;print(m,argm)
1.2.6 squeeze、unsqueeze和concatenate的联系和区别
1.2.3 张量对象的自动梯度
1.2.4 PyTorch的张量较NumPy的ndarrays的优势
一句话描述:PyTorch支持GPU,计算速度比ndarrays快很多。
import torch
x = torch.rand(1,6400)
y = torch.rand(6400,5000)
device = 'cuda' if torch.cuda.is_available() else 'cpu'
x,y = x.to(device),y.to(device) # 注册设备
%timeit z=(x@y) #@矩乘的符号
x,y = x.cpu(), y.cpu()
%timeit z=(x@y) #@矩乘的符号
import numpy as np
x = np.random.random((1,6400))
y = np.random.random((6400, 5000))
%timeit z = np.matmul(x,y)
1.3 使用PyTorch构建神经网络
(1)初始化数据集,定义输入(x)和输出(y)值
import torch
X= [[1,2], [3,4], [5,6], [7,8]]
Y = [[3], [7], [11], [15]]
(2)、将输入列表转换成张量对象
X = torch.tensor(x).float()
Y = torch.tensor(y).float()
device = 'cuda' if torch.cuda.is_available() else 'cpu'
X = X.to(device)
Y = Y.to(device)
(3)、定义神经网络结构
import torch.nn as nn
# 继承自nn.Module, nn.Module是所有神经网络模块的基类
class MyNeuralNet(nn.Module):
# 使用__init__方法初始化神经网络的所有组件,调用super().__init__()确保类继承nn.Module
def __init__(self):
super().__init()
# 定义神经网络中的网络层
self.MyNeuralNet = nn.Sequential(
nn.Linear(2,8),
nn.ReLU()
nn.Linear(8,1)
)
def forward(self,x):
return self.MyNeuralNet(x)
(4) 通过执行以下代码访问每个神经网络组件的初始权重
创建MyNeuralNet类对象的实例并将其注册到device:
mynet = MyNeuralNet().to(device)
print(mynet.input_to_hidden_layer.weight)
print(mynet.input_to_hidden_layer.bias)
(5)神经网络的所有参数
mynet.parameters()
for param in mynet.parameters():
print(param)