原始数据

数据这方面,Kaggle给出的是csv文件,0列表示的是标签,其他28*28列是每个像素的值,而FastAi在设计的时候是没有考虑这种数据的,所以DataLoaders和learner都是不支持该类型的数据的。某些文章的做法是重写DataLoaders和learner的Model,但是个人观点,这样的话直接用Torch不是更好的选择么。FasterAi的API那么用是一定要用的,而数据都是像素值也不必要特殊的预处理,所以生成数据就完事了。

数据生成

采用了PIL.Image中的方法,配合os的文件方法,主要生成思路:

  1. pandas读取像素值数据,转换为28*28的ndarray
  2. 按序号生成图片名称,形如0.png,将训练集的图片放至命名为label(0-9)的文件夹。
  3. 将测试集图片放入任意文件夹。

代码如下:

images = path/'images'
train_image_folder = images/'train'
test_image_folder = images/'test'
m_train = train_df.shape[0]
n_train = train_df.shape[1]
m_test = test_df.shape[0]
n_test = test_df.shape[1]if not os.path.exists(train_image_folder) and not os.path.exists(test_image_folder):os.makedirs(train_image_folder)os.makedirs(test_image_folder)for i in range(0,m_train):matrix = train_df.to_numpy()[i,1:].reshape((28,28))img = Image.fromarray((np.uint8(matrix)))#img = img.convert('RGB')if not os.path.exists(train_image_folder/str(train_df.iloc[i,0])):os.mkdir(train_image_folder/str(train_df.iloc[i,0]))train_image_name = str(i)img.save(train_image_folder/str(train_df.iloc[i,0])/(train_image_name+".png"))for j in range(0,m_test):matrix = test_df.to_numpy()[j,:].reshape((28,28))img = Image.fromarray((np.uint8(matrix)))text_image_name = str(j)img.save(test_image_folder/(text_image_name+".png"))

读取及训练

代码如下:

dls = ImageDataLoaders.from_folder(train_image_folder,valid_pct=0.2,seed=1024)
learn = cnn_learner(dls,models.resnet152)
learn.lr_find()
learn.fine_tune(10)

图像分类预测 (核心部分)

如果想了解如何得出这个方法,请参考https://blog.csdn.net/demonhunter8023/article/details/118882427中的源码阅读及踩坑记录。

主要步骤如下:

  1. 将所有的测试集的途径组合成一个List,List中的对象为Path对象。
  2. 使用laerner.test_dl()方法将上面的List转换为dl
  3. 使用laerner.get_preds()方法,输入dl得出预测结果

具体代码如下:

test_paths = []
for i in range(0,28000):test_paths.append(Path(test_image_folder/(str(i)+'.png')))
dl = learn.dls.test_dl(test_paths)
preds = learn.get_preds(dl = dl)
preds = preds[0].numpy().argmax(axis=1)

结果保存代码如下:

df_result = pd.DataFrame()
df_result['ImageId'] = range(1,28001)
df_result['Label'] = preds
df_result.head(20)
df_result.to_csv('./res152fit10.csv',header=True,index=False)

无调参训练实战

直接附上实验结果:

算法比较
Model epoch KaggleScore trainloss        validloss
ResNet34 1 0.97428 00.122349    0.078534
ResNet34 10 0.99164 见下表
epoch train_loss valid_loss time
0 0.211810 0.131780 00:44
1 0.126085 0.073280 00:44
2 0.080692 0.056544 00:44
3 0.061979 0.046821 00:44
4 0.034753 0.034485 00:45
5 0.019826 0.039189 00:44
6 0.012665 0.033801 00:44
7 0.010440 0.034192 00:45
8 0.003995 0.032234 00:45
9 0.001382 0.032717 00:45
ResNet50 1 0.97521 0.122589         0.076024       
ResNet50 10 0.99325 见下表
epoch train_loss valid_loss time
0 0.192712 0.108602 00:56
1 0.097312 0.062348 00:56
2 0.079611 0.047028 00:56
3 0.055120 0.039737 00:56
4 0.031925 0.033630 00:56
5 0.017116 0.029282 00:56
6 0.013225 0.024765 00:56
7 0.004849 0.026610 00:56
8 0.003238 0.026681 00:56
9 0.000857 0.024029 00:56
ResNet152 10 0.99260 见下表
epoch train_loss valid_loss time
0 0.196527 0.122694 01:38
1 0.105348 0.069224 01:37
2 0.086998 0.045488 01:37
3 0.047238 0.045351 01:42
4 0.036259 0.042578 02:15
5 0.020402 0.034193 01:37
6 0.014485 0.032703 01:37
7 0.003617 0.025697 01:38
8 0.002235 0.024328 01:37
9 0.001495 0.024647 01:37

一些简单的分析:

  1. 多epoch训练由于没有使用数据增强,数据集仅70000条数据,所以过拟合现象不出意外的发生了。
  2. 即使单epoch训练,效果也可以接近达到Kaggle银牌(排名前20%)水准。
  3. 神经网络层数越多确实对性能有一定提升,但是反例ResNet152显示了过大的网络模型,带来了更大的过拟合现象,实际其效果反而比ResNet50稍差。可以观察ResNet152的训练集准确率已经达到了接近99.85%但验证集准确率只达到了97.5%的水平,ResNet50以0.99325分的成绩(1100/6500左右排名)夺得全场最佳。

源码链接:

https://github.com/AshenWithoutFire/Kaggle-FastAI.git

Kaggle X FastAi 手写字识别相关推荐

  1. Pytorch入门练习-kaggle手写字识别神经网络(SNN)实现

    采用pytorch搭建神经网络,解决kaggle平台手写字识别问题. 数据来源:https://www.kaggle.com/competitions/digit-recognizer/data 参考 ...

  2. Pytorch入门练习2-kaggle手写字识别神经网络(CNN)实现

    目录 数据预处理 自定义数据集 构建网络结构 对卷积神经网络进行训练和评估 对数据进行预测 保存预测数据,提交代码 SNN由于无法考虑到图片数据的维度关系,在预测精度上会被限制,本章我们采用CNN卷积 ...

  3. 基于tensorflow的MNIST手写字识别

    一.卷积神经网络模型知识要点卷积卷积 1.卷积 2.池化 3.全连接 4.梯度下降法 5.softmax 本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主要 ...

  4. TensorFlow基于minist数据集实现手写字识别实战的三个模型

    手写字识别 model1:输入层→全连接→输出层softmax model2:输入层→全连接→隐含层→全连接→输出层softmax model3:输入层→卷积层1→卷积层2→全连接→dropout层→ ...

  5. 利用卷积神经网络实现手写字识别

    本文我们介绍一下卷积神经网络,然后基于pytorch实现一个卷积神经网络,并实现手写字识别 卷积神经网络介绍 传统神经网络处理图片问题的不足 让我们先复习一下神经网络的工作流程: 搭建一个神经网络 将 ...

  6. python手写汉字识别_TensorFlow 2.0实践之中文手写字识别

    问题导读: 1.相比于简单minist识别,汉字识别具有哪些难点? 2.如何快速的构建一个OCR网络模型? 3.读取的时候有哪些点需要注意? 4.如何让模型更简单的收敛? 还在玩minist?fash ...

  7. .net 数字转汉字_TensorFlow 2.0 中文手写字识别(汉字OCR)

    TensorFlow 2.0 中文手写字识别(汉字OCR) 在开始之前,必须要说明的是,本教程完全基于TensorFlow2.0 接口编写,请误与其他古老的教程混为一谈,本教程除了手把手教大家完成这个 ...

  8. 在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR)

    在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR) 一.环境的搭建 Windows+1080Ti+Cuda10.1 Tsorflow2.0.0 Numpy1.16.4 注 ...

  9. 利用神经网络实现手写字识别

    神经网络介绍 神经网络即多层感知机 如果不知道感知机的可以看博主之前的文章感知机及Python实现 神经网络实现及手写字识别 关于数据集: 从http://yann.lecun.com/exdb/mn ...

最新文章

  1. 新职业风口已至!人社部宣布这10个职业缺口近千万!
  2. Math对象及相关方法
  3. 【废弃】【WIP】JavaScript 函数
  4. 跨平台 C/C++ memcached 客户端 memcacheclient 介绍
  5. 一些相当不错的php开源 AJAX聊天工具
  6. JSON 解析的两种方法
  7. Luogu P2463 [SDOI2008]Sandy的卡片
  8. maven 编译后无配置文件解决办法
  9. 搭建 zookeeper 和搭建dubbo监控中心
  10. Spring Cloud config之一:分布式配置中心config server介绍
  11. 2008 r2安装总是跳出 server sql_Microsoft SQL Server 2008 R2 安装遇到的问题
  12. donet framework4.X==windows窗体应用新建项目,通过System.Data.SqlClient连接sqlserver进行查询
  13. Unicode(全世界每个国家字符的唯一编码0x000000 到 0x10FFFF)与UTF-8的区别
  14. YIT-CTF—密码学
  15. SecureCRT串口调试工具配置
  16. FFmpeg编码(YUV转H264)并改变视频分辨率示例
  17. 修复VSAN无法看到的主机磁盘
  18. 与“十“俱进 阿里数据库运维10年演进之路
  19. AC自动机+状压dp hdu2825 Wireless Password
  20. python九宫格拼图,Python生成九宫格图片

热门文章

  1. 综合布线技术发展趋势
  2. CiteSpace安装使用简介
  3. HP打印机驱动查找安装以及完成打印
  4. STM32——CAN控制器原理与配置
  5. 超污的23种设计模式
  6. java基础起步(一)
  7. QQ登录报错:redirect uri is illegal(100010)解决方案
  8. 每天穿女装上班的大厂程序员:我知道自己是个男生
  9. picsart下载_PicsArt美易绘画
  10. VS2013 professional版本密钥激活码