fatcrab910 2020-03-31 21:18 采纳率: 0%
浏览 297
已结题

Pytorch CiFar10 , Lenet5 ,损失函数不收敛

问题 同标题

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

import torchvision
import torchvision.transforms as transforms
import torchvision.datasets as datasets

import time

transform = transforms.Compose([transforms.ToTensor(),#把数据转换成tensor
transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5)) #数据归一化 ,第一组参数是所有channel的平均值,第2组参数是方差
# 为什么需要平均值的原因是 ,所有图片都有的 ,数据不需要学习,因为平均值都在每张图片里了是干扰项目
])

train_data = datasets.CIFAR10('./data',train=True,transform=transform,download=True)

train_loader = torch.utils.data.DataLoader(dataset=train_data,batch_size=4,shuffle=True,num_workers=2)

test_data = datasets.CIFAR10('./test',train=False,transform=transform,download=True)

test_loader = torch.utils.data.DataLoader(dataset=test_data,batch_size=4,shuffle=True,num_workers=2)

import matplotlib.pyplot as plt
import numpy as np

def imgsshow(img): ##? 这里有个包升级的问题 ,导致目前没有解决
img = img/2 + 0.5 #由于在归一化 transform里有去掉平均的处理 在这里需要变回来
img = img.numpy() # numpay array
img = np.transpose(img,(1,2,0)) # (c,h,w) -> (h,w,c) 符合正常显示的数据的方式
plt.show(img)
data_iter = iter(train_loader) #随机加载一个min batch
images , labels = data_iter.next() # 把图片 和 label 分开

class Net(nn.Module):
def init(self):
super(Net,self).__init__()
# LeCun
# N = (input_size - kernel_size + 2 padding)/stripe +1
self.conv1 = nn.Sequential(nn.Conv2d(3,6,5,1), # out = (32 -5 + 2*0)/1+1 =28
nn.ReLU(),
nn.MaxPool2d(kernel_size=2,stride=2)) # out = 14
self.conv2 = nn.Sequential(
nn.Conv2d(6,16,5), # out = (14 -5 +0)1 +1 =10
nn.ReLU(),
nn.MaxPool2d(kernel_size=2,stride =2) # out = 10/2 = 5
)

    self.fc1 = nn.Sequential(
        nn.Linear(16*5*5,120),
        nn.ReLU()
    )
    self.fc2 = nn.Sequential(
        nn.Linear(120,84),
        nn.ReLU()
    )
    self.fc3 = nn.Linear(84,10)
def forward(self, x):
    x = self.conv1(x)
    x = self.conv2(x)

    x = x.view(-1, 16*5*5)
    print ("%%"*50)
    print ('dimision  change',x.shape)
    x = self.fc1(x)
    x = self.fc2(x)
    x = self.fc3(x)
    return x

net = Net()
print("current net is ",net)

criterion = nn.CrossEntropyLoss()
tunner = optim.SGD(net.parameters(),lr=0.0001,momentum=0.9)
traning_loss_history = []
test_loss_history = []
for epoch in range(1000):
net.train()
running_loss = 0.0
print ("training.... epoch{0}".format(epoch))
start_epoc = time.time()
for i ,data in enumerate(train_loader,0): #一次仅仅提取一个minbatch ,一致到所有的数据取完
batch_time = time.time()
imges, labels = data
# imges, labels = Variable(images),Variable(labels)
tunner.zero_grad()
outs = net(images)
loss = criterion(outs, labels)
# tunner.zero_grad()
loss.backward()
tunner.step()
if i % 1000 == 0:
print ("i {0} : loss {1} : duration {2}".format(i, loss.item(), (time.time()-batch_time)))
running_loss += loss.item()
if i%250 == 0 :
net.eval()
with torch.no_grad():
for data in test_loader:
test_images ,test_label = data
test_outs = net(test_images)
test_loss = criterion(test_outs,test_label)
traning_loss_history .append(running_loss/250)
test_loss_history.append(test_loss.item())
running_loss = 0.0

print("epoch {0} :: loss {1} :: duration {2}".format(epoch,loss.item(),time.time()-start_epoc))
# 为什么损失函数会有regression呢 ? 原因 1 ,minbatch的偶然性导致 ,比如这几次都是飞机 2, learning rrate {}

plt.figure()
plt.plot(traning_loss_history)
plt.plot(test_loss_history)
plt.legend('training loss','test loss')
plt.tile("Traing /Test loss")
plt.xlabel('#mini_batch *250')
plt.ylabel('Loss')

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-03-31 22:00
    关注

    换个损失函数或者激活函数看看,另外看下你的y列(标签)是否有问题

    评论

报告相同问题?

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试