Pytorch高阶API示范——DNN二分类模型

代码部分:

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import torch
from torch import nn
import torch.nn.functional as F
from torch.utils.data import Dataset,DataLoader,TensorDataset

"""
准备数据
"""

#正负样本数量
n_positive,n_negative = 2000,2000

#生成正样本, 小圆环分布
r_p = 5.0 + torch.normal(0.0,1.0,size = [n_positive,1])
theta_p = 2*np.pi*torch.rand([n_positive,1])
Xp = torch.cat([r_p*torch.cos(theta_p),r_p*torch.sin(theta_p)],axis = 1)
Yp = torch.ones_like(r_p)

#生成负样本, 大圆环分布
r_n = 8.0 + torch.normal(0.0,1.0,size = [n_negative,1])
theta_n = 2*np.pi*torch.rand([n_negative,1])
Xn = torch.cat([r_n*torch.cos(theta_n),r_n*torch.sin(theta_n)],axis = 1)
Yn = torch.zeros_like(r_n)

#汇总样本
X = torch.cat([Xp,Xn],axis = 0)
Y = torch.cat([Yp,Yn],axis = 0)


#可视化
plt.figure(figsize = (6,6))
plt.scatter(Xp[:,0],Xp[:,1],c = "r")
plt.scatter(Xn[:,0],Xn[:,1],c = "g")
plt.legend(["positive","negative"])

plt.show()

"""
#构建输入数据管道
"""
ds = TensorDataset(X,Y)
dl = DataLoader(ds,batch_size = 10,shuffle=True)

"""
2, 定义模型
"""
class DNNModel(nn.Module):
    def __init__(self):
        super(DNNModel, self).__init__()
        self.fc1 = nn.Linear(2,4)
        self.fc2 = nn.Linear(4,8)
        self.fc3 = nn.Linear(8,1)

    def forward(self,x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        y = nn.Sigmoid()(self.fc3(x))
        return y

    def loss_func(self,y_pred,y_true):
        return nn.BCELoss()(y_pred,y_true)

    def metric_func(self,y_pred,y_true):
        y_pred = torch.where(y_pred > 0.5, torch.ones_like(y_pred, dtype=torch.float32),torch.zeros_like(y_pred, dtype=torch.float32))
        acc = torch.mean(1 - torch.abs(y_true - y_pred))
        return acc

    @property
    def optimizer(self):
        return torch.optim.Adam(self.parameters(), lr=0.001)



model = DNNModel()

# 测试模型结构
(features,labels) = next(iter(dl))
predictions = model(features)

loss = model.loss_func(predictions,labels)
metric = model.metric_func(predictions,labels)

print("init loss:",loss.item())
print("init metric:",metric.item())

"""
3,训练模型
"""
def train_step(model, features, labels):

    # 正向传播求损失
    predictions = model(features)
    loss = model.loss_func(predictions,labels)
    metric = model.metric_func(predictions,labels)

    # 反向传播求梯度
    loss.backward()

    # 更新模型参数
    model.optimizer.step()
    model.optimizer.zero_grad()

    return loss.item(),metric.item()

# 测试train_step效果
features,labels = next(iter(dl))    #非for循环就用next
train_step(model,features,labels)

def train_model(model,epochs):
    for epoch in range(1,epochs+1):
        loss_list,metric_list = [],[]
        for features, labels in dl:
            lossi,metrici = train_step(model,features,labels)
            loss_list.append(lossi)
            metric_list.append(metrici)
        loss = np.mean(loss_list)
        metric = np.mean(metric_list)

        if epoch%100==0:
            print("epoch =",epoch,"loss = ",loss,"metric = ",metric)

train_model(model,epochs = 300)

# 结果可视化
fig, (ax1,ax2) = plt.subplots(nrows=1,ncols=2,figsize = (12,5))
ax1.scatter(Xp[:,0],Xp[:,1], c="r")
ax1.scatter(Xn[:,0],Xn[:,1],c = "g")
ax1.legend(["positive","negative"])
ax1.set_title("y_true")

Xp_pred = X[torch.squeeze(model.forward(X)>=0.5)]
Xn_pred = X[torch.squeeze(model.forward(X)<0.5)]

ax2.scatter(Xp_pred[:,0],Xp_pred[:,1],c = "r")
ax2.scatter(Xn_pred[:,0],Xn_pred[:,1],c = "g")
ax2.legend(["positive","negative"])
ax2.set_title("y_pred")

plt.show()

结果展示:

数据部分:

在这里插入图片描述

结果分类:

在这里插入图片描述

思考:

本文中的DNN模型,将loss(损失),metric(准确率),optimizer(优化器)的定义放在了DNN网络中,这也产生了一系列的问题。首先在调用这些函数时,需要用网络名+“.”来调用。例如:loss = model.loss_func(predictions,labels)
但是这里最重要的一点是 def optimizer(self):在optimizer函数上面必须有:@property,若没有将会出现AttributeError: 'function' object has no attribute 'step'的报错。
@property装饰器的作用:我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch多语句RNN(循环神经网络)二分类模型可以用来处理多语言文本分类任务。下面将简述基本流程。 首先,我们需要将文本数据进行预处理。预处理的步骤包括分词、去除停用词(如and、the等)、删除标点符号等。之后,我们将每个句子转换为一个数值向量,通常使用词嵌入技术,例如Word2Vec或者GloVe。这样,我们就可以用数值表示每个单词。 接着,我们需要构建RNN模型。一个常用的RNN模型是LSTM(长短期记忆网络)。LSTM可以捕捉句子中的时间序列信息,并更好地处理长期依赖问题。我们可以使用PyTorch提供的nn.LSTM模块来构建LSTM网络。 在构建模型时,我们需要定义网络的结构。通常,我们将词嵌入向量输入到LSTM中,并通过最后一个时间步的输出来进行分类。可以添加全连接层来将LSTM输出转换为二分类的结果。最后,我们使用sigmoid函数将输出映射到[0, 1]的范围内,以获取概率结果。 模型构建完成后,需要定义损失函数和优化器。对于二分类模型,我们可以使用二元交叉熵作为损失函数,优化器可以选择Adam或者SGD等。 在模型训练段,我们将数据分为训练集和验证集,并按照批量大小(batch size)将数据加载到模型中。通过向前传播和反向传播来计算损失和更新模型的参数。 在模型训练完毕后,可以对测试集进行预测,并评估模型的性能。可以计算准确率、精确率、召回率和F1值等指标来评估模型的效果。 总之,PyTorch提供了丰富的工具和模块,用于构建和训练多语句RNN二分类模型。通过适当的预处理、模型构建和训练,我们可以效地处理多语言文本分类任务,从而取得良好的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值