栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

深度学习入门笔记-----杨立AI

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深度学习入门笔记-----杨立AI

老师视频课
一、Python开发环境安装
1、安装anaconda,官网打开比较慢,可以搜索 清华大学开源软件镜像站 如下图所示:

2、安装社区版pycharm
3、cmd中创建虚拟环境 (ctrl+C结束正在运行的程序)
二、第一个深度学习实例:手写字符识别
代码:https://github.com/mivlab/AI_course
创建虚拟环境:
conda env list(查看有什么环境)
conda create -n AI python=3.8.5(创建环境AI,Python版本为3.8.5)
conda activate AI(激活环境)
deactivate(退出虚拟环境)
pip3 install torch torchvision torchaudio(下载Pytorch)
pip install opencv-python(下载Opencv)
运行后显示:

因为需要输入一个命令行参数,如下图点击Edit Configuration

然后把训练数据集的绝对路径(–datapath=E:WeiYingYingAI_course-masterAI_course-masterclassify_pytorchimages)填到参数一栏:

然后点右键运行即可训练,训练完成后运行tes_mnist.py
三、一些操作方法
1、调试代码
打上断点 然后运行debug可以看到类型和一些信息
当某个函数用法和含义不熟悉时可以搜索引擎搜索pytorch官网,在PyTorch的主页上点docs打开官方文档,搜索max,如下图即可看到函数的用法和例子:

2、查找引用的自定义函数所在位置及内容(选中函数->右键->Go To->Type Declaration)

3、性别识别案例 train_sex.py

import torch
import math
import torch.nn as nn
from torch.autograd import Variable
from torchvision import transforms, models
import argparse
import os
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
from dataloader import mnist_loader as ml
from models.cnn import Net
from toonnx import to_onnx

 
class SexDataset(Dataset):
    def __init__(self, txt, transform=None, target_transform=None):
        fh = open(txt, 'r')
        imgs = []
        for line in fh:
            line = line.strip('n')#通过strip把一些换行符和空格去掉
            line = line.rstrip()
            words = line.split()
            data.append((float(words[0]) ,flost(words[1]), int(words[2])))
        self.data = data
    def __getitem__(self, index):
        return torch.FloatTensor([self.data[index][0], self.data[index][1]]),self.data[index][2]#由于报错输出多个,期待是两个,所以把前面两个同类型的合为一个list;   
        #接着报错  Variable datd has to be a tensor , but got list.解决方法:将list转换成tensor,用函数  torch.FloatTensor([1,2],[4,5])
    #获取样本个数
    def __len__(self):
        return len(self.data)


class SexNet(nn.Module):
    def __init__(self):
        super(SexNet, self).__init__()
        self.dense = nn.Sequential(
             nn.Linear(2,2)
        )
    def forward(self, x):
        out = self.dense(res)
        return out


def train():
    train_data = SexDatasett(txt='output/train.txt')
    val_data = SexDataset(txt='output/val.txt')
    batchsize = 10
    train_loader = DataLoader(dataset=train_data, batch_size=batchsize, shuffle=True)#batch_size定义了一次加载多少个数据集
    val_loader = DataLoader(dataset=val_data, batch_size=batchsize)
    model = SexNet()
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=1e-3)#优化器采用Adam,初始学习率为0.01,权重衰减系数是1e-3
    scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, [10, 20], 0.1)#规定到第10个epoch时把lr乘以0.1,到第20个epoch时再乘以0.1,所以有三个learning rate :0.1  0.01  0.001
    loss_func = nn.CrossEntropyLoss()
#开始训练
    epochs = 10
    for epoch in range(epochs):
        # training-----------------------------------
        model.train()
        train_loss = 0
        train_acc = 0
        for batch, (batch_x, batch_y) in enumerate(train_loader):
            batch_x, batch_y = Variable(batch_x), Variable(batch_y)
            out = model(batch_x)  # 在这里设置断点,debug到这里,查看batch_x为一个tensor:256x3x28x28(表示一个批次有256张图;图为rgb3通道;图像宽高为28*28)
            # 通过model模型得到输出out 256x10(表示一个批次256个样本,10表示这个样本属于10个类别的概率值【注:要经过softmax才变成概率值,这一步在CrossEntropyLoss里面做的】)
            loss = loss_func(out, batch_y)
            train_loss += loss.item()
            #用torch.max()函数取最大的那一类的标签  初始时十个概率全为7,然后会与数据的标签做比较,算出一个批次训练的准确率是多少
            pred = torch.max(out, 1)[1]    #  (out,1)表示算出每一行的最大值,输出的结果为两个值,第一个是最大值,第二个是最大值的索引,感兴趣的是索引而不是最大值,所以方括号中是1而不是0
            train_correct = (pred == batch_y).sum()#256个样本中训练正确了26个
            train_acc += traintorch.max_correct.item()
            print('epoch: %2d/%d batch %3d/%d  Train Loss: %.3f, Acc: %.3f'
                  % (epoch + 1, epochs, batch, math.ceil(len(train_data) / batch_size),
                     loss.item(), train_correct.item() / len(batch_x)))

            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
        scheduler.step()  # 更新learning rate
        print('Train Loss: %.6f, Acc: %.3f' % (train_loss / (math.ceil(len(train_data)/batch_size)),
                                               train_acc / (len(train_data))))

        # 评估evaluation--------------------------------
        model.eval()
        eval_loss = 0
        eval_acc = 0
        for batch_x, batch_y in val_loader:
            if args.cuda:
                batch_x, batch_y = Variable(batch_x.cuda()), Variable(batch_y.cuda())
            else:
                batch_x, batch_y = Variable(batch_x), Variable(batch_y)

            out = model(batch_x)
            loss = loss_func(out, batch_y)
            eval_loss += loss.item()
            pred = torch.max(out, 1)[1]
            num_correct = (pred == batch_y).sum()
            eval_acc += num_correct.item()
        print('Val Loss: %.6f, Acc: %.3f' % (eval_loss / (math.ceil(len(val_data)/args.batch_size)),
                                             eval_acc / (len(val_data))))
        # 保存模型save model -------------------------------- (可以每一个epoch都保存模型也可以隔几个epoch保存模型,这取决于%后面的值,为1则每个都保存)
        if (epoch + 1) % 1 == 0:
            # torch.save(model, 'output/model_' + str(epoch+1) + '.pth')
            torch.save(model.state_dict(), 'output/params_' + str(epoch + 1) + '.pth')
            #to_onnx(model, 3, 28, 28, 'params.onnx')

if __name__ == '__main__':
    train()

四、语义分割
源码网址:https://github.com/Tramac/awesome-semantic-segmentation-pytorch
支持的语义分割模型包含:

五、如何读懂PyTorch深度学习代码-以基于人体姿态估计的仰卧起坐计数为例
源码地址:https://github.com/DL-Practise/OpenSitup
*如何送数据 class MyDataset(Dataset):
*网络结构 class Net(nn.Module):
*训练流程 for epoch in range(30):
for i,(batch_x,batch_y) in enumerate(train_loader):
略·
六、在github发现了一个步骤特别详细的面部关键点识别demo
:https://github.com/udacity/P1_Facial_Keypoints

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934382.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号