[作业/人工智能]作业1-Pytorch实现反向传播

分享

关于Python使用的一些个人分享,

包管理

在日常学习当中,我们完成任务一般只用到特定的库,且使用的Python版本不完全相同(尤其是一些仅存在于Python2.7的包),为了方便管理和打包,

我们可以安装多个版本Python,每个只安装特定模块,

完成特定任务(如机器学习相关算法)使用时在Pycharm中导入对应环境即可。
请添加图片描述

另外,使用开源环境Anaconda3对于包管理十分有效,十分推荐用于机器学习、数学分析等相关工作。

虚拟环境

在项目开发时,还推荐使用Pythonvenv,它可以有效和本机的全局Python环境隔离开,每个项目都可以拥有独立的依赖包环境,这样就可以做到互不影响。

# 在Windows环境下
# 创建新的虚拟环境
python3 -m venv new_environment_path
# 激活虚拟环境
cd new_environment_path
./Scripts/activate
# 推出虚拟环境
deactivate
# 包安装可以使用PIP或requirements.txt安装

在Pycharm当中,也可以基于所选版本环境,方便的创建虚拟环境,
请添加图片描述

自动求导机制

autograd包为张量上的所有操作提供了自动求导机制,可以做到在运行中确定反向传播。

Pytorch中每个变量都存在两个属性,requires_gradvolatile.如果requires_grad为True,将会自动追踪对张量的操作,完成操作后,可以使用.backward()自动计算所有梯度。

import torch
from torch.autograd import Variable

x = Variable(torch.Tensor([2]), requires_grad=True)
y = x + 1
z = y ** 2
# 使用自动求导
z.backward()
print(x.grad)

该函数求导为2x+2,2处的导数为6。
请添加图片描述

反向传播

在学习中使用了博主Joker-Tong问题和代码:

问题简述:已知学习时间x与分数y的三组数据,推断x=4时的y值

import torch
import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# 设置权重W
w = torch.tensor([1.0])  # 假设 w = 1.0的情况
w.requires_grad = True

def forward(x):  # y^ = wx
    return x * w  # w是tensor 所以 这个乘法自动转换为tensor数乘 , x被转化成tensor 这里构建了一个计算图
def loss(x, y):  # 计算单个的误差 : 损失
    '''
    每调用一次loss函数,计算图自动构建一次
    :param x:
    :param y:
    :return:
    '''
    y_pred = forward(x)
    return (y_pred - y) ** 2

eli = []
lli = []
print('predict (before training)', 4, forward(4).item())
for epoch in range(100):  # 每轮输出 w的值和损失 loss
    for x, y in zip(x_data, y_data):
        l = loss(x, y)
        l.backward()  # 自动求梯度
        print('\tgrad:', x, y, w.grad.item())
        w.data = w.data - 0.01 * w.grad.data    # 权重的数值更新,纯数值的修改 如果不用.data会新建计算图
        # 如果这里想求平均值 其中的累加操作 要写成sum += l.item()
        w.grad.data.zero_()     # 清空权重里梯度的数据,不然梯度会累加
    eli.append(epoch)
    lli.append(l.item())
    print('progress:', epoch + 1, l.item())
print('Predict (after training)', 4, forward(4).item())

# 绘制函数
plt.plot(eli, lli)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()

请添加图片描述

​ Loss变化图

轮次1:
请添加图片描述

轮次10:
请添加图片描述

最后轮次与预测结果:
请添加图片描述
到第100轮次时,根据w预测的结果数值逼近8,相当接近假设为线性函数的取值。

附参考文章:

pytorch(三) Back Propagation 反向传播 (附详细代码+图解计算图)_Joker-Tong的博客-CSDN博客_pytorch反向传播代码@Joker-Tong

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 PyTorch 实现 Word2Vec 的基本步骤: 1. 数据预处理:将原始文本数据转换为神经网络可以理解的形式。可以使用 NLTK 等自然语言处理库来进行分词、去停用词等操作。 2. 构建神经网络模型:Word2Vec 通常使用两种架构模型:CBOW(Continuous Bag of Words)和 Skip-gram。CBOW 模型从上下文中预测中心词,Skip-gram 模型从中心词预测上下文。这里以 Skip-gram 为例。 3. 定义损失函数:Word2Vec 的目标是最大化词向量之间的相似度,可以使用 softmax 函数和交叉熵作为损失函数。 4. 训练模型:使用反向传播算法和随机梯度下降法来更新模型的参数,使得损失函数最小化。 下面是一个简单的 PyTorch 实现代码: ``` import torch import torch.nn as nn import torch.optim as optim class SkipGram(nn.Module): def __init__(self, vocab_size, embedding_dim): super(SkipGram, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.linear = nn.Linear(embedding_dim, vocab_size) def forward(self, center_word): center_embed = self.embeddings(center_word) out = self.linear(center_embed) log_probs = nn.functional.log_softmax(out, dim=1) return log_probs # 定义数据和超参数 data = ['I', 'love', 'NLP', 'and', 'deep', 'learning'] vocab_size = len(set(data)) embedding_dim = 10 batch_size = 1 learning_rate = 0.001 # 定义模型、损失函数和优化器 model = SkipGram(vocab_size, embedding_dim) criterion = nn.NLLLoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate) # 训练模型 for epoch in range(100): for i in range(len(data)): center_word = torch.tensor([i]) log_probs = model(center_word) loss = criterion(log_probs, torch.tensor([i])) optimizer.zero_grad() loss.backward() optimizer.step() # 获取词向量 word_embeddings = model.embeddings.weight.detach().numpy() ``` 这个实现很简单,只能处理单个词语,处理文本需要使用更复杂的方法。需要注意的是,Word2Vec 训练需要大量的数据和计算资源,特别是在大规模语料库上训练时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值