Pytorch 零损耗Pyrotch resnet

Pytorch 零损耗Pyrotch resnet,pytorch,resnet,Pytorch,Resnet,我正在训练一个用于图像分割的Pytorch Resnet模型。我有两门课,我正在学习RGB图像和相应的二进制掩模。虽然我的准确度值非常高(~0.99),但我的训练和验证损失值在所有时期都为零。如何解决此问题 #我们首先进行空间变换,然后进行任何颜色增强 img_transform=transforms.Compose([ transforms.ToPILImage(), transforms.RandomVerticalFlip(), transforms.RandomHorizontalFli

我正在训练一个用于图像分割的Pytorch Resnet模型。我有两门课,我正在学习RGB图像和相应的二进制掩模。虽然我的准确度值非常高(~0.99),但我的训练和验证损失值在所有时期都为零。如何解决此问题

#我们首先进行空间变换,然后进行任何颜色增强
img_transform=transforms.Compose([
transforms.ToPILImage(),
transforms.RandomVerticalFlip(),
transforms.RandomHorizontalFlip(),
变换。随机裁剪(大小=(面片大小,面片大小),如果需要,则填充=真),#这些需要以可复制的顺序,首先是仿射变换,然后是颜色
transforms.RandomResizedCrop(大小=面片大小),
随机旋转(180),
颜色抖动(亮度=0,对比度=0,饱和度=0,色调=0.5),
transforms.RandomGrayscale(),
transforms.ToTensor()
])
mask_transform=transforms.Compose([
transforms.ToPILImage(),
transforms.RandomVerticalFlip(),
transforms.RandomHorizontalFlip(),
变换。随机裁剪(大小=(面片大小,面片大小),如果需要,则填充=真),#这些需要以可复制的顺序,首先是仿射变换,然后是颜色
transforms.RandomResizedCrop(大小=面片大小,插值=PIL.Image.NEAREST),
随机旋转(180),
])
数据集={}
数据加载器={}
对于阶段中的阶段:#现在对于每个阶段,我们将创建数据加载器
#有趣的是,考虑到批量大小,我没有看到使用num_workers>0的任何改进
数据集[阶段]=数据集(f”/content/{dataname}{phase}.pytable),img_变换=img_变换,掩码_变换=掩码_变换,边_权重=边_权重)
数据加载器[阶段]=数据加载器(数据集[阶段],批次大小=批次大小,
shuffle=True,num\u workers=0,pin\u memory=True)
optim=torch.optim.Adam(model.parameters())
nclasses=dataset[“train”].numpixels.shape[1]
class_weight=dataset[“train”]。numpixels[1,0:2]#此处不考虑被忽略的类
class\u weight=torch.from\u numpy(1-class\u weight/class\u weight.sum()).type('torch.FloatTensor')。到(设备)
打印(分级重量)#显示最终使用的重量,在继续之前确保其合理
criteria=nn.CrossEntropyLoss(权重=类权重,忽略索引=忽略索引,减少=假)#减少=假确保我们得到的是2D输出,而不是1D“摘要”值
对于范围内的历元(num_历元):
#零出基于历元的性能变量
打印('Epoch{}/{}'。格式(Epoch,num_epochs-1))
打印('-'*10)
all_acc={key:0表示相位中的键}
all_损耗={key:torch.zeros(0).to(设备)for key in phases}
cmatrix={key:np.相位键的零((2,2))}
对于阶段内阶段:#迭代培训和验证状态
如果相位==‘列车’:
model.train()#将model设置为训练模式
否则:#在评估模式下,我们不希望更新参数
model.eval()#将model设置为评估模式
运行损耗=0.0
运行_校正=0
对于ii,枚举(数据加载器[阶段])中的(X,y,y_权重):对于每个批次
优化零度梯度()
X=X.to(设备)#[批次,3,H,W]
y_-weight=y_-weight.type('torch.FloatTensor')。到(设备)
y=y.type('torch.LongTensor')。至(装置)#[Nbatch,H,W],具有等级索引(0,1)
启用torch.set_grad_(相位=‘训练’):#动态设置梯度计算,在验证的情况下,不需要这样做
#禁用是一种很好的做法,可以缩短推理时间
预测=model_ft(X)#[N,Nclass]
y=y[:,0,0]
损失=标准(预测,y)
打印(丢失)
_,preds=火炬最大值(X,1)
preds=preds[:,0,0]
如果阶段==“训练”:#如果我们处于训练模式,需要进行反向传播
loss.mean()向后()
optim.step()
正在运行的_loss+=loss.data[0]
运行_校正+=torch.sum(preds==y)
epoch\u loss=running\u loss/len(数据加载器[阶段].dataset)
epoch\u acc=running\u corrects.double()/len(数据加载器[phase].dataset)
打印({}丢失:{.4f}附件:{.4f})。格式(相位、历元丢失、历元附件))
#深度复制模型
如果相位=='val'和历元\u acc>最佳\u acc:
最佳会计科目=新纪元会计科目
best_model_wts=copy.deepcopy(model.state_dict())
如果相位='val':
val_acc_history.append(历元_acc)
打印()