神经网络预测地震加速度反应谱曲线,pytorch实现

首先要下载好的库:pytorch, matplotlib
推荐使用pycharm + Anaconda的环境配置

一、生成数据集

data2.py

import numpy as np
# 特征周期Tg
a = []
for i in range(10):
    c = i + 1
    if c <= 6:
        a.append(round(0.2 + (c - 1) * 0.05, 2))
    elif c <= 9:
        a.append(round(0.55 + (c - 7) * 0.1, 2))
    else:
        a.append(round(0.9, 2))

# 阻尼比theta
c = []
for i in range(6):
    if i == 0:
        theta = 0.01
    elif i == 1:
        theta = 0.02
    elif i == 2:
        theta = 0.05
    elif i == 3:
        theta = 0.1
    elif i == 4:
        theta = 0.2
    elif i == 5:
        theta = 0.3

    c.append(theta)


# 输入矩阵,[Tg, theta, T, alpha]
input_data = []
for i in range(10):
    for k in range(6):
        for j in range(12):
            for l in range(600):
                input_data.append([a[i], c[k], round(0.01 * l, 2)])

                if j == 0:
                    alpha = 0.04
                elif j == 1:
                    alpha = 0.08
                elif j == 2:
                    alpha = 0.12
                elif j == 3:
                    alpha = 0.16
                elif j == 4:
                    alpha = 0.24
                elif j == 5:
                    alpha = 0.28
                elif j == 6:
                    alpha = 0.32
                elif j == 7:
                    alpha = 0.5
                elif j == 8:
                    alpha = 0.72
                elif j == 9:
                    alpha = 0.9
                elif j == 10:
                    alpha = 1.2
                elif j == 11:
                    alpha = 1.4

                input_data[-1].append(alpha)

target_data = []

for i in range(10):
    for k in range(6):
        for j in range(12):
            for l in range(600):
                tem = input_data[i * 6 * 12 * 600 + k * 12 * 600 + j * 600 + l]


                Tg1 = tem[0]
                theta1 = tem[1]
                T1 = tem[2]
                alpha1 = tem[3]

                gamma = round(0.9 + (0.05 - theta1) / (0.3 + 6 * theta1), 2)
                eta1 = round(0.02 + (0.05 - theta1) / (4 + 32 * theta1), 3)
                eta2 = round(1 + (0.05 - theta1) / (0.06 + 1.6 * theta1), 2)

                if T1 <= 0.1:
                    target_data.append([round(10 * (eta2 - 0.45) * alpha1 * T1 + 0.45 * alpha1, 5)])
                elif T1 <= Tg1:
                    target_data.append([round(eta2 * alpha1, 5)])
                elif T1 <= 5 * Tg1:
                    target_data.append([round(pow((Tg1 / T1), gamma) * eta2 * alpha1, 5)])
                else:
                    target_data.append([round((eta2 * pow(0.2, gamma) - eta1 * (T1 - 5 * Tg1)) * alpha1, 5)])


input_data = np.array(input_data)
target_data = np.array(target_data)

# print(input_data)
# print(len(input_data))
#
# print(target_data)
# print(len(target_data))

二、搭建神经网络

main.py

import torch
from torch import nn
from torch.utils.data import DataLoader
import torch.utils.data as Data
import data2

# 数据集
input = torch.from_numpy(data2.input_data)
target = torch.from_numpy(data2.target_data)

input = torch.tensor(input, dtype=torch.float32)
target = torch.tensor(target, dtype=torch.float32)

# print(input)
# print(target)

# 搭建神经网络
model = torch.nn.Sequential(
    torch.nn.Linear(1*4, 500),
    torch.nn.ReLU(),
    torch.nn.Linear(500, 500),
    torch.nn.ReLU(),
    torch.nn.Linear(500, 500),
    torch.nn.ReLU(),
    torch.nn.Linear(500, 1)

)

# 损失函数和优化器
loss_fuc = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 数据集和下载器
train_dataset = Data.TensorDataset(input, target)
train_loader = DataLoader(train_dataset, batch_size=1000, shuffle=True)

num_epochs = 1000000

for epoch in range(num_epochs):
    for step, (data, target) in enumerate(train_loader):
        # print(data)
        # print(target)
        # break
        output = model(data)
        loss = loss_fuc(output, target)

        # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    print('Epoch:', epoch + 1, ' ', 'Loss: ', loss.item())

    if loss.item() < 0.0001:
        break

torch.save(model, 'net.pkl')  # 保存整个网络
torch.save(model.state_dict(), 'net_params.pkl')   # 只保存网络中的参数 (速度快, 占内存少)

三、测试神经网络

test.py

import torch
import matplotlib.pyplot as plt

net2 = torch.load('net.pkl')

# 输入参数,[Tg, theta, T, alpha]
Tg = 0.35
theta = 0.05
alpha = 0.08


gamma = round(0.9 + (0.05 - theta) / (0.3 + 6 * theta), 2)
eta1 = round(0.02 + (0.05 - theta) / (4 + 32 * theta), 3)
eta2 = round(1 + (0.05 - theta) / (0.06 + 1.6 * theta), 2)

plt.subplot()

x = []
target = []
prediction = []

for i in range(600):
    T = i * 0.01
    x.append(round(i * 0.01, 2))

    if T <= 0.1:
        target.append([round(10 * (eta2 - 0.45) * alpha * T + 0.45 * alpha, 5)])
    elif T <= Tg:
        target.append([round(eta2 * alpha, 5)])
    elif T <= 5 * Tg:
        target.append([round(pow((Tg / T), gamma) * eta2 * alpha, 5)])
    else:
        target.append([round((eta2 * pow(0.2, gamma) - eta1 * (T - 5 * Tg)) * alpha, 5)])

    input = torch.Tensor([Tg, theta, T, alpha])
    input = torch.tensor(input, dtype=torch.float32)

    output = net2(input)
    output = torch.tensor(output, dtype=torch.float32)
    output = output.numpy()
    prediction.append(output)


plt.plot(x, target, 'r-', lw=2)
plt.plot(x, prediction, 'b-', lw=2)
plt.show()

结果:
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于PyTorch的BP神经网络预测天气的实现,是通过构建一个具有输入、隐藏和输出层的BP神经网络,利用PyTorch的自动微分功能,通过反向传播算法训练网络,对未来若干天的天气进行预测。 具体来说,需要先准备好天气的历史数据,包括气温、湿度、降雨量等指标,并将其归一化处理,以便于神经网络的训练。然后,构建一个具有若干个隐藏层、各层节点数量等超参数的神经网络,并定义损失函数,通常采用均方误差(MSE)来衡量实际值与预测值之间的差距。 接下来,利用PyTorch提供的优化器进行训练,每次迭代都通过前向传播计算预测值,并通过反向传播进行权重和偏置的更新,提高预测的准确性。经过若干轮的训练后,即可得到一个能够对未来若干天天气进行预测的BP神经网络模型。 最后,在得到测试数据集后,可以将其输入到训练好的神经网络中进行预测,并与实际观测结果进行比较,以评估预测模型的准确性和可靠性。 总体而言,基于PyTorch的BP神经网络预测天气的实现,需要涉及到数据准备、网络构建、训练优化和预测等多个环节,并需要不断调整模型的超参数和优化算法,以获得更加精准的预测结果。 ### 回答2: 随着人们对气象数据的需求不断增加,用机器学习来预测天气已成为一种研究热点。基于PyTorch的BP神经网络预测天气的实现也是一种可行的方法。 BP神经网络是一种常用的人工神经网络模型,与其他机器学习模型相比,具有训练速度快、准确率高等优点。利用PyTorch库可以轻松地构建一个多层BP神经网络实现天气预测。具体步骤如下: 1. 数据准备:首先需要收集和整理天气数据,这包括温度、湿度、气压等多个参数,并将其转换为PyTorch可处理的格式。 2. 网络结构设计:设计带有多个隐层的BP神经网络,其中每个隐层都包含多个神经元,以提高预测精度。 3. 损失函数确定:选择适当的损失函数,如均方误差等。 4. 参数优化:利用PyTorch提供的自动微分功能,采用梯度下降等优化算法来优化模型的参数,使得损失函数的值达到最小。 5. 模型预测:利用训练好的BP神经网络对未知天气数据进行预测,并根据预测结果做出相应的决策。 总之,基于PyTorch的BP神经网络预测天气的实现方法是一种快速、高效的数据分析方法,可以为天气预报提供更重要的数据分析手段,具有非常广阔的应用前景。 ### 回答3: 基于pytorch的bp神经网络能够很好地处理天气预测中的非线性问题,通过对训练集数据进行训练,进而预测出未来气温、降水概率等气象参数。 首先,需要准备好气象数据,包括气温、湿度、气压等多个参数的历史数据。将这些数据拆分成训练集和测试集,以便对模型的准确性进行验证。接下来,选取合适的神经网络结构,并使用pytorch进行搭建。此处可以选择多层全连接网络,通过激活函数如ReLU等将非线性输入转化为线性输出。同时需要选择合适的优化器和损失函数,PyTorch提供了常见的梯度下降优化器和多种损失函数,如均方误差、交叉熵等。 然后,使用训练集数据对模型进行训练。训练过程中需要注意选择合适的学习率和训练轮数,表示模型需要学习的速度和总共需要学习的次数。在训练过程中,模型会根据损失函数计算出预测值与真实值之间的误差,进而利用反向传播算法更新网络中的参数。最终得到一个训练好的模型。 最后,使用测试集验证模型的准确性。将测试集输入模型后,将得到预测值,再将预测值与测试集中的真实值进行比较,得到模型的准确性指标,如精度、召回率等。可以通过多次检验和调整网络结构、超参数等方法优化模型的准确性。 基于pytorch的bp神经网络预测天气是一种高效、准确的气象预测方法,可以为天气预测提供有力支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值