Deep learning 损失没有减少

Deep learning 损失没有减少,deep-learning,pytorch,Deep Learning,Pytorch,我用实现了一个DNN,但问题是,在所有迭代之后,损失都很高,并且没有减少。标签形状为火炬尺寸([1124823]),feat尺寸为火炬尺寸([1124823,13]),X列形火炬尺寸([719886,13]),X测试形火炬尺寸([224965,13]),X val形火炬尺寸([179972,13]),y列形火炬尺寸([719886]),y列形火炬尺寸([719886]),y val形火炬尺寸([179972]) 我的数据加载器实现如下: X\u系列,X\u测试,y\u系列,y\u测试=系列测试分

我用实现了一个DNN,但问题是,在所有迭代之后,损失都很高,并且没有减少。标签形状为火炬尺寸([1124823]),feat尺寸为火炬尺寸([1124823,13]),X列形火炬尺寸([719886,13]),X测试形火炬尺寸([224965,13]),X val形火炬尺寸([179972,13]),y列形火炬尺寸([719886]),y列形火炬尺寸([719886]),y val形火炬尺寸([179972])

我的数据加载器实现如下:


X\u系列,X\u测试,y\u系列,y\u测试=系列测试分割(专长,标签,测试大小=0.2,随机状态=1)
X_列,X_列,y_列,y_列=列测试_分割(X_列,y_列,测试_大小=0.2,随机_状态=1)
列车=数据实用张力数据集(X列车,y列车)
火车装载机=数据装载机。数据装载机(火车,批量大小=1000,随机播放=True)
测试=数据实用性张力数据集(X测试,y测试)
test\u loader=data\u utils.DataLoader(测试,批量大小=1000,随机播放=False)
输入大小=13
隐藏1_大小=13
hidden2_大小=64
hidden3_大小=128
hidden4_大小=256
hidden5_大小=1024
输出大小=3989
DNN类(nn.模块):
定义初始大小(自身、输入大小、隐藏1大小、隐藏2大小、隐藏3大小、隐藏4大小、隐藏5大小、输出大小):
超级(DNN,self)。\uuuuu init\uuuuuu()
self.fc1=nn.Linear(输入大小、隐藏大小)
self.drp1=nn.drop(p=0.2,原地=假)
self.relu1=nn.ReLU()
self.tan1=nn.Tanh()
self.fc2=nn.线性(hidden1\u大小,hidden2\u大小)
self.drp2=nn.drop(p=0.2,原地=假)
self.relu2=nn.ReLU()
self.tan2=nn.Tanh()
self.fc3=nn.线性(hidden2\u大小,hidden3\u大小)
self.drp3=nn.辍学(p=0.2,原地=假)
self.relu3=nn.ReLU()
self.tan3=nn.Tanh()
self.fc4=nn.Linear(hidden3\u大小,hidden4\u大小)
self.drp4=nn.辍学(p=0.2,原地=假)
self.relu4=nn.ReLU()
self.tan4=nn.Tanh()
self.fc5=nn.线性(hidden4\u大小,hidden5\u大小)
self.drp5=nn.辍学(p=0.2,原地=假)
self.relu5=nn.ReLU()
self.tan5=nn.Tanh()
self.fc6=nn.Linear(隐藏大小、输出大小)
self.tan6=nn.Tanh()
def前进(自身,x):
out=自身.fc1(x)
out=自身drp1(out)
out=自恢复1(out)
out=self.tan1(out)
out=自我。fc2(out)
out=self.drp2(out)
out=self.relu2(out)
out=self.tan2(out)
out=自我fc3(out)
out=自身drp3(out)
out=自恢复3(out)
out=self.tan3(out)
out=自我。fc4(out)
out=self.drp4(out)
out=自恢复4(out)
out=self.tan4(out)
out=自我。fc5(out)
out=self.drp5(out)
out=自恢复5(out)
out=self.tan5(out)
out=自身fc6(out)
out=self.tan6(out)
返回
批量大小=10
n_迭代次数=50
无eps=n次迭代/(13次/批次大小)
无epochs=int(无eps)
模型=DNN(输入大小、隐藏1大小、隐藏2大小、隐藏3大小、隐藏4大小、隐藏5大小、输出大小)
标准=nn.CrossEntropyLoss()
学习率=0.0001
optimizer=torch.optim.SGD(model.parameters(),lr=learning\u rate)
iter=0
对于范围内的历元(无历元):
对于枚举(列装载机)中的i,(X列,y列):
optimizer.zero_grad()
输出=模型(变量(X_列))
损耗=标准(输出、变量(y_列))
打印('Iter%d-->丢失%f'(i,丢失.item())
loss.backward()
optimizer.step()
正确=0
总数=0
打印(‘测试’)
对于测试加载程序中的X_测试、y_测试:
输出=模型(变量(X_测试))
pred=outputs.argmax(dim=1,keepdim=True)
总+=y_测试尺寸(0)
正确+=(预挤压()==y#u测试).sum()#预测试等式(y#u测试.视图#u为(pred)).sum().item()
精度=100*正确/总计
打印('迭代:{}。精度:{}'。格式(历元,精度))

你的损失是一个
nn.CrossEntropy()
。此条件必须获得logits作为输入,您将给出
nn.Tanh()

我不知道您是如何加载数据的(您没有显示),但它表明您使用的是
数据加载程序。因此,您不需要使用
变量
。您可以发送张量,如:
模型(X\u序列)
标准(输出,y\u序列)
。由于您有一个
batch\u size
变量,这表明您正在使用batch\u size,对吗?因此,这一行:

print('Iter %d --> loss %f' % (i, loss.item()))
只计算一批的损失。更现实的做法是按时代计算。您需要累积损失,然后打印平均值,例如:

acc\u损耗=0
对于x,y,在数据加载器中:
acc_损失+=损失项目()
打印(“丢失:”,附件丢失/镜头(数据加载器))

X\u-train,X\u-test,y\u-train,y\u-test=train\u-test\u-split(专长,标签,测试大小=0.2,随机状态=1)X\u-train,X\u-val,y\u-train,y\u-val=train\u-test\u-split(X\u-train,y\u-train,test\u-size=0.2,随机状态=1)为我的功能和标签train=data\u-utils创建一个数据加载货器(train,batch\u size=500,shuffle=True)test=data\u utils.TensorDataset(专长,标签)test\u loader=data\u utils.DataLoader(test,batch\u size=500,shuffle=False)对不起,我什么都听不懂!对不起,你能看到我下面的答案吗?代码格式很好,你能看看我的数据加载器吗?我又把它放在问题里了