《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(中)

简介: 《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用(中)

启动训练:代码如下


  1. # -*- coding: utf-8 -*-  
  2. # LeNet 识别眼疾图片  
  3. import os  
  4. import random  
  5. import paddle  
  6. import numpy as np  
  7.  
  8. DATADIR = '/home/aistudio/work/palm/PALM-Training400/PALM-Training400'  
  9. DATADIR2 = '/home/aistudio/work/palm/PALM-Validation400'  
  10. CSVFILE = '/home/aistudio/labels.csv'  
  11.  
  12. # 定义训练过程  
  13. def train_pm(model, optimizer):  
  14.    # 开启0号GPU训练  
  15.    use_gpu = True  
  16.    paddle.set_device('gpu:0') if use_gpu else paddle.set_device('cpu')  
  17.  
  18.    print('start training ... ')  
  19.    model.train()  
  20.    epoch_num = 5  
  21.    # 定义数据读取器,训练数据读取器和验证数据读取器  
  22.    train_loader = data_loader(DATADIR, batch_size=10, mode='train')  
  23.    valid_loader = valid_data_loader(DATADIR2, CSVFILE)  
  24.    for epoch in range(epoch_num):  
  25.        for batch_id, data in enumerate(train_loader()):  
  26.            x_data, y_data = data  
  27.            img = paddle.to_tensor(x_data)  
  28.            label = paddle.to_tensor(y_data)  
  29.            # 运行模型前向计算,得到预测值  
  30.            logits = model(img)  
  31.            loss = F.binary_cross_entropy_with_logits(logits, label)  
  32.            avg_loss = paddle.mean(loss)  
  33.  
  34.            if batch_id % 10 == 0:  
  35.                print("epoch: {}, batch_id: {}, loss is: {}".format(epoch, batch_id, avg_loss.numpy()))  
  36.            # 反向传播,更新权重,清除梯度  
  37.            avg_loss.backward()  
  38.            optimizer.step()  
  39.            optimizer.clear_grad()  
  40.  
  41.        model.eval()  
  42.        accuracies = []  
  43.        losses = []  
  44.        for batch_id, data in enumerate(valid_loader()):  
  45.            x_data, y_data = data  
  46.            img = paddle.to_tensor(x_data)  
  47.            label = paddle.to_tensor(y_data)  
  48.            # 运行模型前向计算,得到预测值  
  49.            logits = model(img)  
  50.            # 二分类,sigmoid计算后的结果以0.5为阈值分两个类别  
  51.            # 计算sigmoid后的预测概率,进行loss计算  
  52.            pred = F.sigmoid(logits)  
  53.            loss = F.binary_cross_entropy_with_logits(logits, label)  
  54.            # 计算预测概率小于0.5的类别  
  55.            pred2 = pred * (-1.0) + 1.0  
  56.            # 得到两个类别的预测概率,并沿第一个维度级联  
  57.            pred = paddle.concat([pred2, pred], axis=1)  
  58.            acc = paddle.metric.accuracy(pred, paddle.cast(label, dtype='int64'))  
  59.  
  60.            accuracies.append(acc.numpy())  
  61.            losses.append(loss.numpy())  
  62.        print("[validation] accuracy/loss: {}/{}".format(np.mean(accuracies), np.mean(losses)))  
  63.        model.train()  
  64.  
  65.        paddle.save(model.state_dict(), 'palm.pdparams')  
  66.        paddle.save(optimizer.state_dict(), 'palm.pdopt')  
  67.  
  68.  
  69. # 定义评估过程  
  70. def evaluation(model, params_file_path):  
  71.  
  72.    # 开启0号GPU预估  
  73.    use_gpu = True  
  74.    paddle.set_device('gpu:0') if use_gpu else paddle.set_device('cpu')  
  75.  
  76.    print('start evaluation .......')  
  77.  
  78.    #加载模型参数  
  79.    model_state_dict = paddle.load(params_file_path)  
  80.    model.load_dict(model_state_dict)  
  81.  
  82.    model.eval()  
  83.    eval_loader = data_loader(DATADIR,  
  84.                        batch_size=10, mode='eval')  
  85.  
  86.    acc_set = []  
  87.    avg_loss_set = []  
  88.    for batch_id, data in enumerate(eval_loader()):  
  89.        x_data, y_data = data  
  90.        img = paddle.to_tensor(x_data)  
  91.        label = paddle.to_tensor(y_data)  
  92.        y_data = y_data.astype(np.int64)  
  93.        label_64 = paddle.to_tensor(y_data)  
  94.        # 计算预测和精度  
  95.        prediction, acc = model(img, label_64)  
  96.        # 计算损失函数值  
  97.        loss = F.binary_cross_entropy_with_logits(prediction, label)  
  98.        avg_loss = paddle.mean(loss)  
  99.        acc_set.append(float(acc.numpy()))  
  100.        avg_loss_set.append(float(avg_loss.numpy()))  
  101.    # 求平均精度  
  102.    acc_val_mean = np.array(acc_set).mean()  
  103.    avg_loss_val_mean = np.array(avg_loss_set).mean()  
  104.  
  105.    print('loss={}, acc={}'.format(avg_loss_val_mean, acc_val_mean))  
  106. # -*- coding:utf-8 -*-  
  107.  
  108. # 导入需要的包  
  109. import paddle  
  110. import numpy as np  
  111. from paddle.nn import Conv2D, MaxPool2D, Linear, Dropout  
  112. import paddle.nn.functional as F  
  113.  
  114. # 定义 LeNet 网络结构  
  115. class LeNet(paddle.nn.Layer):  
  116.    def __init__(self, num_classes=1):  
  117.        super(LeNet, self).__init__()  
  118.  
  119.        # 创建卷积和池化层块,每个卷积层使用Sigmoid激活函数,后面跟着一个2x2的池化  
  120.        self.conv1 = Conv2D(in_channels=3, out_channels=6, kernel_size=5)  
  121.        self.max_pool1 = MaxPool2D(kernel_size=2, stride=2)  
  122.        self.conv2 = Conv2D(in_channels=6, out_channels=16, kernel_size=5)  
  123.        self.max_pool2 = MaxPool2D(kernel_size=2, stride=2)  
  124.        # 创建第3个卷积层  
  125.        self.conv3 = Conv2D(in_channels=16, out_channels=120, kernel_size=4)  
  126.        # 创建全连接层,第一个全连接层的输出神经元个数为64  
  127.        self.fc1 = Linear(in_features=300000, out_features=64)  
  128.        # 第二个全连接层输出神经元个数为分类标签的类别数  
  129.        self.fc2 = Linear(in_features=64, out_features=num_classes)  
  130.  
  131.    # 网络的前向计算过程  
  132.    def forward(self, x, label=None):  
  133.        x = self.conv1(x)  
  134.        x = F.sigmoid(x)  
  135.        x = self.max_pool1(x)  
  136.        x = self.conv2(x)  
  137.        x = F.sigmoid(x)  
  138.        x = self.max_pool2(x)  
  139.        x = self.conv3(x)  
  140.        x = F.sigmoid(x)  
  141.        x = paddle.reshape(x, [x.shape[0], -1])  
  142.        x = self.fc1(x)  
  143.        x = F.sigmoid(x)  
  144.        x = self.fc2(x)  
  145.        if label is not None:  
  146.            acc = paddle.metric.accuracy(input=x, label=label)  
  147.            return x, acc  
  148.        else:  
  149.            return x  
  150. # 创建模型  
  151. model = LeNet(num_classes=1)  
  152. # 启动训练过程  
  153. opt = paddle.optimizer.Momentum(learning_rate=0.001, momentum=0.9, parameters=model.parameters())  
  154. train_pm(model, optimizer=opt)  
  155. evaluation(model, params_file_path="palm.pdparams")  



(5)参数调整:



image.jpeg


文件报错:invalid literal for int() with base 10: ''


image.png


从网上找相关资料发现因为python不能直接将包含小数点的字符串转化为整数,而原始数据的格式经常是不一致的,故类型转化时造成ValueError异常。

解决方法:先将字符串转换为浮点数float,在将浮点数转化为整数int。


第一次改正:label = int(float(line[2]))


依旧报错:ValueError: could not convert string to float: ''


image.png


之后继续检阅资料发现原因空字符串无法转成整型
解决办法:加入异常值抛出。若遇到ValueError错误,直接pass,否则执行else下面的程序。

 

修改后程序:


image.png


(6)除此之外就是一些文件地址的修改


以下是改正后的代码


  1. DATADIR = '/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Training400/PALM-Training400'  
  2. # 文件名以N开头的是正常眼底图片,以P开头的是病变眼底图片  
  3. file1 = '/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Training400/PALM-Training400/N0012.jpg'  
  4. file2 = '/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Training400/PALM-Training400/P0095.jpg'  
  5. DATADIR2 = '/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Validation400'  
  6. CSVFILE = '/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Validation-GT/labels.csv'          
  7.  
  8. paddle.save(model.state_dict(), '眼疾识别.pdparams')  
  9. paddle.save(optimizer.state_dict(), '眼疾识别.pdopt')  
  10. evaluation(model, params_file_path="眼疾识别.pdparams")  


相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
27天前
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
|
4月前
|
人工智能 文字识别 自然语言处理
OCR小模型仍有机会!华科等提出VIMTS:零样本视频端到端识别新SOTA
【6月更文挑战第7天】华中科技大学团队推出VIMTS模型,刷新零样本视频文本识别SOTA。该模型通过Prompt Queries Generation Module和Tasks-aware Adapter增强跨任务协同,提升泛化能力。在多个跨域基准测试中,VIMTS平均性能提升2.6%,视频识别上超越现有方法。此创新降低OCR对标注数据依赖,为资源受限场景提供新方案。论文链接:https://arxiv.org/pdf/2404.19652
58 3
|
5月前
|
测试技术 决策智能
专业智能体指导让小模型学会数学推理!微调Mistral-7B实现86.81%准确率
【5月更文挑战第13天】Orca-Math研究展示如何用小模型解决小学数学题,通过70亿参数的SLM在GSM8K基准测试上达到86.81%准确率。采用合成数据集和迭代学习技术,包括多智能体协作创建问题集及“偏好学习”优化解决方案。虽优于其他大、小模型,但可能不适用于复杂数学问题,且依赖高质量合成数据集的创建。[论文链接](https://arxiv.org/abs/2402.14830)
153 4
|
5月前
|
机器学习/深度学习 人工智能 算法
基于AidLux的工业视觉少样本缺陷检测实战应用---深度学习分割模型UNET的实践部署
  工业视觉在生产和制造中扮演着关键角色,而缺陷检测则是确保产品质量和生产效率的重要环节。工业视觉的前景与发展在于其在生产制造领域的关键作用,尤其是在少样本缺陷检测方面,借助AidLux技术和深度学习分割模型UNET的实践应用,深度学习分割模型UNET的实践部署变得至关重要。
131 1
|
5月前
|
人工智能 Ubuntu C++
极智AI | ncnn模型转换及量化流程
本文介绍一下 ncnn 模型转换及量化流程,以 from_darknet yolov4 为例。
294 0
|
机器学习/深度学习 存储 自然语言处理
全方位分析大模型参数高效微调,清华研究登Nature子刊(1)
全方位分析大模型参数高效微调,清华研究登Nature子刊
1038 0
|
自然语言处理 物联网 异构计算
全方位分析大模型参数高效微调,清华研究登Nature子刊(2)
全方位分析大模型参数高效微调,清华研究登Nature子刊
228 0
|
存储 人工智能 自然语言处理
全方位分析大模型参数高效微调,清华研究登Nature子刊(3)
全方位分析大模型参数高效微调,清华研究登Nature子刊
216 0
|
机器学习/深度学习 人工智能 算法
浙大团队基于ML的抗菌肽筛选模型,可识别整个肽库空间发现新药
浙大团队基于ML的抗菌肽筛选模型,可识别整个肽库空间发现新药
223 0
|
机器学习/深度学习 人工智能 运维
ECCV 2022 Oral | 无需微调即可推广,上交大、上海人工智能实验室等提出基于配准的少样本异常检测框架
ECCV 2022 Oral | 无需微调即可推广,上交大、上海人工智能实验室等提出基于配准的少样本异常检测框架
127 0
下一篇
无影云桌面