2019-04-03/04 Pytorch:mnist训练预训练模型

参考链接:1.pytorch下搭建网络训练并保存模型 - sjtuxx_lee的博客 - CSDN博客

                  2.详解 MNIST 数据集 - 闲汉 - 博客园

                  3.image — Matplotlib 3.0.3 documentation

                  4.torchvision库简介 - DrHW - 博客园

                  5.pytorch方法测试——损失函数(CrossEntropyLoss) - tmk_01的博客 - CSDN博客


加载并保存图像信息

首先下载mnist的数据集:官网的那个可能被墙了,贴上网盘链接,提取码: r2k7


按照规定建立好文件夹以及子文件夹。

修改相应代码(两部分):

1.更改root_path,我的是root_path = 'E:/data_JH/pytorch/mnist/'

   增加mnist.npz的地址,为了以后的本地导入,

   path = 'E:/data_JH/pytorch/mnist/mnist.npz'


2.更改成本地导入,改动点如下

def LoadData(root_path, base_path, training_path, test_path):

    ##############本地下载版本##############

    f = np.load(path)

    x_train, y_train = f['x_train'], f['y_train']

    x_test, y_test = f['x_test'], f['y_test']

    f.close()

    #######################################

    #(x_train, y_train), (x_test, y_test) = mnist.load_data() 在线下载版本



遇到的问题以及解决方案:

1.matplotlib没有image这个模块(module ‘matplotlib’ has no attribute 'image' )

查找了matplotlib官方文件库[3],发现是有matplotlib.image.imsave这个命令的,但是他的版本是Version3.0.3,我的版本是Version2.0.2。推测是安装这个包没安全面,打开Anaconda Navigator,搜索matplotlib,把相关的包都点击Apply。


定义自己的DATASET

pytorch训练数据时需要数据集为Dataset类,便于迭代等等,这里将加载保存之后的数据封装成Dataset类,分别为:

1.继承该类需要写初始化方法(__init__)

2.获取指定下标数据的方法(__getitem__)

3.获取数据个数的方法(__len__)。

尤其需要注意的是要把label转为LongTensor类型的。


用mnist训练网络

前期准备工作:

1.把DataProcessingMnist类和BuildAlexNet类文件分别命名成DataProcessing和BuildModel,否则导入的时候会出现问题。

2.root_path,model_path改成你文件的位置

3.把代码中的.data[0]改成item()


训练中。。。

训练完成


下面是修改后的训练代码以及我的理解,原版在参考链接1里面。


import torch

import os

from torchvision import transforms            #图像变换包,具体见[4]

import torch.optim as optim                       #优化算法包

from torch.autograd import Variable

from torch.utils.data import DataLoader

import DataProcessing as DP

import BuildModel as BM

import torch.nn as nn

if __name__ == '__main__':

    os.environ['CUDA_VISIBLE_DEVICES'] = '0,1' #设置系统环境变量

    root_path = 'E:/data_JH/pytorch/mnist/'       

    training_path = 'trainingset/'

    test_path = 'testset/'

    model_path = 'E:/data_JH/pytorch/mnist/model/'


    training_imgfile = training_path + 'trainingset_img.txt'

    training_labelfile = training_path + 'trainingset_label.txt'

    training_imgdata = training_path + 'img/'


    test_imgfile = test_path + 'testset_img.txt'

    test_labelfile = test_path + 'testset_label.txt'

    test_imgdata = test_path + 'img/'


    #parameter

    batch_size = 128

    epochs = 20

    model_type = 'pre'

    nclasses = 10                                                         #最终分类数目

    lr = 0.01                                                                  #梯度下降率

    use_gpu = torch.cuda.is_available()


    transformations = transforms.Compose(                #定义组合变换

            [transforms.Scale(256),                                   

            transforms.CenterCrop(224),

            transforms.ToTensor(),

            transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])

                    ])


    dataset_train = DP.DataProcessingMnist(root_path, training_imgfile, training_labelfile, training_imgdata, transformations)

    dataset_test = DP.DataProcessingMnist(root_path, test_imgfile, test_labelfile, test_imgdata, transformations)


    num_train, num_test = len(dataset_train), len(dataset_test)


    train_loader = DataLoader(dataset_train, batch_size = batch_size, shuffle = True, num_workers = 0)

    test_loader = DataLoader(dataset_test, batch_size = batch_size, shuffle = False, num_workers = 0)


    # build model

    model = BM.BuildAlexNet(model_type, nclasses)

    optimizer = optim.SGD(model.parameters(), lr = lr)

    criterion = nn.CrossEntropyLoss()                    #损失函数,详见[5]


    for epoch in range(epochs):

        epoch_loss = 0

        correct_num = 0

        for i, traindata in enumerate(train_loader):

            x_train, y_train = traindata

            if use_gpu:

                x_train, y_train = Variable(x_train.cuda()),Variable(y_train.cuda())

                model = model.cuda()

            else:

                x_train, y_train = Variable(x_train),Variable(y_train)

            y_pre = model(x_train)

            _, label_pre = torch.max(y_pre.data, 1)

            if use_gpu:

                y_pre = y_pre.cuda()

                label_pre = label_pre.cuda()

            model.zero_grad()

            loss = criterion(y_pre, y_train)

            loss.backward()

            optimizer.step()

            epoch_loss += loss.item()

            correct_num += torch.sum(label_pre == y_train.data)       

            acc = (torch.sum(label_pre == y_train.data).float()/len(y_train)) 

            print('batch loss: {} batch acc: {}'.format(loss.item(),acc.item()))

        print('epoch: {} training loss: {}, training acc: {}'.format(epoch, epoch_loss, correct_num.float()/num_train))

        if (epoch+1) % 5 ==0:

            test_loss = 0

            test_acc_num = 0

            for j, testdata in enumerate(test_loader):

                x_test, y_test = testdata

                if use_gpu:

                    x_test, y_test = Variable(x_test.cuda()), Variable(y_test.cuda())

                else:

                    x_test, y_test = Variable(x_test), Variable(y_test)

                y_pre = model(x_test)

                _, label_pre = torch.max(y_pre.data, 1)

                loss = criterion(y_pre, y_test)

                test_loss += loss.item()

                test_acc_num += torch.sum(label_pre == y_test.data)

            print('epoch: {} test loss: {} test acc: {}'.format(epoch, test_loss, test_acc_num.float()/num_test))

    torch.save(model.state_dict(), model_path + 'AlexNet_params.pkl')


PS:哼,我学会在简书里面用那种代码的排版了。下一篇就用!(简书怎么添加并且显示代码_百度经验

待解决:训练原理还搞得不是太清楚。链接5记得有时间搞透彻



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268