互联网资讯 / 人工智能 · 2023年12月14日 0

在Pytorch中实现第一个神经网络模型

在PyTorch中构建模型主要使用到NN模块。

nn.Linear

nn.Linear用于创建线性层,输入和输出的维度需要作为参数传入。

lineaR = nn.Linear(10, 2) example_input = Torch.randn(3, 10) example_output = lineaR(example_input) example_output

上述代码中,lineaR接受一个nx10的输入,并返回nx2的输出。

print(example_input) print(example_output) tensor([[ 1.1122, -0.1381, 0.5547, -0.3326, -0.5676, 0.2810, -0.5521, -0.8729, -0.6627, 0.8729], [ 1.9134, 0.2397, -0.8340, 1.1532, -1.6725, 0.6171, -0.0357, -1.6848, -0.8454, 0.3876], [-0.0786, -0.1541, -0.8385, -0.1587, -0.0121, 1.4457, -0.0132, 1.5653, -1.6954, -0.9350]]) # 输出如下 tensor([[-0.1249, -0.8002], [-1.0945, -0.2297], [-0.3558, 0.8439]], grad_fn=) nn.ReLU

nn.ReLU对线性输出执行ReLU激活函数。

Relu = nn.ReLU() Relu_output = Relu(example_output) Relu_output # 输出如下 tensor([[0.0000, 0.0000], [0.0000, 0.0000], [0.0000, 0.8439]], grad_fn=) nn.BatchNorm1d

nn.BatchNorm1d是一种标准化技术,用于在不同批次的输入中维持一致的均值和标准差。

BatchNorm = nn.BatchNorm1d(2) BatchNorm_output = BatchNorm(Relu_output) BatchNorm_output # 输出如下 tensor([[ 0.0000, -0.7071], [ 0.0000, -0.7071], [ 0.0000, 1.4142]], grad_fn=) nn.Sequential

nn.Sequential可以一次性创建一系列操作,和TensorFlow中的Sequential完全一样。

Mlp_layer = nn.Sequential( nn.Linear(5, 2), nn.BatchNorm1d(2), nn.ReLU() ) test_example = Torch.randn(5, 5) + 1 print(“input: “) print(test_example) print(“output: “) print(Mlp_layer(test_example)) # 输出如下 input: tensor([[ 1.4617, 1.2446, 1.4919, 1.5978, -0.3410], [ -0.2819, 0.5567, 1.0113, 1.8053, -0.0833], [ 0.2830, 1.0857, 1.2258, 2.6602, 0.1339], [ 0.8682, 0.9344, 1.3715, 0.0279, 1.8011], [ 0.6172, 1.1414, 0.6030, 0.3876, 1.3653]]) output: tensor([[0.0000, 0.0000], [0.0000, 1.3722], [0.0000, 0.8861], [1.0895, 0.0000], [1.3047, 0.0000]], grad_fn=)

在上述模型中缺少优化器,因此无法计算对应的损失。

import Torch.optim as optim adaM_opt = optim.Adam(Mlp_layer.parameters(), lr=1e-1) # 这里lr表示学习率,1e-1表示0.1 train_example = Torch.randn(100, 5) + 1 adaM_opt.zero_grad() # 我们将使用1减去平均值,作为简单的损失函数 cur_loss = Torch.abs(1 – Mlp_layer(train_example)).mean() cur_loss.backward() # 更新参数 adaM_opt.step() print(cur_loss.data) # 输出如下 tensor(0.7467)

虽然上述代码仅进行了一个epoch的训练,得到的线性模型损失为0.7467。以上即为神经网络模型建立的整个流程。

第一个神经网络模型

接下来实现第一个分类神经网络,其中包含一个隐藏层和单个输出单元。

首先,使用以下命令导入PyTorch库 –

import Torch import Torch.nn as nn

定义所有层和批量大小以开始执行神经网络,如下所示 –

n_in, n_h, n_out, batch_size = 10, 5, 1, 10

由于神经网络通过输入数据组合以获得相应的输出数据,我们将遵循相同的程序 –

x = Torch.randn(batch_size, n_in) y = Torch.tensor([[1.0], [0.0], [0.0], [1.0], [1.0], [1.0], [0.0], [0.0], [1.0], [1.0]])

创建顺序模型,使用以下代码创建模型 –

Model = nn.Sequential(nn.Linear(n_in, n_h), nn.ReLU(), nn.Linear(n_h, n_out), nn.Sigmoid())

借助梯度下降优化器构建损失函数,如下所示 –

# 构造损失函数 criterion = Torch.nn.MSELoss() # 构造优化器 optimizer = Torch.optim.SGD(Model.parameters(), lr=0.01)

使用以下代码行的迭代循环实现梯度下降模型 –

# 梯度下降 for epoch in range(50): # 正向传递:通过将x传递给模型来计算预测的y y_pred = Model(x) # 计算损失 loss = criterion(y_pred, y) # 梯度清零 optimizer.zero_grad() # 反向传播,求解梯度 loss.backward() # 更新模型参数 optimizer.step() if epoch % 10 == 0: print(‘epoch: ‘, epoch, ‘ loss: ‘, loss.item())

输出如下

epoch: 0 loss: 0.2508794665336609 epoch: 10 loss: 0.24847669899463654 epoch: 20 loss: 0.24615907669067383 epoch: 30 loss: 0.24392127990722656 epoch: 40 loss: 0.24175791442394257