一个caiNiao 2022-10-31 22:51 采纳率: 100%
浏览 15
已结题

基于pytorch神经网络回归问题不收敛

问题

使用pytorch搭建了一个三层的神经网络用来拟合数据做预测。一共有1000个样本,四个输入一个输出,但是不管怎么调整都不收敛。

代码
#深度神经网络拟合数据
import pandas as pd
import numpy as np
import torch.nn as nn
import torch.utils.data
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

#训练
def train_loop(dataloader, model, loss_fn, optimizer, train_loss):
    size = len(dataloader.dataset)
    for batch, (X, y) in enumerate(dataloader):
        # Compute prediction and loss
        pred = model(X)
        y = torch.reshape(y,(100,1))
        loss = loss_fn(pred, y)

        # Backpropagation
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()


        train_loss.append(loss)
        print('train_loss  batch%s:'%batch,loss)

#测试
def test_loop(dataloader, model, loss_fn, test_loss):
    size = len(dataloader.dataset)
    num_batches = len(dataloader)

    with torch.no_grad():
        for X, y in dataloader:
            y = torch.reshape(y,(-1, 1))
            pred = model(X)
            loss = loss_fn(pred,y)
            test_loss.append(loss)
            #显示损失:
            #print('test_loss:',loss)


if __name__ == '__main__':
    #输入4个参数,输出1个s参数
    path = r'total_data.csv'
    input_dim = 4
    hidden_dim = 8
    output_dim = 1

    #模型:两个隐藏层
    #模型:两个隐藏层
    ANN_model = nn.Sequential( nn.Linear(input_dim,hidden_dim), nn.ELU(),
                               nn.Linear(hidden_dim,hidden_dim),nn.ELU(),
                               nn.Linear(hidden_dim, hidden_dim), nn.ELU(),
                               nn.Linear(hidden_dim, output_dim))

    data = pd.read_csv(path,index_col=False,header=None,dtype=np.float32)
    data_total = np.array(data)

    #划分数据
    data_input = data_total[:,1:5]
    data_output = data_total[:,5]
    train_input, test_input, train_output, test_output = train_test_split(data_input,data_output,test_size=0.2)

    #转化为tensor
    train_input = torch.from_numpy(train_input).type(torch.float32)
    train_output = torch.from_numpy(train_output).type(torch.float32)

    test_input = torch.from_numpy(test_input).type(torch.float32)
    test_output = torch.from_numpy(test_output).type(torch.float32)
    #进行归一化处理
    train_input = torch.nn.functional.normalize(train_input,p=2,dim=1)
    test_input = torch.nn.functional.normalize(test_input,p=2,dim=1)

    # batch size和迭代次数
    batch_size = 100
    epochs = 200

    #合并
    train = torch.utils.data.TensorDataset(train_input, train_output)
    test = torch.utils.data.TensorDataset(test_input, test_output)

    #转化为dataloader
    train_loader = torch.utils.data.DataLoader(train, batch_size=batch_size, shuffle=True)
    test_loader = torch.utils.data.DataLoader(test, batch_size=20, shuffle=True)

    loss_func = nn.MSELoss()
    learning_rate = 0.01
    optimizer = torch.optim.Adam(ANN_model.parameters(), lr=learning_rate)
    test_loss = []
    train_loss = []

    for i in range(epochs):
        train_loop(train_loader, ANN_model, loss_func, optimizer, train_loss)
        test_loop(test_loader, ANN_model, loss_func, test_loss)
        print('---------------------------------')
        print('epoch:%s'%i)

    print("Done!")


    #绘图
    px = np.array(range(len(test_loss)))
    ptest_y = np.array(test_loss)
    plt.plot(px,ptest_y,color='green')
    plt.show()
运行结果

每个epoch结束跑一次测试集,结果如下:

img

我的解答思路和尝试过的方法

我一开始猜测是不是没有对四个输入参数进行归一化导致梯度消失,然后进行了归一化,没有改善网络的表现,然后又进行了下面的几种方法进行修改:
1、增加batch size:将batch size从30慢慢增加到100,学习率都为0.01
2、增加隐藏层节点:将隐藏层层数增加到七层,每层神经元循序渐进增加,为[8 16 32 64 32 16 8]
3、改变激活函数:一开始使用的是softmax(),Relu、Erelu、LeakyReLU、Tanh;
4、将数据进行归一化
使用了上述的方法还是不收敛
现在在尝试增加dropout layer

我想要达到的结果

将误差MSE降低到零点几这种数量级

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 11月8日
    • 创建了问题 10月31日

    悬赏问题

    • ¥30 STM32 INMP441无法读取数据
    • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
    • ¥15 用visualstudio2022创建vue项目后无法启动
    • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
    • ¥500 把面具戴到人脸上,请大家贡献智慧
    • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
    • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
    • ¥30 c#打开word开启修订并实时显示批注
    • ¥15 如何解决ldsc的这条报错/index error
    • ¥15 VS2022+WDK驱动开发环境