d2l基础LeNet实现与ch6各类基础函数讲解

补充d2l.torch库里面缺失train_ch3函数 深度学习 d2l库 阅读详情
AI摘要

文章详细介绍了如何使用PyTorch实现LeNet神经网络,包括网络结构搭建、数据集调整、GPU上的训练过程以及训练命令行。在数据集改正部分,针对内存限制调整了数据加载的线程数。训练过程中,讨论了loss函数的不同reduction选项对训练的影响,并提供了简化后的训练过程显示方式。

众所周知第七章在复现各大神经网络的时候也会用到ch6定义的各种函数,为了方便理解其中的细节,在这里具体讲解一下!

目录

1.LeNet实现

1.1net搭建

1.2数据集改正

1.3存储到gpu上的验证集

2.ch6训练

2.2loss探索

2.3改编版显数函数

2.4训练命令行


1.LeNet实现

1.1net搭建

  这里使用Seq简单复现即可,没啥好说的。

  注意:在Sequential里面也是可以写进自己的类的,详细见5_1。

            nn.Flatten()是将张量拉成(bs,-1)维度的张量

            注意最后送到全连接的input是需要自己算的!另外激活函数为Sigmoid

net = nn.Sequential(
    nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
    nn.AvgPool2d(kernel_size=2, stride=2),
    nn.Flatten(),
    nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
    nn.Linear(120, 84), nn.Sigmoid(),
    nn.Linear(84, 10))
X = torch.rand(size=(1, 1, 28, 28), dtype=torch.float32)
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__,'output shape: \t',X.shape)

'''
Conv2d output shape: 	 torch.Size([1, 6, 28, 28])
Sigmoid output shape: 	 torch.Size([1, 6, 28, 28])
AvgPool2d output shape: 	 torch.Size([1, 6, 14, 14])
Conv2d output shape: 	 torch.Size([1, 16, 10, 10])
Sigmoid output shape: 	 torch.Size([1, 16, 10, 10])
AvgPool2d output shape: 	 torch.Size([1, 16, 5, 5])
Flatten output shape: 	 torch.Size([1, 400])
Linear output shape: 	 torch.Size([1, 120])
Sigmoid output shape: 	 torch.Size([1, 120])
Linear output shape: 	 torch.Size([1, 84])
Sigmoid output shape: 	 torch.Size([1, 84])
Linear output shape: 	 torch.Size([1, 10])
'''

  简单用一个28的向量(与FM单张图片hw相同)看一下结构,注意卷积尺寸计算公式:

o=[(i+2p-k)/s]+1这个公式对应正方形尺寸图片卷积尺寸

1.2数据集改正

  原始的num_works=4,这里笔者的电脑太拉,用4的话内存不够用,所以改成2(如果2还不行直接上0)

def load_data_fashion_mnist_nw2(batch_size, resize=None):
    """下载Fashion-MNIST数据集,然后将其加载到内存中"""
    trans = [transforms.ToTensor()]
    if resize:
        trans.insert(0, transforms.Resize(resize))
    trans = transforms.Compose(trans)
    mnist_train = torchvision.datasets.FashionMNIST(
        root="../data", train=True, transform=trans, download=True)
    mnist_test = torchvision.datasets.FashionMNIST(
        root="../data", train=False, transform=trans, download=True)
    return (data.DataLoader(mnist_train, batch_size, shuffle=True,
                            num_workers=2),
            data.DataLoader(mnist_test, batch_size, shuffle=False,
                            num_workers=2))

  然后设置loader,注意这里要用上面该过nw的函数:

batch_size = 128
train_iter, test_iter = load_data_fashion_mnist_nw2(batch_size=batch_size)

1.3存储到gpu上的验证集

  重头戏之一,存储到gpu上的验证!相关gpu的设置见ch5_5。

  本质是使用gpu设置对evaluate_accuracy进行修改:

def evaluate_accuracy_gpu(net, data_iter, device=None): #@save
    """使⽤GPU计算模型在数据集上的精度"""
    if isinstance(net, nn.Module):
        net.eval() # 设置为评估模式
        if not device:
            device = next(iter(net.parameters())).device
    '''正确预测的数量,总预测的数量'''
    metric = d2l.Accumulator(2)
    with torch.no_grad():
        for X, y in data_iter:
            if isinstance(X, list):
                '''BERT微调所需的(之后将介绍)'''
                X = [x.to(device) for x in X]
            else:
                X = X.to(device)
            y = y.to(device)
            metric.add(d2l.accuracy(net(X), y), y.numel())
        return metric[0] / metric[1]

  开始的device=None,如果开始没有指定device,则看net里面的参数中的device是啥,然后设置成net参数里面的device,也是保证统一。

  再将每个loader中的数据挪到device中,如果是个list那就每一个都挪,如果是tensor的话就挪一次。对应的y也要挪到gpu上,一般y都是tensor所以挪一次就好。

  这里计算的时候用到了之前讲过的accuracy,在此再看一下,最后返回的是y_hat与y预测类别正确的数量。

def accuracy(y_hat, y):  # @save
    """计算预测正确的数量"""
    if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:
        y_hat = y_hat.argmax(axis=1)
    cmp = y_hat.type(y.dtype) == y
    return float(cmp.type(y.dtype).sum())

  在这里补充一下,经过了.argmax后,维度降成1维,每个元素代表每个图片的预测种类,与y一样

2.ch6训练

  由于这个函数实在是太重要了,所以我直接把它设成标题1。

  先上原版代码:首先是比ch3多了gpu设置。

def train_ch6(net, train_iter, test_iter, num_epochs, lr, device):
    """⽤GPU训练模型(在第六章定义)"""
    def init_weights(m):
        if type(m) == nn.Linear or type(m) == nn.Conv2d:
            nn.init.xavier_uniform_(m.weight)
    net.apply(init_weights)
    print('training on', device)
    net.to(device)
    optimizer = torch.optim.SGD(net.parameters(), lr=lr)
    loss = nn.CrossEntropyLoss()
    animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs],
                            legend=['train loss', 'train acc', 'test acc'])
    timer, num_batches = d2l.Timer(), len(train_iter)
    for epoch in range(num_epochs):
        # 训练损失之和,训练准确率之和,样本数
        metric = d2l.Accumulator(3)
        net.train()
        for i, (X, y) in enumerate(train_iter):
            timer.start()
            optimizer.zero_grad()
            X, y = X.to(device), y.to(device)
            y_hat = net(X)
            l = loss(y_hat, y)
            l.backward()
            optimizer.step()
            with torch.no_grad():
                metric.add(l * X.shape[0], d2l.accuracy(y_hat, y), X.shape[0])
            timer.stop()
            train_l = metric[0] / metric[2]
            train_acc = metric[1] / metric[2]
            if (i + 1) % (num_batches // 5) == 0 or i == num_batches - 1:
                animator.add(epoch + (i + 1) / num_batches,
                            (train_l, train_acc, None))
        test_acc = evaluate_accuracy_gpu(net, test_iter)
        animator.add(epoch + 1, (None, None, test_acc))
    print(f'loss {train_l:.3f}, train acc {train_acc:.3f}, '
        f'test acc {test_acc:.3f}')
    print(f'{metric[2] * num_epochs / timer.sum():.1f} examples/sec '
        f'on {str(device)}')

   初始化weight,如果使用了全连接层或者卷积层,则用xavier初始化权重。
   在此补充xavier作用:根据输入输出的大小,使得再用随机数的时候,各个随机数之间的方差是差不多的,保证模型开始的时候梯度炸掉或者变为0。

  再将初始化权重部署到每一个layer中(.apply())

  打印一下再那个地方训练,避免弄了半天还是再cpu上。再将整个net挪到gpu上。

  添加了一个计时操作,每次计时的是每个epoch的训练用时。

  并注意在训练时,要将loader里面的X,y挪到gpu上!

2.2loss探索

  在此补充一下我的探索,因为我发现MLP的时候是用的l.mean().backward,而在这没有了,细看了一下,根源在于loss = nn.CrossEntropyLoss()里面有没有定义reduction='none'。

  如上图,定义了reduction='none'后,表示loss计算不会降维,保存每一个bs中的损失,所以得到的l是(bs)的loss,所以后续计算反向梯度下降的时候要mean()求均值(保证是标量对向量求导),由于最后累加器累加每个iter的loss,所以将(bs)的loss使用.sum()进行加和。

  而这次没有采用reduction='none'时,默认的时reduction='mean',直接在loss的时候就进行了均值操作。

 如上图,loss计算后的l是一个标量,经过累加器后,均值*个数(bs)=l.sum(),由于权重是随机的,所以几乎等于上一个即可说明二者是相等同的!

  所以往后直接不设置reduction好了,这样反向传播还简单一点。

2.3改编版显数函数

  众所周之笔者感觉画图的东西太罗嗦,跟ch3一样整了一个每个epoch显示数值的版本出来:

def train_ch6(net, train_iter, test_iter, num_epochs, lr, device):
    """⽤GPU训练模型(在第六章定义)"""
    global train_l, train_acc, metric

    def init_weights(m):
        if type(m) == nn.Linear or type(m) == nn.Conv2d:
            nn.init.xavier_uniform_(m.weight)

    net.apply(init_weights)
    print('training on', device)
    net.to(device)
    optimizer = torch.optim.SGD(net.parameters(), lr=lr)
    loss = nn.CrossEntropyLoss()
    # animator = d2l.Animator(xlabel='epoch', xlim=[1, num_epochs],
    #                         legend=['train loss', 'train acc', 'test acc'])
    timer, num_batches = d2l.Timer(), len(train_iter)
    for epoch in range(num_epochs):
        # 训练损失之和,训练准确率之和,样本数
        metric = d2l.Accumulator(3)
        net.train()
        for i, (X, y) in enumerate(train_iter):
            timer.start()
            optimizer.zero_grad()
            X, y = X.to(device), y.to(device)
            y_hat = net(X)
            l = loss(y_hat, y)
            l.backward()
            optimizer.step()
            with torch.no_grad():
                metric.add(l * X.shape[0], d2l.accuracy(y_hat, y), X.shape[0])
            timer.stop()
            train_l = metric[0] / metric[2]
            train_acc = metric[1] / metric[2]
        test_acc = evaluate_accuracy_gpu(net, test_iter)
        print(f'loss {train_l:.3f}, train acc {train_acc:.3f}, '
              f'test acc {test_acc:.3f}')
    print(f'{metric[2] * num_epochs / timer.sum():.1f} examples/sec '
          f'on {str(device)}')

2.4训练命令行

lr, num_epochs = 0.9, 10
train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

手写CNN从零实现:PyTorch底层原理与工程实践 卷积神经网络(CNN)是计算机视觉的基石,其核心在于局部感受野、权值共享与空间下采样等机制;PyTorch作为主流深度学习框架,凭借动态计算图与细粒度autograd控制,成为理解CNN反向传播与内存行为的理想工具。从零手写CNN并非重复造轮子,而是深入张量形状变换、梯度流向追踪、CUDA内核调用及显存布局等底层细节,从而建立对模型训练全过程的物理级直觉。该实践显著提升调试能力——如定位梯度爆炸、NaN loss、显存溢出等高频问题,并支撑边缘部署、模型轻量化与自定义算子开发等真实场景。本文以LeNet-5 阅读详情

相关推荐

基于卷积神经网络的小样本图像识别:原型网络与episodic训练

图像识别在工业质检、细粒度分类中常遇到类别多、每类样本少、标注成本高的问题。卷积神经网络依靠局部连接与权值共享提取层次化特征,但样本稀缺时容易过拟合;小样本学习通过episodic训练模拟N-way K-shot任务,让模型学习类间比较而非记忆固定类别。其技术价值在于用少量标注获得可迁移的嵌入表示,尤其适合产线外观检测、SAR图像识别等采集慢、预算紧的场景。典型实现是原型网络:将支持样本的CNN特征取均值形成类别原型,再用平方欧氏距离对query分类。工程落地还需处理base/novel划分、ResNet-

weixin_30235225的博客 294

pytorch深度学习实战lesson28

resnet架构,resnet在计算梯度时的方法,以及它有什么好处?

weixin_48304306的博客 863

accumulator:累加器

累加器 累加器

【TensorFlow深度学习】十三、卷积神经网络(卷积层、池化层、LeNet、d2l.train_ch6)

本节介绍了卷积层与池化层运算的过程,以LeNet-5为例实践了卷积网络在Fashion-MINIST分类任务中的应用,并且详细分析了训练过程。

鹤子的一些知识共享 1585

深入解析Apollo Lattice Planner:自动驾驶轨迹规划的核心算法与实践

本文深入解析了百度Apollo自动驾驶平台中的核心轨迹规划算法——Lattice Planner。文章详细阐述了其作为车辆“即时决策者”的工作原理,通过“采样-评估”的六步流程(Frenet坐标转换、状态采样、轨迹生成、硬约束过滤、代价函数打分及决策平滑),在复杂路况下实时规划出安全、舒适、高效的行驶轨迹。该算法是自动驾驶实现智能决策与精准控制的关键技术。

weixin_29090677的博客 829

实战详细讲解Qt插件plugin的编写与用法

qt插件的开发,可以说是动态库的开发,因为调用方式类似,多熟悉一下,利用Qt框架开发很简单的。在想想这种调用过程有的熟悉,比如公司买了一堆摄像头,公司要对摄像头进行二次开发,实现自己想要的功能,集成到一套设备里去,然后在卖给用户。此时厂商肯定会提供开发文档,并给你SDK包(软件开发工具包), 包里你会发现只有头文件和一堆库文件,没有源文件,因为实现的过程是产商公司保密的,给你看还得了。所以都封装成了库的形式给你调用,如静态库或者动态库。

qq_44667165的博客 1万+

李沐动手学深度学习笔记---AlexNet

李沐动手学深度学习笔记---AlexNet

qq_61434667的博客 834

苹果开发者账号注册指南:解决Apple Developer app证件验证失败问题

本文详细解析了苹果开发者账号注册中证件验证失败的常见原因与解决方案。核心在于确保Apple ID、设备与iCloud信息一致,并提供了从官方支持联系到材料准备的全流程操作指南,帮助开发者高效解决“未能验证证件”问题,顺利完成注册。

weixin_29232507的博客 2210

李沐-第六章-LeNet训练中的pycharm jupyter-notebook Animator类的显示问题

摘要:在PyCharm集成Jupyter中,使用d2l库的Animator类时遇到动图显示问题(训练时一闪而过,仅在结束时显示)。解决方法是将Animator类中display.clear_output(wait=True)改为wait=False,并在train_ch6函数最后添加display.clear_output(wait=False)。这样修改后动态图能正常显示,但需注意此方法仅适用于PyCharm环境,在浏览器Jupyter中可能引起图像闪烁问题。建议自定义函数而非直接修改库代码以避免冲突。

Full_Speed_Turbo 506

华为无线WiFi实战:基于802.1x与NPS的企业级认证部署指南

本文提供了一份详尽的华为无线WiFi企业级认证部署实战指南。通过整合802.1x协议与Windows NPS服务器,构建基于AD域账号的安全认证体系,彻底解决传统WiFi密码共享带来的安全风险。文章详细拆解了从NPS服务器配置、证书部署到华为AC端RADIUS模板、AAA方案、认证域及VAP模板调用的全流程,并附有终端连接测试与常见故障排查方法,助力企业实现高效、安全的无线网络接入管理。

weixin_29239661的博客 267

Dynamics 365 F&O新手必看:Visual Studio 2019搭建项目框架全流程(含Model避坑指南)

本文详细介绍了如何在Visual Studio 2019中为Dynamics 365 Finance and Operations搭建企业级项目框架,包括Model分层策略、Solution管理及开发工作流优化。特别提供了Model避坑指南和实用配置建议,帮助新手快速上手并避免常见错误。

weixin_30505225的博客 381

动手学习深度学习-构建LeNet网络

train_ch6,李沐老师是展示了详细代码,我太懒了,没有写全,直接进行的d2l库的调用,最后是在GPU上跑的模型。

qq_42424944的博客 155

Androiud安卓链接sqllite的代码使用案例

【代码】Androiud安卓链接sqllite的代码使用案例。

laterstage的博客 1328

【动手学深度学习】卷积神经网络CNN的研究详情

本研究基于PyTorch框架,构建并优化LeNet卷积神经网络,探索其在Fashion-MNIST数据集上的性能。通过替换平均池化为最大池化、调整卷积核大小、增加通道数与层数、更换激活函数及优化学习率等策略,显著提升模型准确率。实验表明,最大池化更利于捕捉显著特征,深层结构与ReLU激活函数有助于增强表达能力。研究深化了对CNN特征提取、模式识别机制的理解,验证了网络结构设计对图像分类任务的关键影响。

朝花夕拾 4911

扫码登录原理

扫码登录功能通过PC端与移动端的交互实现安全认证,分为三个阶段:待扫描阶段生成唯一二维码ID并轮询状态;已扫描阶段移动端提交token与二维码ID关联,生成临时token并要求用户确认;确认阶段验证临时token后为PC端生成正式登录凭证。整个过程通过二维码唯一性、状态轮询和二次确认机制确保安全性,防止未授权登录,最终完成跨设备认证流程。

阿杰同学的博客 344

Windows 11 安装 JDK 25:下载、安装、配置环境变量、验证

本文详细介绍了在 Windows 11 系统上安装 JDK 25 的完整流程,包括从 Oracle 官网下载压缩包、解压至自定义目录、配置 JAVA_HOME 与 Path 环境变量,并验证安装是否成功。文章推荐使用 ZIP 压缩包而非 EXE 安装程序,以实现绿色便携、多版本共存和灵活管理。最后通过一个使用 Java 25 新特性的示例程序,验证 JDK 的编译与运行环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 7658

卷积神经网络CNN原理详解:从基础概念到实战手写数字识别

卷积神经网络作为深度学习在计算机视觉领域的核心技术,通过局部连接和参数共享机制有效解决了传统神经网络处理图像数据时的参数爆炸问题。其核心原理基于卷积运算,通过滑动窗口在输入数据上执行特征提取,配合池化操作实现特征降维和保持平移不变性。这种层次化结构模仿了人类视觉系统的工作原理,从简单边缘特征到复杂物体识别,实现了端到端的自动化特征工程。在技术价值方面,CNN显著提升了图像分类、目标检测等任务的准确率和效率。应用场景广泛覆盖人脸识别、医疗影像分析、自动驾驶等领域。本文通过动画式讲解和MNIST手写数字识别实战

weixin_33701617的博客 411

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深度学习实战:从数据预处理到模型部署的完整流程指南

GitHub 加速计划 / d2 / d2l-pytorch 项目是《Dive Into Deep Learning》书籍的 PyTorch 实现版本,它将原书中的 MXNet 代码适配为 PyTorch 框架,为深度学习学习者提供了丰富的实战资源。本指南将带你了解深度学习项目从数据预处理到模型部署的完整流程,帮助你快速上手深度学习实战。 ## 一、深度学习项目开发的完整流程 深度学习项目的开

gitblog_00008的博客 459

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【动手学深度学习】卷积神经网络(AlexNet)的研究详情

本研究以AlexNet为例,探究卷积神经网络在图像分类中的应用。通过搭建与优化模型,对比不同结构、正则化方法及超参数对性能的影响,深入理解了模型复杂度、过拟合与泛化能力的关系。实验表明,引入ReLU、Dropout及数据预处理可有效提升LeNet-5性能;简化模型或采用ResNet架构可加速训练并保持精度。同时分析了显存占用与计算开销主要来自卷积与全连接层。研究强化了对CNN原理与实践的理解,提升了深度学习建模与调优能力。

朝花夕拾 3755

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

经典CNN模型

跟着开源课程《动手学深度学习V2》,学习早期CNN经典网络模型。

Zenos的博客 244

1900行深度学习工具库全解析:Dive-Into-Deep-Learning-PyTorch-PDF的d2lzh.py自定义层与训练函数设计原理

Dive-Into-Deep-Learning-PyTorch-PDF 项目将中文版《动手学深度学习》全书代码重新整理为 PyTorch 实现,并打包为可下载的 PDF 版本。全书代码共用一个约 1900 行的自定义工具库 [d2lzh.py](https://link.gitcode.com/i/e4533ffaf4344c2fb8cb5cf250671639),里面封装了自定义层(Flatte

gitblog_01058的博客 1087

卷积神经网络(CNN)原理与实战全解:组成层、卷积核、池化与 NetVLAD

卷积神经网络(Convolutional Neural Network,CNN)是一种专门用于处理局部与整体相关性结构的计算网络结构,在图像识别、自然语言处理乃至语音识别领域都有广泛应用,其中在图像识别领域的成功最为突出。本篇基于《深度学习500问》仓库 第五章_卷积神经网络(CNN).md/第五章_卷积神经网络(CNN).md) 的完整内容,系统梳理 CNN 的组成层结构、卷积/池化/全连接等核

gitblog_00066的博客 865

什么是Dive-Into-Deep-Learning-PyTorch-PDF?《动手学深度学习》PyTorch版全书代码+PDF终极指南

Dive-Into-Deep-Learning-PyTorch-PDF 是中文版《动手学深度学习》(D2L)的 **PyTorch 版完整实现 + 全书 PDF**:项目把原书 9 章全部代码用 PyTorch 重写并整理成可运行的 Jupyter Notebook,同时提供可直接下载的全书 PDF,是深度学习入门与 PyTorch 实战学习的理想资料。 [![《动手学深度学习》PyTorch

gitblog_00774的博客 782

3步用 PowerShell 脚本完成 Office-Tool 一键部署,实现零中断更新

Office-Tool 是开源的 Office 部署与激活工具,配合 PowerShell 脚本可一键完成版本识别、下载与部署执行,全程不中断用户业务。 ## 它能帮你做什么 - 自动识别系统架构与语言环境,下载匹配的 Office-Tool 版本,省去手动选错版本的麻烦 - 把下载、执行部署命令、清理临时文件整合进一个脚本,过程可复现、可批量执行 - 同一套脚本适配 Microsoft 36

gitblog_00260的博客 238

Python机器学习:从零基础到项目实战

当您翻开此书,您正踏入一场数据与智慧的修行。机器学习,并非冰冷的符码,而是机器模拟人类洞察世界的法门。本书将带您,以Python为舟,泛游于算法之海。我们不只传授“术”,更探求其后的“道”——从数据的生灭流转中观照规律,于模型的迭代演进里体悟得失。愿您合上书卷时,收获的不仅是驾驭数据的技能,更有一双洞悉复杂、化繁为简的“智慧之眼”。现在,让我们一同启程。

YunWisdom 963

计算机视觉模型架构演进与工业部署优化

计算机视觉作为人工智能的核心技术领域,其模型架构从传统卷积神经网络(CNN)发展到Transformer架构,始终围绕特征提取效率和计算优化展开。CNN通过卷积核实现局部特征提取,而Transformer利用自注意力机制捕捉全局依赖关系。这两种架构在图像分类、目标检测等任务中展现出互补优势,催生了ConvNeXt等混合架构的兴起。在工业部署场景中,TensorRT优化和模型轻量化技术(如深度可分离卷积)能显著提升推理效率,使ResNet-50等模型在T4 GPU上的推理速度提升4倍。这些技术进步正推动着自动

weixin_30882895的博客 335
上一篇: d2l房价预测与pandas文件处理
下一篇: torch中的张量处理
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值