神经网络预测地震加速度反应谱曲线,pytorch实现
生活随笔
收集整理的這篇文章主要介紹了
神经网络预测地震加速度反应谱曲线,pytorch实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先要下載好的庫:pytorch, matplotlib
推薦使用pycharm + Anaconda的環境配置
一、生成數據集
data2.py
import numpy as np # 特征周期Tg a = [] for i in range(10):c = i + 1if 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.01elif i == 1:theta = 0.02elif i == 2:theta = 0.05elif i == 3:theta = 0.1elif i == 4:theta = 0.2elif i == 5:theta = 0.3c.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.04elif j == 1:alpha = 0.08elif j == 2:alpha = 0.12elif j == 3:alpha = 0.16elif j == 4:alpha = 0.24elif j == 5:alpha = 0.28elif j == 6:alpha = 0.32elif j == 7:alpha = 0.5elif j == 8:alpha = 0.72elif j == 9:alpha = 0.9elif j == 10:alpha = 1.2elif j == 11:alpha = 1.4input_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 = 1000000for epoch in range(num_epochs):for step, (data, target) in enumerate(train_loader):# print(data)# print(target)# breakoutput = 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:breaktorch.save(model, 'net.pkl') # 保存整個網絡 torch.save(model.state_dict(), 'net_params.pkl') # 只保存網絡中的參數 (速度快, 占內存少)三、測試神經網絡
test.py
import torch import matplotlib.pyplot as pltnet2 = torch.load('net.pkl')# 輸入參數,[Tg, theta, T, alpha] Tg = 0.35 theta = 0.05 alpha = 0.08gamma = 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.01x.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()結果:
總結
以上是生活随笔為你收集整理的神经网络预测地震加速度反应谱曲线,pytorch实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WEBRTC TURNSERVER配置
- 下一篇: win10下用ffmpeg推流拉流