深度学习——PyTorch入门

PyTorch 张量

Pytorch 用于处理张量,张量是多维数组,例如 n 维 NumPy 数组。但是张量也可以在 GPU 中使用,但在 NumPy 数组的情况下却不可以使用。PyTorch 加速了张量的科学计算,因为它具有各种内置功能。

向量是一维张量,矩阵是二维张量。在 C、C++ 和 Java 中使用的张量和多维数组之间的一个显着区别是张量在所有维度上应该具有相同的列大小。此外,张量只能包含数字数据类型。

张量的两个基本属性是:

shape:指数组或矩阵的维数
Rank:指张量中存在的维数

# 导入 torch
import torch

# 创建张量
t1=torch.tensor([1, 2, 3, 4])
t2=torch.tensor([[1, 2, 3, 4],
				[5, 6, 7, 8],
				[9, 10, 11, 12]])

# 打印张量:
print("Tensor t1: \n", t1)
print("\nTensor t2: \n", t2)

# 张量的秩
print("\nRank of t1: ", len(t1.shape))
print("Rank of t2: ", len(t2.shape))

# 张量的形状
print("\nRank of t1: ", t1.shape)
print("Rank of t2: ", t2.shape)

 

在 PyTorch 中创建张量

在 PyTorch 中有多种创建张量的方法。张量可以包含单一数据类型的元素。我们可以使用 python 列表或 NumPy 数组创建张量。Torch 有 10 种用于 GPU 和 CPU 的张量变体。以下是定义张量的不同方法。

  • torch.Tensor() :它复制数据并创建其张量。它是 torch.FloatTensor 的别名。
  • torch.tensor() :它还复制数据以创建张量;但是,它会自动推断数据类型。
  • torch.as_tensor() :在这种情况下,数据是共享的,在创建数据时不会被复制,并接受任何类型的数组来创建张量。
  • torch.from_numpy() :它类似于 tensor.as_tensor() 但它只接受 numpy 数组。
# 导入 torch 模块
import torch
import numpy as np

# 存储为张量的值列表
data1 = [1, 2, 3, 4, 5, 6]
data2 = np.array([1.5, 3.4, 6.8,
				9.3, 7.0, 2.8])

# 创建张量和打印
t1 = torch.tensor(data1)
t2 = torch.Tensor(data1)
t3 = torch.as_tensor(data2)
t4 = torch.from_numpy(data2)

print("Tensor: ",t1, "Data type: ", t1.dtype,"\n")
print("Tensor: ",t2, "Data type: ", t2.dtype,"\n")
print("Tensor: ",t3, "Data type: ", t3.dtype,"\n")
print("Tensor: ",t4, "Data type: ", t4.dtype,"\n")

在 Pytorch 中重构张量

我们可以在 PyTorch 中根据需要修改张量的形状和大小。我们还可以创建一个 nd 张量的转置。以下是根据需要更改张量结构的三种常用方法:

.reshape(a, b) :返回一个大小为 a,b 的新张量
.resize(a, b) :返回大小为 a,b 的相同张量
.transpose(a, b) :返回在 a 和 b 维中转置的张量

# 导入 torch 模块
import torch

# 定义张量
t = torch.tensor([[1, 2, 3, 4],
				[5, 6, 7, 8],
				[9, 10, 11, 12]])

# 重塑张量
print("Reshaping")
print(t.reshape(6, 2))

# 调整张量的大小
print("\nResizing")
print(t.resize(2, 6))

# 转置张量
print("\nTransposing")
print(t.transpose(1, 0))

 

Pytorch 模块

PyTorch 库模块对于创建和训练神经网络至关重要。三个主要的库模块是 Autograd、Optim 和 nn。

1.Autograd 模块: autograd 提供了轻松计算梯度的功能,无需显式手动实现所有层的前向和后向传递。

为了训练任何神经网络,我们执行反向传播来计算梯度。通过调用 .backward() 函数,我们可以计算从根到叶的每个梯度。

# 导入 torch
import torch

# 创建张量
t1=torch.tensor(1.0, requires_grad = True)
t2=torch.tensor(2.0, requires_grad = True)

# 创建变量和渐变
z=100 * t1 * t2
z.backward()

# 打印渐变
print("dz/dt1 : ", t1.grad.data)
print("dz/dt2 : ", t2.grad.data)

2.Optim Module: PyTorch Optium Module,有助于实现各种优化算法。该软件包包含最常用的算法,如 Adam、SGD 和 RMS-Prop。要使用 torch.optim,我们首先需要构造一个 Optimizer 对象,该对象将保留参数并相应地更新它。首先,我们通过提供我们想要使用的优化器算法来定义优化器。我们在反向传播之前将梯度设置为零。然后为了更新参数,调用 optimizer.step()。

 

optimizer = torch.optim.Adam(model.parameters(), lr=0.01) #定义优化器

optimizer.zero_grad() #将梯度设置为零

optimizer.step() #参数更新

对于不在单个序列中的模型的实现,我们通过继承 nn.Module 类来定义模型。

3.nn 模块:这个包有助于构建神经网络。它用于构建图层。

为了创建一个单层模型,我们可以简单地使用 nn.Sequential() 来定义它。

model = nn.Sequential(nn.Linear(in, out), nn.Sigmoid(), nn.Linear(_in,_out), nn.Sigmoid())

 对于不在单个序列中的模型的实现,我们通过继承 nn.Module 类来定义模型。

class Model (nn.Module) :

		def __init__(self):

			super(Model, self).__init__()

			self.linear = torch.nn.Linear(1, 1)

	def forward(self, x):

			y_pred = self.linear(x)

			return y_pred

PyTorch 数据集和数据加载器

torch.utils.data.Dataset 类包含所有自定义数据集。我们需要实现两个方法,__len__() 和 __get_item__(),来创建我们自己的数据集类。

PyTorch 数据加载器具有一个惊人的特性,即与自动批处理并行加载数据集。因此,它减少了顺序加载数据集的时间,从而提高了速度。

DataLoader(dataset, shuffle=True, sampler=None,
batch_sampler=None, batch_size=32)

PyTorch DataLoader 支持两种类型的数据集:

地图样式数据集:数据项映射到索引。在这些数据集中,__get_item__() 方法用于检索每个项目的索引。
可迭代式数据集:在这些数据集中实现了 __iter__() 协议。数据样本按顺序检索。

使用 PyTorch 构建神经网络

我们将在逐步实现中看到这一点:

1.数据集准备:由于 PyTorch 中的一切都以张量的形式表示,所以我们应该首先使用张量。
2.构建模型:为了构建中性网络,我们首先定义输入层、隐藏层和输出层的数量。我们还需要定义初始权重。权重矩阵的值是使用torch.randn()随机选择的。Torch.randn() 返回一个由来自标准正态分布的随机数组成的张量。
3.前向传播:将数据馈送到神经网络,并在权重和输入之间执行矩阵乘法。这可以使用手电筒轻松完成。
4.损失计算: PyTorch.nn 函数有多个损失函数。损失函数用于衡量预测值与目标值之间的误差。
5.反向传播:用于优化权重。更改权重以使损失最小化。

现在让我们从头开始构建一个神经网络:

# 导入 torch
import torch

# 训练 input(X) 和 output(y)
X = torch.Tensor([[1], [2], [3],
				[4], [5], [6]])
y = torch.Tensor([[5], [10], [15],
				[20], [25], [30]])

class Model(torch.nn.Module):

	# defining layer
	def __init__(self):
		super(Model, self).__init__()
		self.linear = torch.nn.Linear(1, 1)
	
	# 实施前向传递
	def forward(self, x):
		y_pred = self.linear(x)
		return y_pred

model = torch.nn.Linear(1 , 1)

# 定义损失函数和优化器
loss_fn = torch.nn.L1Loss()
optimizer = torch.optim.Adam(model.parameters(), lr = 0.01 )

for epoch in range(1000):
	
	# 使用初始权重预测 y
	y_pred = model(X.requires_grad_())

	# 损失计算
	loss = loss_fn(y_pred, y)

	# 计算梯度
	loss.backward()

	# 更新权重
	optimizer.step()

	optimizer.zero_grad()

# 测试新数据
X = torch.Tensor([[7], [8]])
predicted = model(X)
print(predicted)

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值