Torch,Numpy,Pandas转换具体实例

1.pandas.dataframe转成torch.tensor
方法一:先转成numpy array,再转成torch tensor

my_array = np.array(my_df)
my_tensor = torch.tensor(my_array)

方法二:若pandas.DataFrame的数据格式统一

torch.from_numpy(pd_data.values)

2.Tensor 和 NumPy 相互转换
可用numpy()from_numpy()将Tensor和NumPy中的数组相互转换。
但是需要注意的一点是: 这两个函数所产生的Tensor和NumPy中的数组共享相同的内存,所以它们之间的转换很快,改变其中一个时另一个也会改变!
2.1 Tensor 转 NumPy

a = torch.ones(6)
b = a.numpy()
print(a, b)

a += 1
print(a, b)
b += 1
print(a, b)

output:

tensor([1., 1., 1., 1., 1., 1.]) [1. 1. 1. 1. 1. 1.]
tensor([2., 2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2. 2.]
tensor([3., 3., 3., 3., 3., 3.]) [3. 3. 3. 3. 3. 3.]

2.2 NumPy 数组转 Tensor

import numpy as np
a = np.ones(7)
b = torch.from_numpy(a)
print(a, b)

a += 1
print(a, b)
b += 1
print(a, b)

output:

[1. 1. 1. 1. 1. 1. 1.] tensor([1., 1., 1., 1., 1., 1., 1.], dtype=torch.float64)
[2. 2. 2. 2. 2. 2. 2.] tensor([2., 2., 2., 2., 2., 2., 2.], dtype=torch.float64)
[3. 3. 3. 3. 3. 3. 3.] tensor([3., 3., 3., 3., 3., 3., 3.], dtype=torch.float64)

3.3 torch.tensor() 将 NumPy 数组转换成 Tensor
直接用torch.tensor()将NumPy数组转换成Tensor,该方法总是会进行数据拷贝,返回的Tensor和原来的数据不再共享内存。

import numpy as np
a = np.ones((2,3))
c = torch.tensor(a)
a += 1
print('a:',a)
print('c:',c)
print(id(a)==id(c))

output:

a: [[2. 2. 2.]
 [2. 2. 2.]]
c: tensor([[1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
False
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GRU模型可以用于预测交通量,其中输入可以是历史交通量数据,输出可以是未来一段时间内的交通量预测。下面是一个基于PyTorch的GRU模型预测交通量的具体实例及代码。 首先,需要准备好交通量数据,假设我们有一个包含历史交通量数据的CSV文件,其中每一行表示某个时间点的交通量数据。 ```python import pandas as pd from sklearn.preprocessing import MinMaxScaler # 读取数据 data = pd.read_csv('traffic_volume.csv') # 将交通量数据进行归一化 scaler = MinMaxScaler(feature_range=(0, 1)) data['traffic_volume'] = scaler.fit_transform(data['traffic_volume'].values.reshape(-1, 1)) ``` 然后,需要将数据分成训练集和测试集,可以选择最近一段时间的数据作为测试集,其余数据作为训练集。 ```python import numpy as np # 数据集划分 train_size = int(len(data) * 0.8) test_size = len(data) - train_size train, test = data.iloc[0:train_size], data.iloc[train_size:len(data)] # 将时间序列数据转换为有监督数据 def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(dataset)-look_back): a = dataset[i:(i+look_back), 0] dataX.append(a) dataY.append(dataset[i + look_back, 0]) return np.array(dataX), np.array(dataY) # 创建训练集和测试集 look_back = 24 trainX, trainY = create_dataset(train['traffic_volume'].values.reshape(-1, 1), look_back) testX, testY = create_dataset(test['traffic_volume'].values.reshape(-1, 1), look_back) # 将输入数据转换为PyTorch的Tensor类型 trainX = torch.from_numpy(trainX).type(torch.Tensor) trainY = torch.from_numpy(trainY).type(torch.Tensor) testX = torch.from_numpy(testX).type(torch.Tensor) testY = torch.from_numpy(testY).type(torch.Tensor) ``` 现在,我们可以定义GRU模型并进行训练。 ```python import torch.nn as nn import torch.optim as optim # 定义GRU模型 class GRUModel(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, num_layers): super(GRUModel, self).__init__() self.hidden_dim = hidden_dim self.num_layers = num_layers self.gru = nn.GRU(input_dim, hidden_dim, num_layers, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_() out, (hn) = self.gru(x, (h0.detach())) out = self.fc(out[:, -1, :]) return out # 定义模型参数 input_dim = 1 hidden_dim = 32 output_dim = 1 num_layers = 2 num_epochs = 100 # 创建模型实例 model = GRUModel(input_dim=input_dim, hidden_dim=hidden_dim, output_dim=output_dim, num_layers=num_layers) # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=0.01) # 训练模型 for epoch in range(num_epochs): optimizer.zero_grad() outputs = model(trainX) loss = criterion(outputs, trainY) loss.backward() optimizer.step() if epoch % 10 == 0: print("Epoch: %d, loss: %1.5f" % (epoch, loss.item())) ``` 最后,我们可以使用训练好的模型对测试集进行预测,并计算预测结果的均方根误差(RMSE)。 ```python from sklearn.metrics import mean_squared_error # 测试模型 model.eval() train_predict = model(trainX) test_predict = model(testX) # 反归一化 train_predict = scaler.inverse_transform(train_predict.detach().numpy()) trainY = scaler.inverse_transform(trainY.reshape(-1, 1)) test_predict = scaler.inverse_transform(test_predict.detach().numpy()) testY = scaler.inverse_transform(testY.reshape(-1, 1)) # 计算均方根误差 train_score = np.sqrt(mean_squared_error(trainY, train_predict)) print('Train Score: %.2f RMSE' % (train_score)) test_score = np.sqrt(mean_squared_error(testY, test_predict)) print('Test Score: %.2f RMSE' % (test_score)) ``` 完整代码如下: ```python import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import mean_squared_error # 读取数据 data = pd.read_csv('traffic_volume.csv') # 将交通量数据进行归一化 scaler = MinMaxScaler(feature_range=(0, 1)) data['traffic_volume'] = scaler.fit_transform(data['traffic_volume'].values.reshape(-1, 1)) # 数据集划分 train_size = int(len(data) * 0.8) test_size = len(data) - train_size train, test = data.iloc[0:train_size], data.iloc[train_size:len(data)] # 将时间序列数据转换为有监督数据 def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(dataset)-look_back): a = dataset[i:(i+look_back), 0] dataX.append(a) dataY.append(dataset[i + look_back, 0]) return np.array(dataX), np.array(dataY) # 创建训练集和测试集 look_back = 24 trainX, trainY = create_dataset(train['traffic_volume'].values.reshape(-1, 1), look_back) testX, testY = create_dataset(test['traffic_volume'].values.reshape(-1, 1), look_back) # 将输入数据转换为PyTorch的Tensor类型 trainX = torch.from_numpy(trainX).type(torch.Tensor) trainY = torch.from_numpy(trainY).type(torch.Tensor) testX = torch.from_numpy(testX).type(torch.Tensor) testY = torch.from_numpy(testY).type(torch.Tensor) # 定义GRU模型 class GRUModel(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, num_layers): super(GRUModel, self).__init__() self.hidden_dim = hidden_dim self.num_layers = num_layers self.gru = nn.GRU(input_dim, hidden_dim, num_layers, batch_first=True) self.fc = nn.Linear(hidden_dim, output_dim) def forward(self, x): h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_dim).requires_grad_() out, (hn) = self.gru(x, (h0.detach())) out = self.fc(out[:, -1, :]) return out # 定义模型参数 input_dim = 1 hidden_dim = 32 output_dim = 1 num_layers = 2 num_epochs = 100 # 创建模型实例 model = GRUModel(input_dim=input_dim, hidden_dim=hidden_dim, output_dim=output_dim, num_layers=num_layers) # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = optim.Adam(model.parameters(), lr=0.01) # 训练模型 for epoch in range(num_epochs): optimizer.zero_grad() outputs = model(trainX) loss = criterion(outputs, trainY) loss.backward() optimizer.step() if epoch % 10 == 0: print("Epoch: %d, loss: %1.5f" % (epoch, loss.item())) # 测试模型 model.eval() train_predict = model(trainX) test_predict = model(testX) # 反归一化 train_predict = scaler.inverse_transform(train_predict.detach().numpy()) trainY = scaler.inverse_transform(trainY.reshape(-1, 1)) test_predict = scaler.inverse_transform(test_predict.detach().numpy()) testY = scaler.inverse_transform(testY.reshape(-1, 1)) # 计算均方根误差 train_score = np.sqrt(mean_squared_error(trainY, train_predict)) print('Train Score: %.2f RMSE' % (train_score)) test_score = np.sqrt(mean_squared_error(testY, test_predict)) print('Test Score: %.2f RMSE' % (test_score)) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值