PyTorch翻译官网教程-NLP FROM SCRATCH: GENERATING NAMES WITH A CHARACTER-LEVEL RNN

深度学习之QLoRA原理详解及Pytorch实现 【代码】深度学习之QLoRA原理详解及Pytorch实现。 阅读详情

官网链接

NLP From Scratch: Generating Names with a Character-Level RNN — PyTorch Tutorials 2.0.1+cu117 documentation

使用字符级RNN生成名字

这是我们关于“NLP From Scratch”的三篇教程中的第二篇。在第一个教程中</intermediate/char_rnn_classification_tutorial> 我们使用RNN将名字按其原始语言进行分类。这一次,我们将通过语言中生成名字。

> python sample.py Russian RUS
Rovakov
Uantov
Shavakov

> python sample.py German GER
Gerren
Ereng
Rosher

> python sample.py Spanish SPA
Salla
Parer
Allan

> python sample.py Chinese CHI
Chan
Hang
Iun

我们仍然手工制作一个带有几个线性层的小型RNN模型。最大的区别在于,我们不是在读取一个名字的所有字母后预测一个类别,而是输入一个类别并每次输出一个字母。经常预测字符以形成语言(这也可以用单词或其他高阶结构来完成)通常被称为“语言模型”。

推荐阅读:

我假设你至少安装了PyTorch,了解Python,并且理解张量:

了解rnn及其工作原理也很有用:

我还推荐上一篇教程, NLP From Scratch: Classifying Names with a Character-Level RNN

准备数据

从这里(here)下载数据并将其解压缩到当前目录。

有关此过程的更多细节,请参阅最后一篇教程。简而言之,有一堆纯文本文件data/names/[Language].txt 每行有一个名称。我们将每行分割成一个数组,将Unicode转换为ASCII,最后得到一个字典{language: [names ...]}.

from io import open
import glob
import os
import unicodedata
import string

all_letters = string.ascii_letters + " .,;'-"
n_letters = len(all_letters) + 1 # Plus EOS marker

def findFiles(path): return glob.glob(path)

# Turn a Unicode string to plain ASCII, thanks to https://stackoverflow.com/a/518232/2809427
def unicodeToAscii(s):
    return ''.join(
        c for c in unicodedata.normalize('NFD', s)
        if unicodedata.category(c) != 'Mn'
        and c in all_letters
    )

# Read a file and split into lines
def readLines(filename):
    with open(filename, encoding='utf-8') as some_file:
        return [unicodeToAscii(line.strip()) for line in some_file]

# Build the category_lines dictionary, a list of lines per category
category_lines = {}
all_categories = []
for filename in findFiles('data/names/*.txt'):
    category = os.path.splitext(os.path.basename(filename))[0]
    all_categories.append(category)
    lines = readLines(filename)
    category_lines[category] = lines

n_categories = len(all_categories)

if n_categories == 0:
    raise RuntimeError('Data not found. Make sure that you downloaded data '
        'from https://download.pytorch.org/tutorial/data.zip and extract it to '
        'the current directory.')

print('# categories:', n_categories, all_categories)
print(unicodeToAscii("O'Néàl"))

输出

# categories: 18 ['Arabic', 'Chinese', 'Czech', 'Dutch', 'English', 'French', 'German', 'Greek', 'Irish', 'Italian', 'Japanese', 'Korean', 'Polish', 'Portuguese', 'Russian', 'Scottish', 'Spanish', 'Vietnamese']
O'Neal

创建网络

这个网络扩展了上一篇教程的RNN(the last tutorial’s RNN),为类别张量增加了一个额外的参数,它与其他参数连接在一起。category张量是一个独热向量就像输入的字母一样。

我们将把输出解释为下一个字母出现的概率。采样时,最可能的输出字母被用作下一个输入字母。

我添加了第二个线性层o2o(在将hidden和output结合起来之后),让其更有影响力。还有一个dropout层,它以给定的概率(这里是0.1)随机地将部分输入归零,通常用于模糊输入以防止过拟合。在这里,我们在网络的末尾使用它来有意地增加一些混乱和增加采样的多样性。

import torch
import torch.nn as nn

class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size

        self.i2h = nn.Linear(n_categories + input_size + hidden_size, hidden_size)
        self.i2o = nn.Linear(n_categories + input_size + hidden_size, output_size)
        self.o2o = nn.Linear(hidden_size + output_size, output_size)
        self.dropout = nn.Dropout(0.1)
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, category, input, hidden):
        input_combined = torch.cat((category, input, hidden), 1)
        hidden = self.i2h(input_combined)
        output = self.i2o(input_combined)
        output_combined = torch.cat((hidden, output), 1)
        output = self.o2o(output_combined)
        output = self.dropout(output)
        output = self.softmax(output)
        return output, hidden

    def initHidden(self):
        return torch.zeros(1, self.hidden_size)


训练

训练准备

首先,辅助函数获得(类别,行)的随机对:

import random

# Random item from a list
def randomChoice(l):
    return l[random.randint(0, len(l) - 1)]

# Get a random category and random line from that category
def randomTrainingPair():
    category = randomChoice(all_categories)
    line = randomChoice(category_lines[category])
    return category, line

对于每个时间步(即对于训练词中的每个字母),网络的输入将是(category, current letter, hidden state),输出将是(next letter, next hidden state)。对于每个训练集,我们需要类别,一组输入字母,和一组输出/目标字母。

由于我们预测每个时间步当前字母的下一个字母,因此字母对是一行中连续字母的组-例如,"ABCD<EOS>" 我们将创建(“A”,“B”),(“B”,“C”),(“C”,“D”),(“D”,“EOS”)。

category张量是一个独热张量,大小为<1 x n_categories>. 当训练时,我们在每个时间步向网络提供它,这是一个设计选择,它可以作为初始隐藏状态的一部分或其他策略。

# One-hot vector for category
def categoryTensor(category):
    li = all_categories.index(category)
    tensor = torch.zeros(1, n_categories)
    tensor[0][li] = 1
    return tensor

# One-hot matrix of first to last letters (not including EOS) for input
def inputTensor(line):
    tensor = torch.zeros(len(line), 1, n_letters)
    for li in range(len(line)):
        letter = line[li]
        tensor[li][0][all_letters.find(letter)] = 1
    return tensor

# ``LongTensor`` of second letter to end (EOS) for target
def targetTensor(line):
    letter_indexes = [all_letters.find(line[li]) for li in range(1, len(line))]
    letter_indexes.append(n_letters - 1) # EOS
    return torch.LongTensor(letter_indexes)

为了在训练过程中方便起见,我们将创建一个randomTrainingExample函数来获取一个随机的(category, line)对。并将它们转换为所需的(category, input, target)张量。

# Make category, input, and target tensors from a random category, line pair
def randomTrainingExample():
    category, line = randomTrainingPair()
    category_tensor = categoryTensor(category)
    input_line_tensor = inputTensor(line)
    target_line_tensor = targetTensor(line)
    return category_tensor, input_line_tensor, target_line_tensor

训练网络

与只使用最后一个输出的分类相反,我们在每一步都进行预测,因此我们在每一步都计算损失。

自动梯度的魔力让你可以简单地将每一步的损失加起来,并在最后进行反向调用。

criterion = nn.NLLLoss()

learning_rate = 0.0005

def train(category_tensor, input_line_tensor, target_line_tensor):
    target_line_tensor.unsqueeze_(-1)
    hidden = rnn.initHidden()

    rnn.zero_grad()

    loss = torch.Tensor([0]) # you can also just simply use ``loss = 0``

    for i in range(input_line_tensor.size(0)):
        output, hidden = rnn(category_tensor, input_line_tensor[i], hidden)
        l = criterion(output, target_line_tensor[i])
        loss += l

    loss.backward()

    for p in rnn.parameters():
        p.data.add_(p.grad.data, alpha=-learning_rate)

    return output, loss.item() / input_line_tensor.size(0)

为了跟踪训练需要多长时间,我添加了一个timeSince(timestamp)函数,它返回一个人类可读的字符串:

import time
import math

def timeSince(since):
    now = time.time()
    s = now - since
    m = math.floor(s / 60)
    s -= m * 60
    return '%dm %ds' % (m, s)

训练和往常一样——调用train多次并等待几分钟,在每个print_every示例中打印当前时间和损失,并在all_losses中保存每个plot_every示例的平均损失,以便稍后绘制。

rnn = RNN(n_letters, 128, n_letters)

n_iters = 100000
print_every = 5000
plot_every = 500
all_losses = []
total_loss = 0 # Reset every ``plot_every`` ``iters``

start = time.time()

for iter in range(1, n_iters + 1):
    output, loss = train(*randomTrainingExample())
    total_loss += loss

    if iter % print_every == 0:
        print('%s (%d %d%%) %.4f' % (timeSince(start), iter, iter / n_iters * 100, loss))

    if iter % plot_every == 0:
        all_losses.append(total_loss / plot_every)
        total_loss = 0

输出

0m 37s (5000 5%) 3.1506
1m 15s (10000 10%) 2.5070
1m 55s (15000 15%) 3.3047
2m 33s (20000 20%) 2.4247
3m 12s (25000 25%) 2.6406
3m 50s (30000 30%) 2.0266
4m 29s (35000 35%) 2.6520
5m 6s (40000 40%) 2.4261
5m 45s (45000 45%) 2.2302
6m 24s (50000 50%) 1.6496
7m 2s (55000 55%) 2.7101
7m 41s (60000 60%) 2.5396
8m 19s (65000 65%) 2.5978
8m 57s (70000 70%) 1.6029
9m 35s (75000 75%) 0.9634
10m 13s (80000 80%) 3.0950
10m 52s (85000 85%) 2.0512
11m 30s (90000 90%) 2.5302
12m 8s (95000 95%) 3.2365
12m 47s (100000 100%) 1.7113

绘制损失

绘制all_losses的历史损失图显示了网络的学习情况:

import matplotlib.pyplot as plt

plt.figure()
plt.plot(all_losses)

输出

[<matplotlib.lines.Line2D object at 0x7fa0159af880>]

网络采样

为了进行示例,我们给网络一个字母并询问下一个字母是什么,将其作为下一个字母输入,并重复直到EOS令牌。

  • 为输入类别、起始字母和空隐藏状态创建张量
  • 创建一个以字母开头的字符串output_name
  • 最大输出长度
    • 将当前的字母提供给网络
    • 从最高输出中获取下一个字母,以及下一个隐藏状态
    • 如果字母是EOS,就停在这里
    • 如果是普通字母,添加到output_name并继续
  • 返回最终名称

与其给它一个起始字母,另一种策略是在训练中包含一个“字符串起始”标记,并让网络选择自己的起始字母。

max_length = 20

# Sample from a category and starting letter
def sample(category, start_letter='A'):
    with torch.no_grad():  # no need to track history in sampling
        category_tensor = categoryTensor(category)
        input = inputTensor(start_letter)
        hidden = rnn.initHidden()

        output_name = start_letter

        for i in range(max_length):
            output, hidden = rnn(category_tensor, input[0], hidden)
            topv, topi = output.topk(1)
            topi = topi[0][0]
            if topi == n_letters - 1:
                break
            else:
                letter = all_letters[topi]
                output_name += letter
            input = inputTensor(letter)

        return output_name

# Get multiple samples from one category and multiple starting letters
def samples(category, start_letters='ABC'):
    for start_letter in start_letters:
        print(sample(category, start_letter))

samples('Russian', 'RUS')

samples('German', 'GER')

samples('Spanish', 'SPA')

samples('Chinese', 'CHI')

输出

Rovaki
Uarinovev
Shinan
Gerter
Eeren
Roune
Santera
Paneraz
Allan
Chin
Han
Ion

练习

  • 尝试使用不同数据集category -> line,例如,
    • Fictional series -> Character name
    • Part of speech -> Word
    • Country -> City
  • 使用“start of sentence”标记,这样就可以在不选择起始字母的情况下进行抽样
  • 拥有一个更大的和/或更好的网络,可以获得更好的结果
    • 尝试使用 nn.LSTM 和 nn.GRU 网络层
    • 将这些RNN组合成一个更高级的网络

     

PyTorch、CPU、GPU 与 CUDA 深度解析:一次张量加法背后的四层世界 本文厘清PyTorch、CPU、GPU与CUDA的层级关系:PyTorch是编程接口,CPU负责控制与调度,CUDA是让CPU指挥GPU的并行编程平台,GPU则是实际执行计算的加速器。四者非并列,而是分层协作。以x + y为例,从Python前端到算子分发、CUDA运行时,最终在GPU硬件上执行。关键认知包括:GPU并非万能加速器,小任务因开销大反而更慢;.to('cuda')仅搬运数据,不改变代码逻辑;算子性能受算术强度与内存带宽制约。理解此链路是优化深度学习性能的前提。 阅读详情

相关推荐

世界模型和大语言模型结合开发自动驾驶算法

摘要:自动驾驶系统开发中,融合世界模型和大语言模型可显著提升效率和安全性。世界模型负责环境感知与预测(如目标检测、轨迹预测),而大语言模型优化代码生成、决策解释等环节。实施路径包括需求分析(1-2周)、模型开发(2-4个月)、模拟测试(1-2个月)、实车测试(2-3个月)和合规优化(1-2个月),总周期6-12个月。关键技术工具包括PyTorch/TensorFlow、CARLA模拟器和ROS系统,核心设计理念强调模块化、安全优先和敏捷迭代。示例代码展示了YOLO目标检测与大语言模型决策建议的集成方案。该方

ponygame的博客 827

GENERATING NAMES WITH A CHARACTER-LEVEL RNN教程解析

pytorch RNN 名字生成代码解析

lyyiangang的博客 1523

EMC案例:解决千兆网口RTL8211F EMI问题

摘要:本文分析了Amlogic S812平台OEM项目中RTL8211F-CG千兆网卡EMI辐射超标问题。发现百兆测试时25MHz时钟有3dB余量,但千兆125MHz时钟导致超标。问题根源包括:未关闭PHY芯片悬空CLKOUT引脚、TX/RXCLK端RC位置错误、包地不完整及参考地缺失。解决方案涉及软件关闭无用时钟、优化RC布局、加强包地与打孔、调整共模电感位置,并在HDMI 3.3V加磁珠。关键结论指出千兆网125MHz时钟需严格包地打孔,且RC取值需平衡EMI与通信性能。

电子绿洲的博客 1284

[翻译Pytorch教程]NLP从零开始:使用字符级RNN进行名字生成

翻译自官网手册:NLP From Scratch: Generating Names with a Character-Level RNN Author: Sean Robertson 原文github代码 这是NLP从零开始三个教程的第二个。在第一个教程char_rnn_classification_tutorial中,使用RNN将名字按照其来源的语言进行了分类。本教程将进行名字生成。 >...

wmq104的博客 642

保姆级避坑指南:在Ubuntu 22.04上从零编译Autoware.universe(含ROS2 Humble和CUDA配置)

本文提供了一份详细的Autoware.universe编译指南,涵盖Ubuntu 22.04系统优化、ROS2 Humble安装避坑、CUDA配置及Demo运行技巧。通过分步操作和实战经验,帮助开发者高效完成环境搭建,避免常见错误,提升自动驾驶开发效率。

weixin_30642561的博客 352

2.4 提示词优化

我们在使用大模型的时候,同一任务使用不同表述的提示词,可能得到差异巨大的结果,因为模型的性能高度依赖输入提示词的质量。我们可以通过提示词优化来更高效地获取理想输出。

从0到1,突破自己 1010

Generating Names with a Character-Level RNN

目录结构: 1.准备数据 2.创建网络 3.训练 3.1为训练做准备 3.2训练网络 3.3画loss损失率 4.检验网络 3.1为训练做准备 EOS是 3.2训练网络 all_letters = string.ascii_letters + " .,;'-" n_letters = len(all_letters) + 1 # Plus EOS marker cr

walden的博客 330

open3d将某一时间序列下的彩色图和深度图批量转换成点云(python)

必备条件需要3D相机生成的彩色图及深度图,注意要将深度图与彩色图对齐(一般3D相机自带对齐算子),以及3D相机的彩色图内参(相机自带内参获取功能)。有了此彩色图、对齐后的深度图以及相机内参就能使用open3d生成彩色点云了.

吾名招财的博客 315

pytorch实现generating names with a character-level RNN

papers The Unreasonable Effectiveness of Recurrent Neural Networks https://karpathy.github.io/2015/05/21/rnn-effectiveness/ Understanding LSTM Networks https://colah.github.io/posts/2015-08-Understan...

DarrenXf的专栏 934

【C/C++ 性能优化】了解cpu 从而进行C++ 高效编程

在当代软件开发领域,CPU(Central Processing Unit,中央处理器)的性能优化一直是一个核心议题。尤其是对于C++开发者而言,无论是在Linux平台还是其他操作系统中,都需要深刻理解CPU的工作原理以及如何充分利用CPU资源,以确保软件运行的高效性和稳定性。正如计算机科学家Donald Knuth在《计算机程序设计的艺术》中所说:“过早的优化是万恶之源”,然而,这并不意味着我们应该忽视性能优化——相反,我们需要在正确的时间以正确的方式进行优化。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 4751

SEGGER Embedded Studio初体验

先楫HPM5E00EVK开发环境搭建

hywing's blog 1110

从零开始 NLP:使用字符级 RNN 生成名字

从零开始 NLP:使用字符级 RNN 生成名字 pytorch官方例子学习心得 具体任务: 根据语言生成名字 官方项目连接 项目流程: 数据预处理 原始数据 构建模型 训练网络 可视化结果 ...

qq_36646531的博客 635

ubuntu20.04中配置Pyrep和CoppeliaSim

在Ubuntu20.04中配置 Pyrep ,实现应用Python语言的机器人在 Vrep(CoppeliaSim)中的虚拟仿真。

加斯顿工程师的博客 3375

Scikit-Learn 1.8引入Array,支持 PyTorch 与 CuPy 张量的原生 GPU 加速

Scikit-Learn 1.8.0 更新引入了实验性的 Array API 支持。这意味着 CuPy 数组或 PyTorch 张量现在可以直接在 Scikit-

2601_96798737的博客 207

NTscan扫描工具

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Google 与 Meta 联合推出 TorchTPU,PyTorch 原生支持 TPU 硬件

Google 和 Meta 合作开源 TorchTPU 项目,让 PyTorch 工作负载可以原生运行在 TPU 上。

wfly blog 74

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

姿态估计(Pose Estimation)深度解析:从人体关键点检测到主流算法与 PyTorch 实战

姿态估计(Pose Estimation)是计算机视觉领域的一项重要技术,主要任务是从图像或视频中识别人体、动物或物体的关键点,并根据关键点之间的空间关系推断目标的姿态结构。简单来说,姿态估计就是让计算机理解一个人的身体姿势。例如,当我们输入一张包含人体的图片时,姿态估计算法可以自动识别:头部、鼻子、眼睛等面部关键点。左右肩膀、肘部和手腕。左右髋部、膝盖和脚踝。身体各个关节之间的连接关系。最终,模型会将这些关键点连接起来,形成一张人体骨架图。

2503_90237586的博客 344

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

机器学习教程,从入门到精通,深度学习入门语法知识点完全指南(PyTorch 版)(12)

本文为零基础读者量身定制的PyTorch深度学习入门指南,系统讲解深度学习核心原理与实战语法。从神经元、激活函数、损失函数等基础概念入手,结合Sigmoid、ReLU、MSE、CrossEntropy等关键知识点,辅以可运行的PyTorch代码示例,逐行注释详解。涵盖线性回归、CNN、GAN、ResNet等八大典型应用,揭示其在推荐系统、自动驾驶、医疗影像等企业场景中的实际价值,帮助读者快速掌握“原理—框架—应用”全链路技能。

qq_45746668的博客 381

【深度学习项目实战·33】自定义数据集:把自己的图片接入PyTorch

本文聚焦自定义数据集的构建与验证,解决“图片如何对应标签”的核心问题。通过构建包含路径、标签、ID与分组信息的标注表,实现样本可追溯;设计ManifestDataset类,统一图像读取、变换与张量输出格式;强调数据检查、固定类别映射与数据契约的重要性,确保训练前数据闭环可靠。后续将进入数据增强与划分环节。

银尘博客 195

第22章 实现一个完整的 RAG 系统(PyTorch) (终章)

本章构建了一个完整的本地RAG系统,集成BGE嵌入、Chroma向量库、BM25与RRF混合检索、BGE重排序器及Qwen2.5-7B-Instruct生成模型。通过结构化分块、增量索引、带引用的Prompt设计与拒答机制,实现精准问答。基于Recall@K与MRR量化评估各组件贡献,实测在RTX 4090上完成端到端推理,兼顾性能与可解释性,具备生产可用性。

AI服务生活 379

【AI 开发从入门到进阶 · 04】PyTorch 第一课:Tensor、自动求导与那套万能的「五步训练循环」

本文系统介绍PyTorch入门核心内容:为何选择PyTorch(动态图、生态优势)、Tensor的自动求导机制、构建神经网络的四大组件(nn.Module、Loss、Optimizer、DataLoader),并通过MNIST手写数字识别实战演示“五步训练循环”——前向传播、计算损失、反向传播、清零梯度、参数更新。强调zero_grad()、no_grad()、CrossEntropyLoss不加Softmax等关键细节,附可视化分析与排错清单。下篇将深入CNN卷积网络,提升图像分类性能。

信息安全领域优质创作者|操作系统领域专家 160

PyTorch强化学习实战(35)——多智能体强化学习

在本节中,我们将介绍多智能体强化学习 (MARL),这是强化学习 (Reinforcement Learning, RL) 和深度强化学习的一个相对较新的方向,涉及多个智能体在环境中进行交互的情况。在现实生活中,这类问题出现在宽带通信网络、物联网等场景中。在本节中,我们将简要介绍 MARL,并在简单环境中进行一些实验。在实验中,我们将采用一种简单的方法,让智能体共享我们正在优化的策略,但观察将从每个智能体的视角出发,并包含其他智能体位置的信息。

盼小辉丶的博客 222

基于深度学习的塑料类型图像分类研究(Python+PyTorch+Django完整实现)

本课题围绕塑料回收分拣场景,完成基于深度学习的塑料类型图像分类研究。项目使用公开塑料识别数据集,覆盖六类常见塑料,先以ResNet18预训练特征做错标检测,自动隔离可疑样本并复测清洗效果,再按类别分层划分数据集;模型选用ResNet50进行迁移学习,训练中引入标签平滑与EMA应对标签噪声,以宏平均F1,各类别召回和混淆矩阵作为主要评估指标;训练完成的模型导出为ONNX格式,由Django后端加载推理,Vue前端实现图片上传与结果展示,形成从数据,训练到应用的完整闭环,可作为深度学习方向毕业设计的实现参考。

WEIXIN_JSJBSZDS的博客 118

深入理解 PyTorch FlexAttention:从 Score Mod 到 Mask Mod 的稀疏加速之道

score_mod:对分数做数值变换# 这里演示一个简单的"按 query 位置缩放"的变换# score: 当前 (b, h, q_idx, kv_idx) 位置的分数标量# 返回变换后的分数return score * 1.0 # 恒等变换,实际可替换为任意数值操作# mask_mod:返回布尔值,True 表示该位置参与计算score_mod和mask_mod的签名都是,区别在于score_mod额外接收当前分数score并返回新分数,而mask_mod只返回布尔值。

Maxwell_Newton的博客 506

PyTorch中Tensor是什么? 与NumPy数组有什么区别?

简单来说,Tensor 是 PyTorch 中最核心的数据结构,是一个支持 GPU 加速和自动微分的多维数组。在 PyTorch 中,Tensor 可以理解为任意维度的数组容器 —— 0 维是标量,1 维是向量,2 维是矩阵,3 维及以上就是高维张量。这是训练神经网络的关键。特别地,CPU 上的 Tensor 与 NumPy 数组共享内存,一个变化会影响另一个,非常高效。掌握 Tensor 是 PyTorch 入门的第一步,理解它和 NumPy 的关系与区别,能帮你更快地上手深度学习。

teach2004的博客 176

Pytorch【8】模型保存与加载(断点续训、GPU/CPU兼容踩坑)

前面我们已经掌握:张量、自动求导、网络搭建、损失优化、Dataset+DataLoader数据流水线。模型训练好之后,我们需要把成果存下来;训练中途中断,也需要从上次位置继续训练。只保存权重✅【工业界推荐,体积小、灵活】直接保存整个模型❌【简单但不推荐,兼容性差】state_dict是一个字典,key是参数名,value是权重张量,只存参数,不存代码结构。

Beforthing的博客 212

Pytorch【10】卷积神经网络CNN实战|卷积、池化、padding、stride,CNN训练MNIST

上一篇我们用全连接层完成MNIST分类。把28×28二维图像直接Flatten成一维向量,丢失像素之间空间位置关系参数数量巨大,容易过拟合卷积层Conv、池化层Pool、激活函数卷积:滑动卷积核提取局部特征;池化:降采样、压缩特征图,减少计算量。局部感受野:卷积核只看一小块区域,符合图像特征局部相关性权值共享:一张图共用同一套卷积核,大幅减少参数量平移不变性:同一个特征,在图里左右移动依然可以被识别。

Beforthing的博客 157
上一篇: PyTorch翻译官网教程-NLP FROM SCRATCH: CLASSIFYING NAMES WITH A CHARACTER-LEVEL RNN
下一篇: PyTorch翻译官网教程-NLP FROM SCRATCH: TRANSLATION WITH A SEQUENCE TO SEQUENCE NETWORK AND ATTENTION
poorCoder_
博客等级 码龄10年 129粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值