我已经用pytorch训练了一个RNN模型。由于某些奇怪的依赖关系问题,我无法在某个环境中安装pytorch,但我可以安装numpy、scipy和其他库。因此,我想在没有pytorch的情况下使用训练好的模型和网络定义进行预测。
我保存了模型的权重和状态字典,方式符合标准方式,但我也可以使用json/pickle文件或类似的方式进行保存。
我还有网络定义文件,但它在很多方面都依赖于pytorch。这是我的RNN网络定义。
我知道这个问题,但我愿意尽可能地降低级别。我可以使用numpy数组而不是张量,并使用reshape而不是view,而且我不需要设备设置。
基于上面的类定义,我所需要从torch中获取的组件只有以下内容才能从前向函数中获得输出:
因此,问题是,如何将这个RNN定义“翻译”成一个不需要pytorch的类,以及如何为它使用state dict权重? 或者,是否有一个“轻量级”的pytorch版本,我可以使用它来运行模型并产生结果?
编辑
我认为将nn.LSTM和nn.linear的numpy/scipy等效项包括进来可能会有用。这将帮助我们比较相同代码的numpy输出与torch输出,并为我们提供一些可重复使用的模块化代码/函数。具体来说,以下内容的numpy等效项将非常有用:
我保存了模型的权重和状态字典,方式符合标准方式,但我也可以使用json/pickle文件或类似的方式进行保存。
我还有网络定义文件,但它在很多方面都依赖于pytorch。这是我的RNN网络定义。
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import random
torch.manual_seed(1)
random.seed(1)
device = torch.device('cpu')
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size,num_layers, matching_in_out=False, batch_size=1):
super(RNN, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.output_size = output_size
self.num_layers = num_layers
self.batch_size = batch_size
self.matching_in_out = matching_in_out #length of input vector matches the length of output vector
self.lstm = nn.LSTM(input_size, hidden_size,num_layers)
self.hidden2out = nn.Linear(hidden_size, output_size)
self.hidden = self.init_hidden()
def forward(self, feature_list):
feature_list=torch.tensor(feature_list)
if self.matching_in_out:
lstm_out, _ = self.lstm( feature_list.view(len( feature_list), 1, -1))
output_space = self.hidden2out(lstm_out.view(len( feature_list), -1))
output_scores = torch.sigmoid(output_space) #we'll need to check if we need this sigmoid
return output_scores #output_scores
else:
for i in range(len(feature_list)):
cur_ft_tensor=feature_list[i]#.view([1,1,self.input_size])
cur_ft_tensor=cur_ft_tensor.view([1,1,self.input_size])
lstm_out, self.hidden = self.lstm(cur_ft_tensor, self.hidden)
outs=self.hidden2out(lstm_out)
return outs
def init_hidden(self):
#return torch.rand(self.num_layers, self.batch_size, self.hidden_size)
return (torch.rand(self.num_layers, self.batch_size, self.hidden_size).to(device),
torch.rand(self.num_layers, self.batch_size, self.hidden_size).to(device))
我知道这个问题,但我愿意尽可能地降低级别。我可以使用numpy数组而不是张量,并使用reshape而不是view,而且我不需要设备设置。
基于上面的类定义,我所需要从torch中获取的组件只有以下内容才能从前向函数中获得输出:
- nn.LSTM
- nn.Linear
- torch.sigmoid
因此,问题是,如何将这个RNN定义“翻译”成一个不需要pytorch的类,以及如何为它使用state dict权重? 或者,是否有一个“轻量级”的pytorch版本,我可以使用它来运行模型并产生结果?
编辑
我认为将nn.LSTM和nn.linear的numpy/scipy等效项包括进来可能会有用。这将帮助我们比较相同代码的numpy输出与torch输出,并为我们提供一些可重复使用的模块化代码/函数。具体来说,以下内容的numpy等效项将非常有用:
rnn = nn.LSTM(10, 20, 2)
input = torch.randn(5, 3, 10)
h0 = torch.randn(2, 3, 20)
c0 = torch.randn(2, 3, 20)
output, (hn, cn) = rnn(input, (h0, c0))
而且也适用于线性:
m = nn.Linear(20, 30)
input = torch.randn(128, 20)
output = m(input)