return data, label def __len__(self): return len(self.data)train_dataset = MyDataset(train, y[:split_boundary].values, time_steps, output_steps, target_index)test_ds = MyDataset(test, y[split_boundary:].values, time_steps, output_steps, target_index)class MyLSTMModel(nn.Module): def __init__(self): super(MyLSTMModel, self).__init__() self.rnn = nn.LSTM(input_dim, 16, 1, batch_first=True) self.flatten = nn.Flatten() self.fc1 = nn.Linear(16 * time_steps, 120) self.relu = nn.PReLU() self.fc2 = nn.Linear(120, output_steps) def forward(self, input): out, (h, c) = self.rnn(input) out = self.flatten(out) out = self.fc1(out) out = self.relu(out) out = self.fc2(out) return outepoch_num = 50batch_size = 128learning_rate = 0.001def train(): print('训练开始') model = MyLSTMModel() model.train() opt = optim.Adam(model.parameters(), lr=learning_rate) mse_loss = nn.MSELoss() data_reader = DataLoader(train_dataset, batch_size=batch_size, drop_last=True) history_loss = [] iter_epoch = [] for epoch in range(epoch_num): for data, label in data_reader: # 验证数据和标签的形状是否满足期望,如果不满足,则跳过这个批次 if data.shape[0] != batch_size or label.shape[0] != batch_size: continue train_ds = data.float() train_lb = label.float() out = model(train_ds) avg_loss = mse_loss(out, train_lb) avg_loss.backward() opt.step() opt.zero_grad() print('epoch {}, loss {}'.format(epoch, avg_loss.item())) iter_epoch.append(epoch) history_loss.append(avg_loss.item()) plt.plot(iter_epoch, history_loss, label='loss') plt.legend() plt.xlabel('iters') plt.ylabel('Loss') plt.show() torch.save(model.state_dict(), 'model_1')train()param_dict = torch.load('model_1')model = MyLSTMModel()model.load_state_dict(param_dict)model.eval()data_reader1 = DataLoader(test_ds, batch_size=batch_size, drop_last=True)res = []res1 = []# 在模型预测时,label 的处理for data, label in data_reader1: data = data.float() label = label.float() out = model(data) res.extend(out.detach().numpy().reshape(data.shape[0]).tolist()) res1.extend(label.numpy().tolist()) # 由于预测一步,所以无需 reshape,直接转为 list 即可title = "t321"plt.title(title, fontsize=24)plt.xlabel("time", fontsize=14)plt.ylabel("irr", fontsize=14)plt.plot(res, color='g', label='predict')plt.plot(res1, color='red', label='real')plt.legend()plt.grid()plt.show()的运算过程
时间: 2024-03-31 11:38:30 浏览: 26
这段代码是用 PyTorch 实现的一个 LSTM 模型,用于时间序列预测。首先定义了一个自定义的数据集类 MyDataset,用于加载训练数据和测试数据。然后定义了一个包含 LSTM 层的 MyLSTMModel 模型,并在 train 函数中使用 DataLoader 加载训练数据集,采用 Adam 优化器和 MSE 损失函数进行训练。训练过程中记录了每个 epoch 的损失值,并在训练结束后保存了模型参数。最后,使用加载的模型参数对测试数据进行预测,并将预测结果和真实值可视化展示出来。
相关问题
class MyDataset(Dataset): def _init__(self, train_path): self.train_path = train_path self.image_path = os.path.join(train_path, 'image') self.label_path = os.path.join(train_path, "label") self.image_path_list = os.listdir(self.image_path) def __getitem__(self, index) -> T_co: image_name = self.image_path_list[index] image_path = os.path.join(self.image_path, image_name) img = cv.imread(image_path) label_name = 'txt'.join(image_name.rsplit(image_name.split('. ')[-1], 1)) label_path = os.path.join(self.label_path, label_name) label = read_label(label_path) return img,label def __len__(self): return Len(self.image_path_list) img, label = my_dataset[data_index]这段代码中img, label = my_dataset[data_index]为什么可以这样用
`img, label = my_dataset[data_index]` 这行代码使用了 Python 的序列解包(sequence unpacking)功能,将 `my_dataset[data_index]` 返回的元组解包成 `img` 和 `label` 两个变量。
在这里,`my_dataset` 是 MyDataset 类的一个实例,`data_index` 是一个整数,它作为索引被传递给 `my_dataset` 的 `__getitem__` 方法。由于 `__getitem__` 方法返回的是一个元组,因此可以使用序列解包将其拆分为两个变量 `img` 和 `label`。
最终,`img` 和 `label` 分别表示了该数据集中第 `data_index` 个图像的图像数据和标签数据。这样就可以使用这些数据进行训练或测试了。
from torch.utils.data import Dataset from torch.utils.data.dataset import T_co import os import cv2 as cv def read_label(path): file = open(path, "r", encoding='utf-8') label = file.readline() file.close() return label class MyDataset(Dataset): def _init__(self, train_path): self.train_path = train_path self.image_path = os.path.join(train_path, 'image') self.label_path = os.path.join(train_path, "label") self.image_path_list = os.listdir(self.image_path) def __getitem__(self, index) -> T_co: image_name = self.image_path_list[index] image_path = os.path.join(self.image_path, image_name) img = cv.imread(image_path) label_name = 'txt'.join(image_name.rsplit(image_name.split('. ')[-1], 1)) label_path = os.path.join(self.label_path, label_name) label = read_label(label_path) return img,label def __len__(self): return Len(self.image_path_list) my_dataset = MyDataset("dataset/train") data_index = 100 img, label = my_dataset[data_index] cv.imshow(label+ str(data_index)+str(Len(my_dataset)) + ')', img) cv.waitKey(0)详解这段代码
这段代码定义了一个自定义的 PyTorch 数据集类 MyDataset,用于加载训练数据集中的图像和标签。其中:
- `_init__` 方法初始化了数据集的路径和图像文件名列表;
- `__getitem__` 方法按照给定的索引 index,读取对应的图像和标签,并返回它们的元组;
- `__len__` 方法返回数据集中图像的数量。
具体来说,这个数据集类假设训练数据集中的图像文件都存储在 "dataset/train/image" 目录下,而对应的标签文件都存储在 "dataset/train/label" 目录下,且标签文件的文件名和对应的图像文件名一致,只是后缀名不同(图像文件的后缀名为图片格式,标签文件的后缀名为 "txt")。标签文件中只包含一个文本行,表示对应图像的标签。
在这个数据集类中,`read_label` 函数用于读取标签文件的内容,`cv.imread` 函数用于读取图像文件的内容,`os.path.join` 函数用于拼接路径,`os.listdir` 函数用于列出目录下的文件名列表。
最后,这段代码创建了一个 MyDataset 类的实例 my_dataset,用于加载 "dataset/train" 目录下的训练数据集。然后它从数据集中取出第 100 个样本,显示它的图像和标签。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)