Pytorch实现波形信号拟合

该博客介绍了如何使用PyTorch生成随机数据并保存,然后构建一个卷积神经网络进行训练。数据集由160个在100到200之间的浮点数构成,网络包含多个卷积层和全连接层。在训练过程中,使用MSELoss作为损失函数,Adam作为优化器,并展示了训练过程中的损失变化。最后,对测试数据进行了预测,并计算了R²得分和解释方差得分来评估模型性能。
摘要由CSDN通过智能技术生成

下面完整代码在github仓库:传送门


一、生成随机数据并保存成文件

import torch

# 在100到200范围内生成5个数据
train_data = torch.randint(100, 200, (5, ), dtype=torch.float32)

for i in range(5):
    # 在生成的五个数据中让它们有一定范围性的波动(-2,2)
    gen_data = train_data + torch.randint(-2, 2, (len(train_data), ))
    # print(train_data)
    # print(gen_data)
    train_data = torch.cat([train_data, gen_data])  # 以行进行拼接数据

print(train_data)
print(len(train_data))  # 160个数据
test_data = train_data + torch.randint(-2, 2, (len(train_data), ))
print(test_data)
torch.save(train_data, "./train.data")
torch.save(test_data, "./test.data")

二、搭建网络并且开始训练

import torch
import torch.nn as nn
from sklearn.metrics import r2_score, explained_variance_score
import matplotlib.pyplot as plt


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()  # 1*1*9
        self.conv1 = nn.Sequential(
            nn.Conv1d(1, 64, 3, 1, 0),
            nn.BatchNorm1d(64),
            nn.ReLU()
        )  # 1*64*7  N*C*L

        self.conv2 = nn.Sequential(
            nn.Conv1d(64, 128, 3, 1, 0),
            nn.BatchNorm1d(128),
            nn.ReLU()
        )  # 1*128*5
        self.conv3 = nn.Sequential(
            nn.Conv1d(128, 512, 3, 1, 0),
            nn.BatchNorm1d(512),
            nn.ReLU()
        )  # 1*512*3
        self.fc = nn.Linear(3*512, 1)

    def forward(self, x):
        y = self.conv1(x)
        y = self.conv2(y)
        y = self.conv3(y)

        y = y.reshape(y.size(0), -1)
        y = self.fc(y)
        # print(y.shape)  # torch.Size([1, 1])

        return y


if __name__ == '__main__':
    train_data = torch.load("./train.data")
    # print(train_data)
    test_data = torch.load("./test.data")

    net = Net()
    loss_fn = nn.MSELoss()
    optim = torch.optim.Adam(net.parameters())

    for epoch in range(10):
        for i in range(len(train_data) - 9):  # i范围为0-150
            x = train_data[i: i+9]  # 拿到前面的九个数据
            y = train_data[i+9: i+10]  # 拿到第十个数据
            # print(x)
            # print(y)
            x = x.reshape(-1, 1, 9)  # torch.Size([1, 1, 9])
            y = y.reshape(-1, 1)  # torch.Size([1, 1])
            # print(x)
            # print(y)
            out = net(x)  # # torch.Size([1, 1])
            loss = loss_fn(out, y)

            optim.zero_grad()
            loss.backward()
            optim.step()

            print("epoch:{}, i:{}, loss:{}".format(epoch, i, loss.item()))

        torch.save(net.state_dict(), "./params.pth")

    label = []
    output = []
    count = []
    plt.ion()
    for i in range(len(test_data) - 9):  # 循环151次
        x = test_data[i: i+9]
        y = test_data[i+9: i+10]
        x = x.reshape(-1, 1, 9)  # torch.Size([1, 1, 9])
        y = y.reshape(-1, 1)  # torch.Size([1, 1])
        # print(test_data)

        out = net(x)
        loss = loss_fn(out, y)

        # print(y)  # tensor([[176.]])
        # print(y.numpy())  # [[176.]]
        # print(y.numpy().reshape(-1))  # [176.]

        # print(out)  # tensor([[174.9553]], grad_fn=<AddmmBackward>)
        # print(out.data)  # tensor([[174.9553]])
        # print(out.data.numpy())  # [[174.95534]]
        # print(out.data.numpy().reshape(-1))  # [174.95534]

        label.append(y.numpy().reshape(-1))
        output.append(out.data.numpy().reshape(-1))
        count.append(i)
        # print(label)  # [array([176.], dtype=float32)]
        # print(output)  # [array([174.95534], dtype=float32)]
        # print(count)  # [0]

        plt.clf()
        label_icon, = plt.plot(count, label, color="red")  # 返回标签图标(元祖)
        out_icon,  = plt.plot(count, output, color="blue")  # 返回输出图标(元祖)
        plt.legend([label_icon, out_icon], ["label", "output"], loc="upper right", fontsize=10)
        plt.pause(0.1)

    plt.savefig("./img.pdf")
    plt.ioff()
    # plt.show()
    r2 = r2_score(label, output)
    var = explained_variance_score(label, output)
    print(r2)
    print(var)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个基于Python的开源机器学习库,它提供了丰富的工具和函数来实现各种机器学习任务,包括曲线拟合。 要使用PyTorch实现曲线拟合,可以按照以下步骤进行: 1. 导入必要的库和模块: ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np ``` 2. 准备数据: 准备输入数据和目标数据,可以使用numpy生成一些示例数据: ```python # 生成示例数据 x = np.linspace(-10, 10, 100) y = 2 * x + 1 + np.random.randn(*x.shape) # 添加噪声 ``` 3. 定义模型: 使用PyTorch定义一个简单的线性模型,例如使用一个全连接层: ```python class LinearModel(nn.Module): def __init__(self): super(LinearModel, self).__init__() self.linear = nn.Linear(1, 1) # 输入维度为1,输出维度为1 def forward(self, x): return self.linear(x) ``` 4. 定义损失函数和优化器: 选择适当的损失函数和优化器来训练模型,例如使用均方误差损失函数和随机梯度下降优化器: ```python model = LinearModel() criterion = nn.MSELoss() optimizer = optim.SGD(model.parameters(), lr=0.01) ``` 5. 训练模型: 使用训练数据对模型进行训练,迭代多个epoch,每个epoch中进行前向传播、计算损失、反向传播和参数更新: ```python epochs = 100 for epoch in range(epochs): inputs = torch.from_numpy(x).float().unsqueeze(1) targets = torch.from_numpy(y).float().unsqueeze(1) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, epochs, loss.item())) ``` 6. 使用模型进行预测: 训练完成后,可以使用模型对新的输入数据进行预测: ```python new_x = np.array([1, 2, 3, 4, 5]) inputs = torch.from_numpy(new_x).float().unsqueeze(1) predictions = model(inputs) ``` 这样就完成了使用PyTorch实现曲线拟合的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值