Kaggle X FastAi 手写字识别
原始数据
数据这方面,Kaggle给出的是csv文件,0列表示的是标签,其他28*28列是每个像素的值,而FastAi在设计的时候是没有考虑这种数据的,所以DataLoaders和learner都是不支持该类型的数据的。某些文章的做法是重写DataLoaders和learner的Model,但是个人观点,这样的话直接用Torch不是更好的选择么。FasterAi的API那么用是一定要用的,而数据都是像素值也不必要特殊的预处理,所以生成数据就完事了。
数据生成
采用了PIL.Image中的方法,配合os的文件方法,主要生成思路:
- pandas读取像素值数据,转换为28*28的ndarray
- 按序号生成图片名称,形如0.png,将训练集的图片放至命名为label(0-9)的文件夹。
- 将测试集图片放入任意文件夹。
代码如下:
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中的源码阅读及踩坑记录。
主要步骤如下:
- 将所有的测试集的途径组合成一个List,List中的对象为Path对象。
- 使用laerner.test_dl()方法将上面的List转换为dl
- 使用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 |
一些简单的分析:
- 多epoch训练由于没有使用数据增强,数据集仅70000条数据,所以过拟合现象不出意外的发生了。
- 即使单epoch训练,效果也可以接近达到Kaggle银牌(排名前20%)水准。
- 神经网络层数越多确实对性能有一定提升,但是反例ResNet152显示了过大的网络模型,带来了更大的过拟合现象,实际其效果反而比ResNet50稍差。可以观察ResNet152的训练集准确率已经达到了接近99.85%但验证集准确率只达到了97.5%的水平,ResNet50以0.99325分的成绩(1100/6500左右排名)夺得全场最佳。
源码链接:
https://github.com/AshenWithoutFire/Kaggle-FastAI.git
Kaggle X FastAi 手写字识别相关推荐
- Pytorch入门练习-kaggle手写字识别神经网络(SNN)实现
采用pytorch搭建神经网络,解决kaggle平台手写字识别问题. 数据来源:https://www.kaggle.com/competitions/digit-recognizer/data 参考 ...
- Pytorch入门练习2-kaggle手写字识别神经网络(CNN)实现
目录 数据预处理 自定义数据集 构建网络结构 对卷积神经网络进行训练和评估 对数据进行预测 保存预测数据,提交代码 SNN由于无法考虑到图片数据的维度关系,在预测精度上会被限制,本章我们采用CNN卷积 ...
- 基于tensorflow的MNIST手写字识别
一.卷积神经网络模型知识要点卷积卷积 1.卷积 2.池化 3.全连接 4.梯度下降法 5.softmax 本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主要 ...
- TensorFlow基于minist数据集实现手写字识别实战的三个模型
手写字识别 model1:输入层→全连接→输出层softmax model2:输入层→全连接→隐含层→全连接→输出层softmax model3:输入层→卷积层1→卷积层2→全连接→dropout层→ ...
- 利用卷积神经网络实现手写字识别
本文我们介绍一下卷积神经网络,然后基于pytorch实现一个卷积神经网络,并实现手写字识别 卷积神经网络介绍 传统神经网络处理图片问题的不足 让我们先复习一下神经网络的工作流程: 搭建一个神经网络 将 ...
- python手写汉字识别_TensorFlow 2.0实践之中文手写字识别
问题导读: 1.相比于简单minist识别,汉字识别具有哪些难点? 2.如何快速的构建一个OCR网络模型? 3.读取的时候有哪些点需要注意? 4.如何让模型更简单的收敛? 还在玩minist?fash ...
- .net 数字转汉字_TensorFlow 2.0 中文手写字识别(汉字OCR)
TensorFlow 2.0 中文手写字识别(汉字OCR) 在开始之前,必须要说明的是,本教程完全基于TensorFlow2.0 接口编写,请误与其他古老的教程混为一谈,本教程除了手把手教大家完成这个 ...
- 在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR)
在Windows上调试TensorFlow 2.0 中文手写字识别(汉字OCR) 一.环境的搭建 Windows+1080Ti+Cuda10.1 Tsorflow2.0.0 Numpy1.16.4 注 ...
- 利用神经网络实现手写字识别
神经网络介绍 神经网络即多层感知机 如果不知道感知机的可以看博主之前的文章感知机及Python实现 神经网络实现及手写字识别 关于数据集: 从http://yann.lecun.com/exdb/mn ...
最新文章
- 新职业风口已至!人社部宣布这10个职业缺口近千万!
- Math对象及相关方法
- 【废弃】【WIP】JavaScript 函数
- 跨平台 C/C++ memcached 客户端 memcacheclient 介绍
- 一些相当不错的php开源 AJAX聊天工具
- JSON 解析的两种方法
- Luogu P2463 [SDOI2008]Sandy的卡片
- maven 编译后无配置文件解决办法
- 搭建 zookeeper 和搭建dubbo监控中心
- Spring Cloud config之一:分布式配置中心config server介绍
- 2008 r2安装总是跳出 server sql_Microsoft SQL Server 2008 R2 安装遇到的问题
- donet framework4.X==windows窗体应用新建项目,通过System.Data.SqlClient连接sqlserver进行查询
- Unicode(全世界每个国家字符的唯一编码0x000000 到 0x10FFFF)与UTF-8的区别
- YIT-CTF—密码学
- SecureCRT串口调试工具配置
- FFmpeg编码(YUV转H264)并改变视频分辨率示例
- 修复VSAN无法看到的主机磁盘
- 与“十“俱进 阿里数据库运维10年演进之路
- AC自动机+状压dp hdu2825 Wireless Password
- python九宫格拼图,Python生成九宫格图片