在PyTorch中开发我们的第一个神经网络

这篇具有很好参考价值的文章主要介绍了在PyTorch中开发我们的第一个神经网络。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本教程将介绍初学者在PyTorch中构建神经网络的过程。我们将通过一个项目逐步进行操作。本教程将使用Kaggle上的Heart.csv数据集,请随时下载数据集并跟随教程进行:https://www.kaggle.com/rashikrahmanpritom/heart-attack-analysis-prediction-dataset

首先,导入必要的包:

import pandas as pd
from collections import OrderedDict
from torch.optim import SGD
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_blobs
import torch.nn as nn
import torch

在PyTorch中开发我们的第一个神经网络,pytorch,神经网络,人工智能,python,深度学习

数据集中有一些列的数据类型是'object'。在进行任何建模之前,这些列的数据类型应该被转换为数字。

for i in df.columns:
  if df[i].dtype == 'object':
      df[i] = df[i].astype('category').cat.codes
df

输出:

在PyTorch中开发我们的第一个神经网络,pytorch,神经网络,人工智能,python,深度学习

如我们所见,现在所有的数据都是数字形式的。最后一列是'HeartDisease',它有两个唯一的值:0和1。假设这是目标变量,也就是本练习的目标是根据表中可用的其他参数确定'HeartDisease'。

定义模型的训练和目标变量:

X = df.drop(columns=['HeartDisease'])
y = df['HeartDisease']
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=21)

为了使用PyTorch模型,数据需要以'torch'格式存在。但是x_train和x_test数据是DataFrame形式的。DataFrame不能直接转换为torch。因此,首先将数据转换为numpy数组,然后再转换为torch:

x_train, x_test, y_train, y_test = np.array(x_train), np.array(x_test), np.array(y_train), np.array(y_test)
trainX = torch.from_numpy(x_train).float()
testX = torch.from_numpy(x_test).float()
trainY = torch.from_numpy(y_train).float()
testY = torch.from_numpy(y_test).float()

模型开发:

由于这是为初学者准备的,我们将选择一个简单的神经网络。神经网络是一系列层。我们将使用一个简单的Sequential模型,其中包含2个隐藏层。让我们先看看模型是什么样子,然后我会解释它。

class HeartDisease(nn.Module):
  def __init__(self):
      super().__init__()
      self.hidden1 = nn.Linear(11, 128)
      self.act1 = nn.ReLU()
      self.hidden2 = nn.Linear(128, 64)
      self.act2 = nn.ReLU()
      self.output = nn.Linear(64, 1)
      self.act_output = nn.Sigmoid()
  def forward(self, x):
      x = self.act1(self.hidden1(x))
      x = self.act2(self.hidden2(x))
      x = self.act_output(self.output(x))
      return x

这是一个非常简单的神经网络,有两个隐藏层。第一个隐藏层的输入是11,输出是128。在这里,11是训练特征所取的特征数或列数,128是第一个隐藏层中的神经元数。我选择的数字128是可以尝试其他数字的。神经元的数量可以看作是需要找出的超参数。通常,它是通过大量试验和错误来确定的。

hidden1的输出应该是hidden2的输入。因此,hidden2的输入是128,我选择输出为64。最后,在输出层中,输入是64,输出是1,因为这是一个二分类。如果有10个类别,输出将是10。

在分类问题中,输出需要经过一个激活函数,该函数给出一个在0到1之间范围的概率。因此,可以将其四舍五入为1或四舍五入为0。

隐藏层的数量也是通过试验和错误确定的。

然后,在HeartDisease()方法之后的forward函数调用层,最终返回输出,即我们的预测值。

打印模型:

model = HeartDisease()
print(model)

输出:

HeartDisease(
(hidden1): Linear(in_features=11, out_features=128, bias=True)
(act1): ReLU()
(hidden2): Linear(in_features=128, out_features=64, bias=True)
(act2): ReLU()
(output): Linear(in_features=64, out_features=1, bias=True)
(act_output): Sigmoid()
)

损失函数和优化器:

mport torch.optim as optim
loss_fn = nn.BCELoss() # 二进制交叉熵
optimizer = optim.Adam(model.parameters(), lr=0.001)

现在是模型训练的部分。我将模型训练了150个时期,并使用了批量大小为64。对于每个时期,使用我们定义的模型计算预测标签,并使用预测标签和真实标签计算损失。棘手的部分是在转到下一个时期之前应该将梯度固定为零。否则,来自前一个时期的梯度将累加到当前时期,模型训练将不正确。

epochs = 150
batch_size = 64
for epoch in range(epochs):
  for i in range(0, len(trainX), batch_size):
      Xbatch = trainX[i
:i+batch_size]
      y_pred = model(Xbatch)
      ybatch = trainY[i:i+batch_size]
      loss = loss_fn(torch.flatten(y_pred), ybatch)
      optimizer.zero_grad()
      loss.backward()
      optimizer.step()
  print(f'Finished epoch {epoch}, latest loss {loss}')

输出:

Finished epoch 0, latest loss 0.46334463357925415
Finished epoch 1, latest loss 0.5276321172714233
Finished epoch 2, latest loss 0.5331380367279053
Finished epoch 3, latest loss 0.5323242545127869
...
...
...
Finished epoch 147, latest loss 0.16034317016601562
Finished epoch 148, latest loss 0.14931809902191162
Finished epoch 149, latest loss 0.15581083297729492

我只展示了一些模型训练过程中的损失输出,以展示损失如何逐渐下降。现在,是时候检查模型的性能了。

模型在测试数据上的预测准确度:

with torch.no_grad():
  y_pred = model(testX)
accuracy = len((y_pred.round() == testY).float()) / len(testY)
accuracy

输出:

1.0

模型在训练数据上的预测准确度:

with torch.no_grad():
  y_pred = model(trainX)
accuracy = len((y_pred.round() == trainY)) / len(trainY)
accuracy

输出:

1.0

结论

如果我们是TensorFlow用户,模型训练可能会感觉太手动了。但在工业和研究中,许多人喜欢这个手动训练过程,因为它提供了很多控制。我认为我们至少应该学习这个过程,以便在必要时可以使用它。

·  END  ·

HAPPY LIFE

在PyTorch中开发我们的第一个神经网络,pytorch,神经网络,人工智能,python,深度学习

本文仅供学习交流使用,如有侵权请联系作者删除文章来源地址https://www.toymoban.com/news/detail-796612.html

到了这里,关于在PyTorch中开发我们的第一个神经网络的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pytorch学习——如何构建一个神经网络——以手写数字识别为例

    目录 一.概念介绍 1.1神经网络核心组件 1.2神经网络结构示意图 1.3使用pytorch构建神经网络的主要工具 二、实现手写数字识别 2.1环境 2.2主要步骤 2.3神经网络结构 2.4准备数据 2.4.1导入模块 2.4.2定义一些超参数 2.4.3下载数据并对数据进行预处理 2.4.4可视化数据集中部分元素  2

    2024年02月14日
    浏览(30)
  • 【深度学习】神经网络中 Batch 和 Epoch 之间的区别是什么?我们该如何理解?

    随机梯度下降(Stochastic Gradient Descent,SGD)是一种优化算法,用于在机器学习和深度学习中更新模型参数,以最小化损失函数。与传统的梯度下降算法不同,SGD在每次参数更新时只使用一个样本(或一小批样本),而不是使用整个训练数据集。这使得SGD具有更快的收敛速度,

    2024年02月10日
    浏览(36)
  • 神经网络-pytorch版本

    torch和numpy torch的数学运算 在PyTorch中, Variable 在早期版本中用于自动求导(autograd)的功能,但从PyTorch 0.4.0版本开始, Variable 已经被弃用,取而代之的是 Tensor 的功能。因此,如果你使用的是PyTorch 0.4.0或更新版本,你不再需要使用 Variable 。 以下是 Variable 和普通的变量(如

    2024年02月07日
    浏览(47)
  • 【Pytorch】神经网络搭建

    在之前我们学习了如何用Pytorch去导入我们的数据和数据集,并且对数据进行预处理。接下来我们就需要学习如何利用Pytorch去构建我们的神经网络了。 目录 基本网络框架Module搭建 卷积层 从conv2d方法了解原理 从Conv2d方法了解使用 池化层 填充层 非线性层 线性层 Pytorch里面有一

    2023年04月17日
    浏览(31)
  • pytorch-构建卷积神经网络

    构建卷积神经网络 卷积网络中的输入和层与传统神经网络有些区别,需重新设计,训练模块基本一致 首先读取数据 分别构建训练集和测试集(验证集) DataLoader来迭代取数据 卷积网络模块构建 一般卷积层,relu层,池化层可以写成一个套餐 注意卷积最后结果还是一个特征图

    2024年02月09日
    浏览(35)
  • pytorch神经网络入门代码

    以下代码测试正确率为:99.37%

    2024年02月20日
    浏览(39)
  • pytorch基础 神经网络构建

    www.ai-xlab.com AI MOOC Torch介绍 Torch是一个开源的机器学习的框架,早在2002年就发 布了Torch的初版,Torch的编程语言为C和Lua。如今 的Torch7依旧是热门的深度学习框架之一。 www.ai-xlab.com AI MOOC PyTorch介绍 PyTorch是在2017年1月由Facebook推出的。它是经 典机器学习库Torch框架的一个端口,

    2024年01月21日
    浏览(39)
  • [pytorch入门] 6. 神经网络

    torch.nn: Containers:基本骨架 Convolution Layers: 卷积层 Pooling layers:池化层 Non-linear Activations (weighted sum, nonlinearity):非线性激活 Normalization Layers:正则化层 containers相对重要的一个类,主要给神经网络定义了一些骨架、一些结构,后面那些类都是要向骨架中填充的东西 里面有

    2024年01月25日
    浏览(37)
  • PyTorch 神经网络搭建模板

    在 PyTorch 中, Dataset 和 DataLoader 是用来处理数据的重要工具。它们的作用分别如下: Dataset : Dataset 用于存储数据样本及其对应的标签。在使用神经网络训练时,通常需要将原始数据集转换为 Dataset 对象,以便能够通过 DataLoader 进行批量读取数据,同时也可以方便地进行数据

    2023年04月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包