| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> pytorch神经网络实现 -> 正文阅读 |
|
[人工智能]pytorch神经网络实现 |
我们从PyTorch中经典的quickstart示例开始,从中学习神经网络构建和训练过程。 其中要学到并熟练掌握的是如下这些流程:
下面我们就一步步分解这个过程,其中也会学习认识到一些pytorch为我们提供的框架内置对象和函数。初次接触可能还不是很适应,所以以先完成完整的模型训练流程为重。后续再根据任务需求,一步步的扩展pytorch的认知版图 数据预处理模型训练用的样本,大部分都来自于外部文件系统。本次训练用的数据来自框架内置的数据集,所以代码没有泛化性。涉及到具体数据再做补充。 PyTorch 有两个用于处理数据的工具:
本次的数据样本来自于Pytorch的TorchVision 数据集。
下一步就是对已加载数据集的封装,把Dataset 作为参数传递给 DataLoader。这样,就在我们的数据集上包装了一个迭代器(iterator),这个迭代器还支持自动批处理、采样、打乱顺序和多进程数据加载等这些强大的功能。这里我们定义了模型训练期间,每个批次的数据样本量大小为64,即数据加载器在迭代中,每次返回一批 64 个数据特征和标签。
Shape of X [N, C, H, W]: torch.Size([64, 1, 28, 28]) Shape of y: torch.Size([64]) torch.int64 构建模型为了在 PyTorch 中定义神经网络,我们创建了一个继承自 nn.Module 的类。我们在 init 函数中定义网络层,并在 forward 函数中指定数据将如何通过网络。为了加速神经网络中的操作,我们将其移至 GPU(如果可用)。
使用 cuda 设备 NeuralNetwork( (flatten): Flatten(start_dim=1, end_dim=-1) (linear_relu_stack): Sequential( (0): Linear(in_features=784, out_features=512, bias=True) (1): ReLU() (2): Linear(in_features=512, out_features=512, bias=True) (3): ReLU() (4): Linear(in_features=512, out_features=10, bias=True) ) ) pytorch是通过继承 nn.Module 父类来实现自定义的网络模型。 在 init 中初始化神经网络层。 在 forward 方法中实现对输入数据的操作。 模型层分解 为了方便分解 FashionMNIST 模型中的各个层进行说明,我们取一个由 3 张大小为 28x28 的图像组成的小批量样本,看看当它们通过网络传递时会发生什么。
torch.Size([3, 28, 28]) nn.Flatten 我们初始化
torch.Size([3, 784]) nn.Linear linear layer线性层是一个模块,它使用其存储的权重和偏置对输入应用线性变换。
torch.Size([3, 20]) nn.ReLU 为了在模型的输入和输出之间创建复杂映射,我们使用非线性激活。激活函数在线性变换之后被调用,以便把结果值转为非线性,帮助神经网络学习到各种各样的关键特征值。 在这个模型中,线性层之间使用了
ReLU 之前的数据: tensor([[-0.2496, 0.4432, -0.1536, 0.4439, 0.3256, 0.6594, -0.2536, 0.2348, -0.1113, 0.0732, -0.0658, 0.6014, -0.6135, -0.4709, 0.3016, 0.1500, 0.0801, 0.3644, -0.6113, 0.4129], [-0.7556, 0.1309, -0.2760, 0.3292, 0.5749, 0.6503, -0.1372, 0.3096, 0.1499, -0.0446, -0.1845, 0.2553, -0.6012, -0.3562, -0.0291, 0.1380, 0.2641, 0.2835, -0.5634, 0.1305], [-0.3772, -0.0354, -0.3879, 0.1846, 0.5425, 0.5019, 0.3323, 0.3478, 0.1171, 0.1153, -0.3414, 0.1688, -0.4068, 0.0950, -0.0322, 0.1272, 0.1653, 0.1538, -0.8849, 0.1446]], grad_fn=<AddmmBackward0>) ReLU 之后的数据: tensor([[0.0000, 0.4432, 0.0000, 0.4439, 0.3256, 0.6594, 0.0000, 0.2348, 0.0000, 0.0732, 0.0000, 0.6014, 0.0000, 0.0000, 0.3016, 0.1500, 0.0801, 0.3644, 0.0000, 0.4129], [0.0000, 0.1309, 0.0000, 0.3292, 0.5749, 0.6503, 0.0000, 0.3096, 0.1499, 0.0000, 0.0000, 0.2553, 0.0000, 0.0000, 0.0000, 0.1380, 0.2641, 0.2835, 0.0000, 0.1305], [0.0000, 0.0000, 0.0000, 0.1846, 0.5425, 0.5019, 0.3323, 0.3478, 0.1171, 0.1153, 0.0000, 0.1688, 0.0000, 0.0950, 0.0000, 0.1272, 0.1653, 0.1538, 0.0000, 0.1446]], grad_fn=<ReluBackward0>) nn.Sequential
nn.Softmax 神经网络的最后一个线性层返回的是 logits类型的值,它们的取值是[-∞, ∞]。 把这些值传递给
模型参数 神经网络内的许多层都是包含可训练参数的,即具有在训练期间可以优化的相关权重(weight)和偏置(bias)。子类
Model structure: NeuralNetwork( (flatten): Flatten(start_dim=1, end_dim=-1) (linear_relu_stack): Sequential( (0): Linear(in_features=784, out_features=512, bias=True) (1): ReLU() (2): Linear(in_features=512, out_features=512, bias=True) (3): ReLU() (4): Linear(in_features=512, out_features=10, bias=True) ) ) Layer: linear_relu_stack.0.weight | Size: torch.Size([512, 784]) | Values : tensor([[-0.0186, -0.0036, -0.0014, ..., -0.0294, -0.0217, 0.0293], [-0.0041, 0.0305, -0.0148, ..., 0.0036, -0.0100, 0.0239]], device='cuda:0', grad_fn=<SliceBackward0>) Layer: linear_relu_stack.0.bias | Size: torch.Size([512]) | Values : tensor([-0.0168, -0.0071], device='cuda:0', grad_fn=<SliceBackward0>) Layer: linear_relu_stack.2.weight | Size: torch.Size([512, 512]) | Values : tensor([[ 0.0054, 0.0381, -0.0331, ..., 0.0163, -0.0087, -0.0287], [ 0.0252, 0.0025, -0.0126, ..., -0.0261, 0.0020, -0.0217]], device='cuda:0', grad_fn=<SliceBackward0>) Layer: linear_relu_stack.2.bias | Size: torch.Size([512]) | Values : tensor([-0.0202, -0.0242], device='cuda:0', grad_fn=<SliceBackward0>) Layer: linear_relu_stack.4.weight | Size: torch.Size([10, 512]) | Values : tensor([[ 0.0142, -0.0315, -0.0046, ..., 0.0150, 0.0205, -0.0144], [ 0.0070, -0.0086, -0.0114, ..., -0.0193, 0.0310, 0.0325]], device='cuda:0', grad_fn=<SliceBackward0>) Layer: linear_relu_stack.4.bias | Size: torch.Size([10]) | Values : tensor([-0.0353, -0.0112], device='cuda:0', grad_fn=<SliceBackward0>) 定制模型损失函数和优化器训练模型之前,我们需要为模型定制一个损失函数
训练并观察超参数在单个训练循环中,模型对训练数据集进行预测(分批输入),并反向传播预测误差以调整模型参数。
我们还要依赖测试数据集来检查模型的性能,以确保它的学习优化效果。
默认情况下,所有 训练过程在多轮迭代(epochs)中进行。在每个epoch中,模型通过学习更新内置的参数,以期做出更好的预测。我们在每个epochs打印模型的准确率和损失值;当然,最希望看到的,就是每个 epoch 过程中准确率的增加而损失函数值的减小。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:31:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |