我尝试在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。 现在,我正在寻找改进代码的方法,并使此培训程序正常运行。我感谢任何建议可能会帮助我。
答案 0 :(得分:0)
问题可能是您没有将输入数据定义为volatile
(请参阅this文档)。我建议您通过以下方式更改您定义x
和y
的行:
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()