ESN学习笔记——echotorch(2)narma10

我忍不住吐槽一下这个包,第一行代码就报错,没有datasets是闹哪样

加载库

import torch
from echotorch.datasets.NARMADataset import NARMADataset
import echotorch.nn.reservoir as etrs
import echotorch.utils
import echotorch.utils.matrix_generation as mg
from torch.autograd import Variable
from torch.utils.data.dataloader import DataLoader
import numpy as np
import matplotlib.pyplot as plt

训练样本长度

train_sample_length = 5000

测试样本长度

test_sample_length = 1000

有多少训练/测试样本

n_train_samples = 1
n_test_samples = 1

批量大小(同时处理多少个样本?)

batch_size = 1

超参数

spectral_radius = 1.07
leaky_rate = 0.9261
input_dim = 1
reservoir_size = 410
connectivity = 0.1954
ridge_param = 0.00000409
input_scaling = 0.9252
bias_scaling = 0.079079

预测/目标长度

plot_length = 200

使用 CUDA?

use_cuda = False
use_cuda = torch.cuda.is_available() if use_cuda else False

人工种子初始化

np.random.seed(1)
torch.manual_seed(1)

NARMA30 数据集

narma10_train_dataset = NARMADataset(train_sample_length,
n_train_samples, system_order=10)

narma10_test_dataset = NARMADataset(test_sample_length,
n_test_samples, system_order=10)

数据加载器

trainloader = DataLoader(narma10_train_dataset,
batch_size=batch_size, shuffle=False, num_workers=2)

testloader = DataLoader(narma10_test_dataset,
batch_size=batch_size, shuffle=False, num_workers=2)

内部矩阵W生成

w_generator = echotorch.utils.matrix_generation.NormalMatrixGenerator(
connectivity=connectivity,
spetral_radius=spectral_radius
)

输入权重Win生成

win_generator = echotorch.utils.matrix_generation.NormalMatrixGenerator(
connectivity=connectivity,
scale=input_scaling,
apply_spectral_radius=False
)

Bias vector偏差向量生成

wbias_generator = echotorch.utils.matrix_generation.NormalMatrixGenerator(
connectivity=connectivity,
scale=bias_scaling,
apply_spectral_radius=False
)

创建一个Leaky-integrated ESN,用最小二乘训练算法,调用 esn = etrs.ESN(

esn = etrs.LiESN(
input_dim=input_dim,
hidden_dim=reservoir_size,
output_dim=1,
leaky_rate=leaky_rate,
learning_algo=‘inv’,
w_generator=w_generator,
win_generator=win_generator,
wbias_generator=wbias_generator,
ridge_param=ridge_param
)

如果可能,在GPU中传输

if use_cuda:
esn.cuda()
#end if

对每一批

for data in trainloader:
#输入和输出
inputs, targets = data
#将数据转换为变量Variables
inputs, targets = Variable(inputs), Variable(targets)
if use_cuda: inputs, targets = inputs.cuda(), targets.cuda()
# ESN需要的inputs and targets
esn(inputs, targets)
# end for

计算输出矩阵Wout来结束训练

esn.finalize()

得到训练集中的第一个样本,转为Variable.

dataiter = iter(trainloader)
train_u, train_y = dataiter.next()
train_u, train_y = Variable(train_u), Variable(train_y)
if use_cuda: train_u, train_y = train_u.cuda(), train_y.cuda()

用我们训练过的ESN做预测

y_predicted = esn(train_u)

打印训练误差 MSE和 NRMSE

print(u"Train MSE: {}".format(echotorch.utils.mse(y_predicted.data, train_y.data)))
print(u"Test NRMSE: {}".format(echotorch.utils.nrmse(y_predicted.data, train_y.data)))
print(u"")

得到测试集中的第一个样本转为Variable.

dataiter = iter(testloader)
test_u, test_y = dataiter.next()
test_u, test_y = Variable(test_u), Variable(test_y)
if use_cuda: test_u, test_y = test_u.cuda(), test_y.cuda()

用我们训练过的ESN做预测

y_predicted = esn(test_u)

打印测试集上的 MSE 和NRMSE

print(u"Test MSE: {}".format(echotorch.utils.mse(y_predicted.data, test_y.data)))
print(u"Test NRMSE: {}".format(echotorch.utils.nrmse(y_predicted.data, test_y.data)))
print(u"")

展示目标和预测

plt.plot(test_y[0, :plot_length, 0].data, ‘r’)
plt.plot(y_predicted[0, :plot_length, 0].data, ‘b’)
plt.show()

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值