无法在pytorch中训练大数据

时间:2018-04-12 06:01:16

标签: python-3.x neural-network deep-learning torch pytorch

我尝试在pytorch中构建两个完全连接的图层,以将[x1,x2,...,xn]等功能嵌入到多个目标[y1,y2,y3,y4,y5]中。我在下面发布我的代码:

class FullConnect(nn.Module):
    def __init__(self):
        super(FullConnect, self).__init__()        
        self.fc = nn.Sequential(
            nn.Linear(195, 100),
            nn.Linear(100, 5)
        )
    def forward(self, x):
        out = self.fc(x)
        return out


class LossFunc(nn.Module):
    def __init__(self):
        super(LossFunc, self).__init__() 
    def forward(self,x,y):
        loss=torch.div(torch.sum(torch.pow(torch.log(torch.div(x+1,y+1)),2)),5)
        return loss

small_data=np.random.randn(100, 200)
small_data[small_data<0]=0
model = FullConnect()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.3)
criterion = LossFunc()
for epoch in range(5):
    acc=0
    for i in range(small_data.shape[0]):
        x = Variable(torch.FloatTensor(small_data[i][5:]))
        y = Variable(torch.FloatTensor(small_data[i][:5]))
        output=model(x)
        loss=criterion(output,y)
        optimizer.zero_grad()
        loss.backward()  
        optimizer.step()
        acc+=loss
    print("epoch:",epoch)
    print("Loss:",acc)

当我将小型训练集输入其中时,此代码正常工作,返回:

epoch: 0
Loss: Variable containing:
 15.7719
[torch.FloatTensor of size 1]

epoch: 1
Loss: Variable containing:
 12.0258
[torch.FloatTensor of size 1]

epoch: 2
Loss: Variable containing:
 9.9758
[torch.FloatTensor of size 1]

epoch: 3
Loss: Variable containing:
 8.5442
[torch.FloatTensor of size 1]

epoch: 4
Loss: Variable containing:
 7.4562
[torch.FloatTensor of size 1]

但当我用大型训练集替换small_data时:

large_data=np.random.randn(60000, 200)
large_data[large_data<0]=0

Jupyter笔记本给我一个错误The kernel appears to have died. It will restart automatically.我想这个错误与输入的大小有关。

我的cuda9.1可用,但是在火炬中不能接受cudnn。 现在,我正在寻找改进代码的方法,并使此培训程序正常运行。我感谢任何建议可能会帮助我。

1 个答案:

答案 0 :(得分:0)

问题可能是您没有将输入数据定义为volatile(请参阅this文档)。我建议您通过以下方式更改您定义xy的行:

x = Variable(torch.FloatTensor(small_data[i][5:]), volatile=True)
y = Variable(torch.FloatTensor(small_data[i][:5]), volatile=True)

这将使正向计算更具内存效率。

改进代码的一种方法可能是使用stochastic gradient descent,而不是一次提供一个示例,或者用简单的话说,将数据集划分为批次并将其提供给而不是模型。

在对每个批次进行推理(前馈)后,您应该在损失变量上调用backward(),在优化程序上调用step()

看看this示例,他们使用pytorch内置DataLoader类为您进行批处理。

你可以看到我在训练循环中描述的内容:

for batch_idx, (data, target) in enumerate(train_loader):
    if args.cuda:
        data, target = data.cuda(), target.cuda()
    data, target = Variable(data), Variable(target)
    optimizer.zero_grad()
    output = model(data)
    loss = F.nll_loss(output, target)
    loss.backward()
    optimizer.step()