1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 《专业创新实践Ⅱ》大作业 LeNet在眼疾识别数据集iChallenge-PM上的应用

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

时间:2024-01-23 12:22:58

相关推荐

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

《专业创新实践Ⅱ》大作业

项目名称LeNet在眼疾识别数据集iChallenge-PM上的应用

学院信息与通信工程学院

年级专业20级智能科学与技术

姓名孙成

学 号3101694

完成时间-7-7

指导教师邵春艳老师

开 课 时 间至学年第二学期

一、引言

LeNet在眼疾识别数据集iChallenge-PM上的应用

iChallenge-PM是百度大脑和中山大学中山眼科中心联合举办的iChallenge比赛中,提供的关于病理性近视(Pathologic Myopia,PM)的医疗类数据集,包含1200个受试者的眼底视网膜图片,训练、验证和测试数据集各400张。

说明:

如今近视已经成为困扰人们健康的一项全球性负担,在近视人群中,有超过35%的人患有重度近视。近视会拉长眼睛的光轴,也可能引起视网膜或者络网膜的病变。随着近视度数的不断加深,高度近视有可能引发病理性病变,这将会导致以下几种症状:视网膜或者络网膜发生退化、视盘区域萎缩、漆裂样纹损害、Fuchs斑等。因此,及早发现近视患者眼睛的病变并采取治疗,显得非常重要。

二、方法

(1)数学模型

LeNet是最早的卷积神经网络之一[1]。1998年,Yann LeCun第一次将LeNet卷积神经网络应用到图像分类上,在手写数字识别任务中取得了巨大成功。LeNet通过连续使用卷积和池化层的组合提取图像特征,其架构如 图1所示,这里展示的是用于MNIST手写体数字识别任务中的LeNet-5模型:

第一模块:包含5×5的6通道卷积和2×2的池化。卷积提取图像中包含的特征模式(激活函数使用Sigmoid),图像尺寸从28减小到24。经过池化层可以降低输出特征图对空间位置的敏感性,图像尺寸减到12。

第二模块:和第一模块尺寸相同,通道数由6增加为16。卷积操作使图像尺寸减小到8,经过池化后变成4。

第三模块:包含4×4的120通道卷积。卷积之后的图像尺寸减小到1,但是通道数增加为120。将经过第3次卷积提取到的特征图输入到全连接层。第一个全连接层的输出神经元的个数是64,第二个全连接层的输出神经元个数是分类标签的类别数,对于手写数字识别的类别数是10。然后使用Softmax激活函数即可计算出每个类别的预测概率。

(2)方法工具

1、运行环境:

​​​​​​​

百度人工智能平台Paddle

2、数据集:

眼疾识别数据集iChallenge-PM中既有病理性近视患者的眼底图片,也有非病理性近视患者的图片,命名规则如下:

病理性近视(PM):文件名以P开头非病理性近视(non-PM): 高度近视(high myopia):文件名以H开头正常眼睛(normal):文件名以N开头

我们将病理性患者的图片作为正样本,标签为1; 非病理性患者的图片作为负样本,标签为0。从数据集中选取两张图片,通过LeNet提取特征,构建分类器,对正负样本进行分类,并将图片显示出来。

​​​​​​​​​​​​​​

实验过程数据集准备

training.zip:包含训练中的图片和标签

validation.zip:包含验证集的图片

valid_gt.zip:包含验证集的标签

其中需要注意,需要将“/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Validation-GT”目录下“PM_Label_and_Fovea_Location.xlsx”文件转存成.csv格式,本节代码示例中已经提前转成文件labels.csv。

(2)查看数据集图片

iChallenge-PM中既有病理性近视患者的眼底图片,也有非病理性近视患者的图片,命名规则如下:

病理性近视(PM):文件名以P开头非病理性近视(non-PM): 高度近视(high myopia):文件名以H开头正常眼睛(normal):文件名以N开头

我们将病理性患者的图片作为正样本,标签为1; 非病理性患者的图片作为负样本,标签为0。从数据集中选取两张图片,通过LeNet提取特征,构建分类器,对正负样本进行分类,并将图片显示出来。

代码如下:

importosimportnumpyasnpimportmatplotlib.pyplotasplt%matplotlibinlinefromPILimportImageDATADIR='/home/aistudio/work/palm/PALM-Training400/PALM-Training400'#文件名以N开头的是正常眼底图片,以P开头的是病变眼底图片file1='N0012.jpg'file2='P0095.jpg'#读取图片img1=Image.open(os.path.join(DATADIR,file1))img1=np.array(img1)img2=Image.open(os.path.join(DATADIR,file2))img2=np.array(img2)#画出读取的图片plt.figure(figsize=(16,8))f=plt.subplot(121)f.set_title('Normal',fontsize=20)plt.imshow(img1)f=plt.subplot(122)f.set_title('PM',fontsize=20)plt.imshow(img2)plt.show()#查看图片形状img1.shape,img2.shape((2056,2124,3),(2056,2124,3))定义数据读取器

使用OpenCV从磁盘读入图片,将每张图缩放到224×224224×224大小,并且将像素值调整到[−1,1][−1,1]之间,代码如下所示:

importcv2importrandomimportnumpyasnpimportos#对读入的图像数据进行预处理deftransform_img(img):#将图片尺寸缩放道224x224img=cv2.resize(img,(224,224))#读入的图像数据格式是[H,W,C]#使用转置操作将其变成[C,H,W]img=np.transpose(img,(2,0,1))img=img.astype('float32')#将数据范围调整到[-1.0,1.0]之间img=img/255.img=img*2.0-1.0returnimg#定义训练集数据读取器defdata_loader(datadir,batch_size=10,mode='train'):#将datadir目录下的文件列出来,每条文件都要读入filenames=os.listdir(datadir)defreader():ifmode=='train':#训练时随机打乱数据顺序random.shuffle(filenames)batch_imgs=[]batch_labels=[]fornameinfilenames:filepath=os.path.join(datadir,name)img=cv2.imread(filepath)img=transform_img(img)ifname[0]=='H'orname[0]=='N':#H开头的文件名表示高度近似,N开头的文件名表示正常视力#高度近视和正常视力的样本,都不是病理性的,属于负样本,标签为0label=0elifname[0]=='P':#P开头的是病理性近视,属于正样本,标签为1label=1else:raise('Notexceptedfilename')#每读取一个样本的数据,就将其放入数据列表中batch_imgs.append(img)batch_labels.append(label)iflen(batch_imgs)==batch_size:#当数据列表的长度等于batch_size的时候,#把这些数据当作一个mini-batch,并作为数据生成器的一个输出imgs_array=np.array(batch_imgs).astype('float32')labels_array=np.array(batch_labels).astype('float32').reshape(-1,1)yieldimgs_array,labels_arraybatch_imgs=[]batch_labels=[]iflen(batch_imgs)>0:#剩余样本数目不足一个batch_size的数据,一起打包成一个mini-batchimgs_array=np.array(batch_imgs).astype('float32')labels_array=np.array(batch_labels).astype('float32').reshape(-1,1)yieldimgs_array,labels_arrayreturnreader#定义验证集数据读取器defvalid_data_loader(datadir,csvfile,batch_size=10,mode='valid'):#训练集读取时通过文件名来确定样本标签,验证集则通过csvfile来读取每个图片对应的标签#请查看解压后的验证集标签数据,观察csvfile文件里面所包含的内容#csvfile文件所包含的内容格式如下,每一行代表一个样本,#其中第一列是图片id,第二列是文件名,第三列是图片标签,#第四列和第五列是Fovea的坐标,与分类任务无关#ID,imgName,Label,Fovea_X,Fovea_Y#1,V0001.jpg,0,1157.74,1019.87#2,V0002.jpg,1,1285.82,1080.47#打开包含验证集标签的csvfile,并读入其中的内容filelists=open(csvfile).readlines()defreader():batch_imgs=[]batch_labels=[]forlineinfilelists[1:]:line=line.strip().split(',')name=line[1]label=int(line[2])#根据图片文件名加载图片,并对图像数据作预处理filepath=os.path.join(datadir,name)img=cv2.imread(filepath)img=transform_img(img)#每读取一个样本的数据,就将其放入数据列表中batch_imgs.append(img)batch_labels.append(label)iflen(batch_imgs)==batch_size:#当数据列表的长度等于batch_size的时候,#把这些数据当作一个mini-batch,并作为数据生成器的一个输出imgs_array=np.array(batch_imgs).astype('float32')labels_array=np.array(batch_labels).astype('float32').reshape(-1,1)yieldimgs_array,labels_arraybatch_imgs=[]batch_labels=[]iflen(batch_imgs)>0:#剩余样本数目不足一个batch_size的数据,一起打包成一个mini-batchimgs_array=np.array(batch_imgs).astype('float32')labels_array=np.array(batch_labels).astype('float32').reshape(-1,1)yieldimgs_array,labels_arrayreturnreader#查看数据形状DATADIR='/home/aistudio/work/palm/PALM-Training400/PALM-Training400'train_loader=data_loader(DATADIR,batch_size=10,mode='train')data_reader=train_loader()data=next(data_reader)data[0].shape,data[1].shapeeval_loader=data_loader(DATADIR,batch_size=10,mode='eval')data_reader=eval_loader()data=next(data_reader)data[0].shape,data[1].shape启动训练:代码如下#-*-coding:utf-8-*-#LeNet识别眼疾图片importosimportrandomimportpaddleimportnumpyasnpDATADIR='/home/aistudio/work/palm/PALM-Training400/PALM-Training400'DATADIR2='/home/aistudio/work/palm/PALM-Validation400'CSVFILE='/home/aistudio/labels.csv'#定义训练过程deftrain_pm(model,optimizer):#开启0号GPU训练use_gpu=Truepaddle.set_device('gpu:0')ifuse_gpuelsepaddle.set_device('cpu')print('starttraining...')model.train()epoch_num=5#定义数据读取器,训练数据读取器和验证数据读取器train_loader=data_loader(DATADIR,batch_size=10,mode='train')valid_loader=valid_data_loader(DATADIR2,CSVFILE)forepochinrange(epoch_num):forbatch_id,datainenumerate(train_loader()):x_data,y_data=dataimg=paddle.to_tensor(x_data)label=paddle.to_tensor(y_data)#运行模型前向计算,得到预测值logits=model(img)loss=F.binary_cross_entropy_with_logits(logits,label)avg_loss=paddle.mean(loss)ifbatch_id%10==0:print("epoch:{},batch_id:{},lossis:{}".format(epoch,batch_id,avg_loss.numpy()))#反向传播,更新权重,清除梯度avg_loss.backward()optimizer.step()optimizer.clear_grad()model.eval()accuracies=[]losses=[]forbatch_id,datainenumerate(valid_loader()):x_data,y_data=dataimg=paddle.to_tensor(x_data)label=paddle.to_tensor(y_data)#运行模型前向计算,得到预测值logits=model(img)#二分类,sigmoid计算后的结果以0.5为阈值分两个类别#计算sigmoid后的预测概率,进行loss计算pred=F.sigmoid(logits)loss=F.binary_cross_entropy_with_logits(logits,label)#计算预测概率小于0.5的类别pred2=pred*(-1.0)+1.0#得到两个类别的预测概率,并沿第一个维度级联pred=paddle.concat([pred2,pred],axis=1)acc=paddle.metric.accuracy(pred,paddle.cast(label,dtype='int64'))accuracies.append(acc.numpy())losses.append(loss.numpy())print("[validation]accuracy/loss:{}/{}".format(np.mean(accuracies),np.mean(losses)))model.train()paddle.save(model.state_dict(),'palm.pdparams')paddle.save(optimizer.state_dict(),'palm.pdopt')#定义评估过程defevaluation(model,params_file_path):#开启0号GPU预估use_gpu=Truepaddle.set_device('gpu:0')ifuse_gpuelsepaddle.set_device('cpu')print('startevaluation.......')#加载模型参数model_state_dict=paddle.load(params_file_path)model.load_dict(model_state_dict)model.eval()eval_loader=data_loader(DATADIR,batch_size=10,mode='eval')acc_set=[]avg_loss_set=[]forbatch_id,datainenumerate(eval_loader()):x_data,y_data=dataimg=paddle.to_tensor(x_data)label=paddle.to_tensor(y_data)y_data=y_data.astype(np.int64)label_64=paddle.to_tensor(y_data)#计算预测和精度prediction,acc=model(img,label_64)#计算损失函数值loss=F.binary_cross_entropy_with_logits(prediction,label)avg_loss=paddle.mean(loss)acc_set.append(float(acc.numpy()))avg_loss_set.append(float(avg_loss.numpy()))#求平均精度acc_val_mean=np.array(acc_set).mean()avg_loss_val_mean=np.array(avg_loss_set).mean()print('loss={},acc={}'.format(avg_loss_val_mean,acc_val_mean))#-*-coding:utf-8-*-#导入需要的包importpaddleimportnumpyasnpfrompaddle.nnimportConv2D,MaxPool2D,Linear,Dropoutimportpaddle.nn.functionalasF#定义LeNet网络结构classLeNet(paddle.nn.Layer):def__init__(self,num_classes=1):super(LeNet,self).__init__()#创建卷积和池化层块,每个卷积层使用Sigmoid激活函数,后面跟着一个2x2的池化self.conv1=Conv2D(in_channels=3,out_channels=6,kernel_size=5)self.max_pool1=MaxPool2D(kernel_size=2,stride=2)self.conv2=Conv2D(in_channels=6,out_channels=16,kernel_size=5)self.max_pool2=MaxPool2D(kernel_size=2,stride=2)#创建第3个卷积层self.conv3=Conv2D(in_channels=16,out_channels=120,kernel_size=4)#创建全连接层,第一个全连接层的输出神经元个数为64self.fc1=Linear(in_features=300000,out_features=64)#第二个全连接层输出神经元个数为分类标签的类别数self.fc2=Linear(in_features=64,out_features=num_classes)#网络的前向计算过程defforward(self,x,label=None):x=self.conv1(x)x=F.sigmoid(x)x=self.max_pool1(x)x=self.conv2(x)x=F.sigmoid(x)x=self.max_pool2(x)x=self.conv3(x)x=F.sigmoid(x)x=paddle.reshape(x,[x.shape[0],-1])x=self.fc1(x)x=F.sigmoid(x)x=self.fc2(x)iflabelisnotNone:acc=paddle.metric.accuracy(input=x,label=label)returnx,accelse:returnx#创建模型model=LeNet(num_classes=1)#启动训练过程opt=paddle.optimizer.Momentum(learning_rate=0.001,momentum=0.9,parameters=model.parameters())train_pm(model,optimizer=opt)evaluation(model,params_file_path="palm.pdparams")

(5)参数调整:

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

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

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

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

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

之后继续检阅资料发现原因:空字符串无法转成整型

解决办法:加入异常值抛出。若遇到ValueError错误,直接pass,否则执行else下面的程序。

修改后程序:

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

以下是改正后的代码

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

(7)文件顺利执行,得出结果:

评估后得出结果:

loss=0.6918540149927139.acc=0.46750000305473804

可以看出效果并不是很理想,需要进一步调整学习率优化准确度

结论

在老师布置了创新创业大作业以后,我便开始选择题目,在浏览了十多题后,我最终选择了眼疾识别问题作为此次创新创业课程设计的大作业。如今近视已经成为困扰人们健康的一项全球性负担,在近视人群中,有超过35%的人患有重度近视。因此,及早发现近视患者眼睛的病变并采取治疗,显得非常重要。定题后,我便开始后面的设计。

我们是这学期学的Python语言和百度Paddle人工智能平台,一下子接触很多新的概念,多多少少有点不适应,平时忙着复习预习物理数学等科目,就仅仅周末有一些时间练习Python语言和百度Paddle人工智能平台,于是把paddle平台和python的训练给丢下了,在最后一个月,才开始抓紧学习两个平台的搭配使用。

从Paddle平台获得程序后,我首先下载平台提供的数据集,并对已完成的代码更改程序中打开的本地文件地址。

在检查好滴之后,第一次运行,出现了左右两只眼球的图,把我高兴坏了,但高兴没过一会儿,出现了一个文件报错,内容是:invalid literal for int() with base 10: ''从CSDN上检索了相关问题的解决办法,首先尝试的是将数据先转为float类型,再用int函数强行变为整型,但是发现改正后运行还是继续报错,报错内容为:ValueError: could not convert string to float: ''这个时候,心里是有点害怕的,到底是接着int(float())改还是退回int()改,再冷静思考后,我决定还是退回int()改,以防代码出现大面积更换,不利于后期程序运行和理解。

在CSDN上继续检索后,又发现一个解决的方案,就是用pass函数跳过,

将代码处理后,再次运行,完美得到结果,并且没有出现任何大面积的程序改动。

顿时,好像一下子从暗无天日的盲目中找到了方向,心中一下子开阔起来。

这个过程出现了曲折大致可以认为是编程软件的更新,以及本地环境的不匹配导致的,网上很多的代码的都是基于个人本地环境实现的,相关的代码我不能直接套用,针对这个问题,我首先是阅读他的程序,判断哪些是我能自主修改最终能在我本地运行的。

检阅python相关的语法,接着学习paddle的使用方法,在进行改码时,还是出现了很多错误,在一遍遍的修改查资料后,还是不能一下子就很快地将程序调出来,这个时候我们想到了学长,在学长的指导下,我们很快地找到了问题的症结———相关文件尺寸的问题。

接下来的过程就很轻松,一遍遍的运行代码,一遍遍的优化代码,最终获得了实验得出最优的眼疾识别代码。

最后一点最重要的体会就是:要学会查找资料,要学会请教他人,学会坚持和钻研。不要怕!不要悔!

五、参考文献

1代码高亮处理

2paddle人工智能平台飞桨PaddlePaddle-源于产业实践的开源深度学习平台

3、第一次处理方法/weixin_44034883/article/details/112918440

4、第二次处理办法

/zcs_xueli/article/details/107458068?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

六、以下是完整代码:

importosimportnumpyasnpimportmatplotlib.pyplotaspltfromPILimportImageDATADIR='/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Training400/PALM-Training400'#文件名以N开头的是正常眼底图片,以P开头的是病变眼底图片file1='/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Training400/PALM-Training400/N0012.jpg'file2='/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Training400/PALM-Training400/P0095.jpg'#读取图片img1=Image.open(os.path.join(DATADIR,file1))img1=np.array(img1)img2=Image.open(os.path.join(DATADIR,file2))img2=np.array(img2)#画出读取的图片plt.figure(figsize=(16,8))f=plt.subplot(121)f.set_title('Normal',fontsize=20)plt.imshow(img1)f=plt.subplot(122)f.set_title('PM',fontsize=20)plt.imshow(img2)plt.show()importcv2importrandomimportnumpyasnpimportos#对读入的图像数据进行预处理deftransform_img(img):#将图片尺寸缩放道224x224img=cv2.resize(img,(224,224))#读入的图像数据格式是[H,W,C]#使用转置操作将其变成[C,H,W]img=np.transpose(img,(2,0,1))img=img.astype('float32')#将数据范围调整到[-1.0,1.0]之间img=img/255.img=img*2.0-1.0returnimg#定义训练集数据读取器defdata_loader(datadir,batch_size=10,mode='train'):#将datadir目录下的文件列出来,每条文件都要读入filenames=os.listdir(datadir)defreader():ifmode=='train':#训练时随机打乱数据顺序random.shuffle(filenames)batch_imgs=[]batch_labels=[]fornameinfilenames:filepath=os.path.join(datadir,name)img=cv2.imread(filepath)img=transform_img(img)ifname[0]=='H'orname[0]=='N':#H开头的文件名表示高度近似,N开头的文件名表示正常视力#高度近视和正常视力的样本,都不是病理性的,属于负样本,标签为0label=0elifname[0]=='P':#P开头的是病理性近视,属于正样本,标签为1label=1else:raise('Notexceptedfilename')#每读取一个样本的数据,就将其放入数据列表中batch_imgs.append(img)batch_labels.append(label)iflen(batch_imgs)==batch_size:#当数据列表的长度等于batch_size的时候,#把这些数据当作一个mini-batch,并作为数据生成器的一个输出imgs_array=np.array(batch_imgs).astype('float32')labels_array=np.array(batch_labels).astype('float32').reshape(-1,1)yieldimgs_array,labels_arraybatch_imgs=[]batch_labels=[]iflen(batch_imgs)>0:#剩余样本数目不足一个batch_size的数据,一起打包成一个mini-batchimgs_array=np.array(batch_imgs).astype('float32')labels_array=np.array(batch_labels).astype('float32').reshape(-1,1)yieldimgs_array,labels_arrayreturnreader#定义验证集数据读取器defvalid_data_loader(datadir,csvfile,batch_size=10,mode='valid'):#训练集读取时通过文件名来确定样本标签,验证集则通过csvfile来读取每个图片对应的标签#请查看解压后的验证集标签数据,观察csvfile文件里面所包含的内容#csvfile文件所包含的内容格式如下,每一行代表一个样本,#其中第一列是图片id,第二列是文件名,第三列是图片标签,#第四列和第五列是Fovea的坐标,与分类任务无关#ID,imgName,Label,Fovea_X,Fovea_Y#1,V0001.jpg,0,1157.74,1019.87#2,V0002.jpg,1,1285.82,1080.47#打开包含验证集标签的csvfile,并读入其中的内容filelists=open(csvfile).readlines()defreader():batch_imgs=[]batch_labels=[]forlineinfilelists[1:]:line=line.strip().split(',')name=line[1]try:label=int(line[2])exceptValueErrorase:passelse:#根据图片文件名加载图片,并对图像数据作预处理filepath=os.path.join(datadir,name)img=cv2.imread(filepath)img=transform_img(img)#每读取一个样本的数据,就将其放入数据列表中batch_imgs.append(img)batch_labels.append(label)iflen(batch_imgs)==batch_size:#当数据列表的长度等于batch_size的时候,#把这些数据当作一个mini-batch,并作为数据生成器的一个输出imgs_array=np.array(batch_imgs).astype('float32')labels_array=np.array(batch_labels).astype('float32').reshape(-1,1)yieldimgs_array,labels_arraybatch_imgs=[]batch_labels=[]iflen(batch_imgs)>0:#剩余样本数目不足一个batch_size的数据,一起打包成一个mini-batchimgs_array=np.array(batch_imgs).astype('float32')labels_array=np.array(batch_labels).astype('float32').reshape(-1,1)yieldimgs_array,labels_arrayreturnreader#查看数据形状DATADIR='/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Training400/PALM-Training400'train_loader=data_loader(DATADIR,batch_size=10,mode='train')data_reader=train_loader()data=next(data_reader)data[0].shape,data[1].shapeeval_loader=data_loader(DATADIR,batch_size=10,mode='eval')data_reader=eval_loader()data=next(data_reader)data[0].shape,data[1].shape#LeNet识别眼疾图片importosimportrandomimportpaddleimportnumpyasnpDATADIR='/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Training400/PALM-Training400'DATADIR2='/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Validation400'CSVFILE='/Users/suncheng/PycharmProjects/测试/MNIST数据集/眼疾识别/PALM-Validation-GT/labels.csv'#定义训练过程deftrain_pm(model,optimizer):#开启0号GPU训练use_gpu=Falsepaddle.set_device('gpu:0')ifuse_gpuelsepaddle.set_device('cpu')print('starttraining...')model.train()epoch_num=5#定义数据读取器,训练数据读取器和验证数据读取器train_loader=data_loader(DATADIR,batch_size=10,mode='train')valid_loader=valid_data_loader(DATADIR2,CSVFILE)forepochinrange(epoch_num):forbatch_id,datainenumerate(train_loader()):x_data,y_data=dataimg=paddle.to_tensor(x_data)label=paddle.to_tensor(y_data)#运行模型前向计算,得到预测值logits=model(img)loss=F.binary_cross_entropy_with_logits(logits,label)avg_loss=paddle.mean(loss)ifbatch_id%10==0:print("epoch:{},batch_id:{},lossis:{}".format(epoch,batch_id,avg_loss.numpy()))#反向传播,更新权重,清除梯度avg_loss.backward()optimizer.step()optimizer.clear_grad()model.eval()accuracies=[]losses=[]forbatch_id,datainenumerate(valid_loader()):x_data,y_data=dataimg=paddle.to_tensor(x_data)label=paddle.to_tensor(y_data)#运行模型前向计算,得到预测值logits=model(img)#二分类,sigmoid计算后的结果以0.5为阈值分两个类别#计算sigmoid后的预测概率,进行loss计算pred=F.sigmoid(logits)loss=F.binary_cross_entropy_with_logits(logits,label)#计算预测概率小于0.5的类别pred2=pred*(-1.0)+1.0#得到两个类别的预测概率,并沿第一个维度级联pred=paddle.concat([pred2,pred],axis=1)acc=paddle.metric.accuracy(pred,paddle.cast(label,dtype='int64'))accuracies.append(acc.numpy())losses.append(loss.numpy())print("[validation]accuracy/loss:{}/{}".format(np.mean(accuracies),np.mean(losses)))model.train()paddle.save(model.state_dict(),'眼疾识别.pdparams')paddle.save(optimizer.state_dict(),'眼疾识别.pdopt')#定义评估过程defevaluation(model,params_file_path):#开启0号GPU预估use_gpu=Falsepaddle.set_device('gpu:0')ifuse_gpuelsepaddle.set_device('cpu')print('startevaluation.......')#加载模型参数model_state_dict=paddle.load(params_file_path)model.load_dict(model_state_dict)model.eval()eval_loader=data_loader(DATADIR,batch_size=10,mode='eval')acc_set=[]avg_loss_set=[]forbatch_id,datainenumerate(eval_loader()):x_data,y_data=dataimg=paddle.to_tensor(x_data)label=paddle.to_tensor(y_data)y_data=y_data.astype(np.int64)label_64=paddle.to_tensor(y_data)#计算预测和精度prediction,acc=model(img,label_64)#计算损失函数值loss=F.binary_cross_entropy_with_logits(prediction,label)avg_loss=paddle.mean(loss)acc_set.append(float(acc.numpy()))avg_loss_set.append(float(avg_loss.numpy()))#求平均精度acc_val_mean=np.array(acc_set).mean()avg_loss_val_mean=np.array(avg_loss_set).mean()print('loss={},acc={}'.format(avg_loss_val_mean,acc_val_mean))#-*-coding:utf-8-*-#导入需要的包importpaddleimportnumpyasnpfrompaddle.nnimportConv2D,MaxPool2D,Linear,Dropoutimportpaddle.nn.functionalasF#定义LeNet网络结构classLeNet(paddle.nn.Layer):def__init__(self,num_classes=1):super(LeNet,self).__init__()#创建卷积和池化层块,每个卷积层使用Sigmoid激活函数,后面跟着一个2x2的池化self.conv1=Conv2D(in_channels=3,out_channels=6,kernel_size=5)self.max_pool1=MaxPool2D(kernel_size=2,stride=2)self.conv2=Conv2D(in_channels=6,out_channels=16,kernel_size=5)self.max_pool2=MaxPool2D(kernel_size=2,stride=2)#创建第3个卷积层self.conv3=Conv2D(in_channels=16,out_channels=120,kernel_size=4)#创建全连接层,第一个全连接层的输出神经元个数为64self.fc1=Linear(in_features=300000,out_features=64)#第二个全连接层输出神经元个数为分类标签的类别数self.fc2=Linear(in_features=64,out_features=num_classes)#网络的前向计算过程defforward(self,x,label=None):x=self.conv1(x)x=F.sigmoid(x)x=self.max_pool1(x)x=self.conv2(x)x=F.sigmoid(x)x=self.max_pool2(x)x=self.conv3(x)x=F.sigmoid(x)x=paddle.reshape(x,[x.shape[0],-1])x=self.fc1(x)x=F.sigmoid(x)x=self.fc2(x)iflabelisnotNone:acc=paddle.metric.accuracy(input=x,label=label)returnx,accelse:returnx#创建模型model=LeNet(num_classes=1)#启动训练过程opt=paddle.optimizer.Momentum(learning_rate=0.001,momentum=0.9,parameters=model.parameters())train_pm(model,opt)evaluation(model,params_file_path="眼疾识别.pdparams")

夹带点私货:海大牛!都给我来海大,也希望我能追的到我喜欢的女生

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。