(二)模型构建优化损失函数API的使用

本文介绍了PyTorch中nn.Module的使用,包括如何定义网络结构和实现前向传播。nn.Linear是全连接层,用于线性变换。torch.optim是优化器库,如SGD和Adam,用于更新模型参数。同时,讨论了损失函数如MSELoss和CrossEntropyLoss的应用。通过实例展示了模型、优化器的创建及参数更新过程。

1、模型        nn.Module

nn.Module是torch.nn提供的一个类,是pytorch中我们自定义网络的一个基类,这个类中定义了 很多有用的方法。

        注意:i.  __init__需要调用super方法,继承父类的属性和方法。

                   ii. farward方法必须实现,用来定义我们网络的向前计算过程。

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)# submodule: Conv2d
        self.conv2 = nn.Conv2d(20, 20, 5)

    def forward(self, x):
       x = F.relu(self.conv1(x))
       return F.relu(self.conv2(x))

nn.Module定义了__call__方法,实现的就是调用forward方法,即Model实例,能够直接被传入参数调用,实际上调用的是forward方法并传入参数。

# 实例化模型
moudle = Model()
# 传入数据,计算结果
predict = moudle(x)

扩展:

        moudle.eval()表示设置模式为评估模式,即预测模式

        model.train(mode=True) 表示设置模式为训练模式

        在线性回归中,上述并无区别。但是在其他的一些模型中,训练的参数和预测的参数会不相同,到时候就需要具体的

2、全连接层        nn.Linear

class torch.nn.Linear(in_features, out_features, bias=True)

它是全连接层,对输入数据做线性变换:\(y = Ax + b\)

参数:

  • in_features - 每个输入样本的大小
  • out_features - 每个输出样本的大小
  • bias - 若设置为False,这层不会学习偏置。默认值:True

形状:

  • 输入: \((N, in\_features)\)
  • 输出: \((N, out\_features)\)

变量:

  • weight -形状为(out_features x in_features)的模块中可学习的权值
  • bias -形状为(out_features)的模块中可学习的偏置

例子:

m = nn.Linear(20, 30)
input = autograd.Variable(torch.randn(128, 20))
output = m(input)
print(output.size())

3、优化器类        torch.optim

优化器(optimizer),可以理解为torch为我们封装的用来更新参数的方法,是一个实现了各种优化算法的库。大部分常用的方法得到支持,并且接口具备足够的通用性,使得未来能够集成更加复杂的方法。比如常见的随机梯度下降SGD。

如何使用optimizer

为了使用torch.optim,你需要构建一个optimizer对象。这个对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。

1、torch.optim.SGD(参数,学习率)

2、torch.optim.Adam(参数,学习率)

注意 :参数可以使用model.parameters()来获取,获取模型中所有requires_grad=True的参数。

构建

为了构建一个Optimizer,你需要给它一个包含了需要优化的参数(必须都是Variable对象)的iterable。然后,你可以设置optimizer的参 数选项,比如学习率,权重衰减,等等。

例子:

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)

优化类使用的方法:

        1、实例化

        2、所有参数的梯度,将其值设置为0

        3、反向传播计算梯度

        4、更新参数值

示例:

optimizer=optim.SGD(model.parameters(),lr=1e-3) #1、实例化
optimizer.zero_grad() #2、梯度置0
loss.backward() #3、计算梯度
optimizer.step() #4、更新参数值

4、损失函数

1、均方误差:nn.MSELoss(), 常用语分类问题 

2、交叉熵损失:nn.CrossEntropyLoss(),常用语逻辑回归

使用方法:

criterion = LossCriterion() #构造函数有自己的参数,损失函数实例化
loss = criterion(y_true, y_predict) #调用标准时也有参数

其中LossCriterion()可替换成各种损失函数。

使用函数式API定义模型是一种灵活且直观的方式,尤其适用于构建复杂的神经网络结构。这种方式允许用户以声明式的风格来定义模型的前向传播逻辑,同时保留对计算图的控制能力。以下是如何使用常见的深度学习框架(如TensorFlow/Keras)中的函数式API来定义模型的具体步骤和示例。 ### 定义输入层 首先需要明确模型的输入形式。在Keras中,可以通过`Input`函数指定输入数据的形状、类型等信息。 ```python from keras.layers import Input # 假设输入是一个形状为(100,)的一维向量 inputs = Input(shape=(100,)) ``` ### 添加隐藏层 接下来可以依次添加各种类型的隐藏层,比如全连接层(Dense)、卷积层(Conv2D)或循环层(LSTM)。每一层的输出可以直接作为下一层的输入。 ```python from keras.layers import Dense # 添加一个包含64个神经元的全连接层,并使用ReLU激活函数 x = Dense(64, activation='relu')(inputs) ``` ### 定义输出层 最后根据任务需求定义输出层。对于分类问题,通常使用Softmax激活函数;而对于回归问题,则不需要激活函数或者使用线性激活函数。 ```python # 对于分类问题,使用Sigmoid激活函数 outputs = Dense(1, activation='sigmoid')(x) ``` ### 构建模型 将输入和输出组合成一个完整的模型对象,这样就可以进行编译、训练以及评估了。 ```python from keras.models import Model # 创建模型 model = Model(inputs=inputs, outputs=outputs) ``` ### 编译模型模型训练之前,还需要对其进行编译,指定损失函数优化器及评估指标等参数。 ```python # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) ``` ### 训练模型 准备好数据后,调用`fit`方法开始训练模型。 ```python # 假设有X_train和y_train作为训练数据 model.fit(X_train, y_train, epochs=10, batch_size=32) ``` 通过上述步骤,可以利用函数式API轻松地定义出从简单到复杂的各种机器学习或深度学习模型[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值