数据训练 torch.manual_seed(101) model = CNNnetwork() 设置损失函数 均方差损失 criterion = nn.MSELoss() 设置优化函数、学习率 optimizer = torch.optim.Adam(model.parameters(), lr=0.001) epochs = 100 # 训练周期 model.train() start_time = time.time() for epoch in range(epochs): for seq, y_train in train_data: # 每次更新参数前都梯度归零和初始化 optimizer.zero_grad() # 注意这里要对样本进行reshape, # 转换成conv1d的input size(batch size, channel, series length) y_pred = model(seq.reshape(1, 1, -1)) loss = criterion(y_pred,y_train) loss.backward() optimizer.step() print(f'Epoch:{epoch+1:2} Loss:{loss.item():10.8f}') print(f'\nDuration:{time.time() - start_time:.0f} seconds') 数据预测 future = 12 选取序列最后12个值进行预测 preds = train_norm[-window_size:].tolist() 设置成eval模式 model.eval() 循环的每一步表示时间序列向后滑动一格 for i in range(future): seq = torch.FloatTensor(preds[-window_size:]) with torch.no_grad(): preds.append(model(seq.reshape(1, 1, -1)).item()) 返归一化还原真实值 true_predictions = scaler.inverse_transform(np.array(preds[window_size:]).reshape(-1,1)) 对比真实值与预测值 plt.figure(figsize=(12, 6)) plt.grid(True) plt.plot(df['S4248SM144NCEN']) x = np.arange('2018-02-01', '2019-02-01', dtype='datetime64[M]').astype('datetime64[D]') plt.plot(x,true_predictions) plt.show()
时间: 2024-04-22 12:26:29 浏览: 12
这段代码完成了对时间序列数据的训练和预测。首先,设置了随机种子并创建了一个CNN网络模型。
然后,定义了均方差损失函数和Adam优化器,并设置了学习率为0.001。
在训练阶段,使用一个循环来遍历训练数据集中的序列和目标值。在每个训练样本前,使用optimizer.zero_grad()将梯度归零,以防止梯度累积。然后,通过将序列进行reshape,转换为conv1d的输入尺寸(batch size,channel,series length),并将其传入模型中进行预测。计算预测值与真实值之间的均方差损失,并进行反向传播更新模型的参数。最后打印出每个epoch的损失值。
在预测阶段,首先设置模型为eval模式。然后,通过循环预测未来一段时间的值。每次预测时,将最后一部分序列作为输入,并使用模型进行预测。将预测值添加到preds列表中。最后,将预测值转换回原始比例,并将其与真实值进行可视化比较。
请注意,这段代码中使用了一些未定义的变量(例如train_data、train_norm、window_size),你需要在之前的代码中定义和初始化这些变量。
相关问题
seed=2 torch.manual_seed(seed) torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) np.random.seed(seed) random.seed(seed) torch.manual_seed(seed) torch.backends.cudnn.benchmark=False torch.backends.cudnn.deterministic=True os.environ["H5PY_DEFAULT_READONLY"] = "1"
这段代码的作用是设置随机种子,以确保实验的可重复性和稳定性。具体来说,它会设置以下几个部分的随机种子:
1. 设置PyTorch的随机种子:`torch.manual_seed(seed)`,用于生成随机数。
2. 设置CUDA随机种子:`torch.cuda.manual_seed(seed)`和`torch.cuda.manual_seed_all(seed)`,用于在使用CUDA时生成随机数。
3. 设置NumPy的随机种子:`np.random.seed(seed)`,用于在使用NumPy时生成随机数。
4. 设置Python内置随机库的随机种子:`random.seed(seed)`,用于在使用Python内置的random库时生成随机数。
5. 设置PyTorch的CUDNN库行为:`torch.backends.cudnn.benchmark=False`和`torch.backends.cudnn.deterministic=True`,用于控制CUDNN库的行为,使得结果可重复。
6. 设置H5PY库只读模式:`os.environ["H5PY_DEFAULT_READONLY"] = "1"`,用于设置H5PY库在读取文件时只读取数据而不执行写入操作。
通过以上设置,可以确保在相同的随机种子下运行实验时,生成的随机数序列是相同的,从而保证实验结果的可重复性。
解释一下def setup_seed(seed): # seed=42 torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) random.seed(seed) np.random.seed(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmard = False torch.random.manual_seed(seed)
这段代码是用于设置随机种子,确保实验的可重复性。在深度学习的任务中,涉及到随机性,如权重的初始化、数据的划分、数据增强等,都会对最终的结果产生影响。通过设置随机种子,可以保证每次运行程序时得到相同的随机数序列,从而使实验结果可重现。
具体来说,这段代码首先通过torch.manual_seed(seed)设置PyTorch的随机种子为给定的seed值。然后,通过判断torch.cuda.is_available()来确定是否使用GPU,如果可用,就分别通过torch.cuda.manual_seed(seed)和torch.cuda.manual_seed_all(seed)设置GPU的随机种子。
接下来,通过random.seed(seed)、np.random.seed(seed)和torch.random.manual_seed(seed)分别设置Python标准库中random模块、NumPy库和PyTorch中的随机模块的随机种子。
最后,通过设置torch.backends.cudnn.deterministic = True和torch.backends.cudnn.benchmark = False来确保使用GPU加速时的结果一致性。
总之,这段代码的作用是将各个随机模块的种子设置为相同的值,以确保实验的可重复性和结果的一致性。