Python 我的LSTM代码给出了平面预测和don';I don’我不知道出了什么问题,有人能帮忙看看吗?

Python 我的LSTM代码给出了平面预测和don';I don’我不知道出了什么问题,有人能帮忙看看吗?,python,machine-learning,lstm,pytorch,rnn,Python,Machine Learning,Lstm,Pytorch,Rnn,这是代码。我想类mylstm有问题,但我找不到它。。。输入很简单,只有7列数据 我试着把所有的张量都打印出来,但没发现哪里不对。谢谢你的帮助 class mylstm(nn.Module): def __init__(self, input_size, hidden_size, T, logger): super(mylstm, self).__init__() self.T = T self.input_size = input_siz

这是代码。我想类
mylstm
有问题,但我找不到它。。。输入很简单,只有7列数据

我试着把所有的张量都打印出来,但没发现哪里不对。谢谢你的帮助

class mylstm(nn.Module):
    def __init__(self, input_size, hidden_size, T, logger):
        super(mylstm, self).__init__()

        self.T = T
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.logger = logger


        self.lstm_layer = nn.LSTM(input_size = 7, hidden_size = hidden_size)
        self.fc = nn.Linear(hidden_size, 1)
        #self.fc.weight.data.normal_()

    def forward(self, input_data):

        hidden = self.init_hidden(input_data)
        cell = self.init_hidden(input_data)
        for t in range(self.T - 1):
            if t < self.T - 1:
                self.lstm_layer.flatten_parameters()
                _, lstm_output = self.lstm_layer(input_data[:,t,:].unsqueeze(0), (hidden, cell))
                hidden = lstm_output[0] 
                cell = lstm_output[1] 
        y_pred = self.fc(hidden[0])
        return y_pred


    def init_hidden(self, x):
        return Variable(x.data.new(1, x.size(0), self.hidden_size).zero_())


# Train the model
class rnn:
    def __init__(self, file_data, logger, input_size = 7, hidden_size = 64, T = 10,
                 learning_rate = 0.01, batch_size = 128, parallel = True, debug = False):
        self.T = T
        dat = pd.read_csv(file_data, nrows = 100 if debug else None)
        self.logger = logger
        self.logger.info("Shape of data: %s.\nMissing in data: %s.", dat.shape, dat.isnull().sum().sum())

        self.X = dat.loc[:, [x for x in dat.columns.tolist()]].values
        self.y = np.array(dat.rtm_spp)
        self.batch_size = batch_size

        self.lstm1 = mylstm(input_size = input_size,
                               hidden_size = hidden_size,
                               T = T, logger = logger)

        if parallel:
            self.lstm1 = nn.DataParallel(self.lstm1)

        self.lstm1_optimizer = optim.Adam(params = filter(lambda p: p.requires_grad, self.lstm1.parameters()),
                                           lr = learning_rate)

        self.train_size = 20000
        self.y = self.y - np.mean(self.y[:self.train_size]) # Question: why Adam requires data to be normalized?
        self.logger.info("Training size: %d.", self.train_size)

    def train(self, n_epochs = 10):
        iter_per_epoch = int(np.ceil(self.train_size * 1. / self.batch_size))
        logger.info("Iterations per epoch: %3.3f ~ %d.", self.train_size * 1. / self.batch_size, iter_per_epoch)
        self.iter_losses = np.zeros(n_epochs * iter_per_epoch)
        self.epoch_losses = np.zeros(n_epochs)

        self.loss_func = nn.MSELoss()

        n_iter = 0

        learning_rate = 1.

        for i in range(n_epochs):
            perm_idx = np.random.permutation(self.train_size - self.T-1)
            j = 0
            while j < self.train_size:
                batch_idx = perm_idx[j:(j + self.batch_size)]
                X = np.zeros((len(batch_idx), self.T - 1, self.X.shape[1]))
                #y_history = np.zeros((len(batch_idx), self.T - 1))
                y_target = self.y[batch_idx + self.T]

                for k in range(len(batch_idx)):
                    X[k, :, :] = self.X[batch_idx[k] : (batch_idx[k] + self.T - 1), :]

                loss = self.train_iteration(X, y_target)
                self.iter_losses[i * iter_per_epoch + j // self.batch_size] = loss
                #if (j / self.batch_size) % 50 == 0:

                j += self.batch_size
                n_iter += 1

                if n_iter % 10000 == 0 and n_iter > 0:
                    for param_group in self.lstm1_optimizer.param_groups:
                        param_group['lr'] = param_group['lr'] * 0.9


            self.epoch_losses[i] = np.mean(self.iter_losses[range(i * iter_per_epoch, (i + 1) * iter_per_epoch)])
            if i % 10 == 0:
                self.logger.info("Epoch %d, loss: %3.3f.", i, self.epoch_losses[i])
                y_train_pred = self.predict(on_train = True)
                y_test_pred = self.predict(on_train = False)



    def train_iteration(self, X,y_target):
        self.lstm1_optimizer.zero_grad()
        y_pred = self.lstm1(Variable(torch.from_numpy(X).type(torch.FloatTensor)))
        y_true = Variable(torch.from_numpy(y_target).type(torch.FloatTensor))
        y_true = y_true.view(y_true.shape[0],1)
        y_pred=y_pred.squeeze(0)
        print(y_pred)
        loss = self.loss_func(y_pred, y_true)
        loss.backward()
        self.lstm1_optimizer.step()
        return loss.data[0]

    def predict(self, on_train = False):
        if on_train:
             y_pred = np.zeros(self.train_size - self.T +1)
        else:
             y_pred = np.zeros(self.X.shape[0] - self.train_size)

        i = 0
        while i < len(y_pred):
            batch_idx = np.array(range(len(y_pred)))[i : (i + self.batch_size)]
            X = np.zeros((len(batch_idx), self.T - 1, self.X.shape[1]))
            #y_history = np.zeros((len(batch_idx), self.T - 1))
            for j in range(len(batch_idx)):
                if on_train:
                    X[j, :, :] = self.X[range(batch_idx[j], batch_idx[j] + self.T - 1), :]

                else:
                    X[j, :, :] = self.X[range(batch_idx[j] + self.train_size - self.T, batch_idx[j] + self.train_size - 1), :]

            input_data = Variable(torch.from_numpy(X).type(torch.FloatTensor))
           # print(self.lstm1(torch.randn(128,9,7)))
            #print(self.lstm1(X).data.numpy())
            y_pred[i:(i + self.batch_size)] = self.lstm1(input_data).data.numpy()[:,0]
            i += self.batch_size
        return y_pred


model = rnn(file_data = 'L.csv', logger = logger, parallel = False,
              learning_rate = .001)

model.train(n_epochs = 1000)

y_pred = model.predict()
类mylstm(nn.Module): 定义初始化(自身、输入大小、隐藏大小、T、记录器): 超级(mylstm,self)。\uuuu init\uuuuu() self.T=T self.input\u size=输入大小 self.hidden\u size=隐藏的大小 self.logger=记录器 self.lstm\u layer=nn.lstm(输入大小=7,隐藏大小=隐藏大小) self.fc=nn.线性(隐藏大小,1) #self.fc.weight.data.normal() def转发(自身、输入_数据): hidden=self.init\u hidden(输入数据) cell=self.init\u hidden(输入数据) 对于范围内的t(self.t-1): 如果t0: 对于self.lstm1_optimizer.param_组中的param_组: 参数组['lr']=参数组['lr']*0.9 自洽期损耗[i]=np.平均值(自洽期损耗[范围(i*iter\u/历元,(i+1)*iter\u/历元)]) 如果i%10==0: self.logger.info(“历元%d,损失:%3.3f.”,i,self.Epoch\u损失[i]) y_train_pred=自我预测(on_train=真) y\u测试\u预测=自我预测(列车上=错误) def列_迭代(自我、X、y_目标): self.lstm1\u优化器.zero\u grad() y_pred=self.lstm1(变量(torch.from_numpy(X).type(torch.FloatTensor))) y_true=变量(torch.from_numpy(y_target).type(torch.FloatTensor)) y_true=y_true.view(y_true.shape[0],1) y_pred=y_pred.挤压(0) 打印(y_pred) 损失=自身损失函数(y_pred,y_true) loss.backward() self.lstm1_uOptimizer.step() 退货损失。数据[0] def预测(自身、列车上=错误): 如果在列车上: y_pred=np.0(self.train_size-self.T+1) 其他: y_pred=np.zero(自X.shape[0]-自列大小) i=0 而我