随着AI的发展,美国橡树岭国家实验室的一些专家预测,到2040年,AI技能将会强大到足以替代程序员。
AI技能将会强大到足以替代程序员,AI编写软件将比人类程序员更好、更快。
换句话说,软件编写的软件比人类编写的更好。

这个入门级 AI 项目让你一看就会!_数据_汉字 智能写作

这是怎么发生的?AI能真正学会如何做须要高度创造性的智力事情吗?毕竟创造性一贯被认为是人类特有的。
AI能学到的东西会比我们教它的更多吗?

稳住,别慌本日本文将分享一篇AI入门实战的项目履历分享,专门为对付没有动过手的同学准备,以此来启示新手们如何开动,理解AI技能~

1.汉字书法识别入门

前段韶光参加了一次TinyMind举办的汉字书法识别寻衅赛,说是寻衅赛实在便是一场练习赛。
为一些刚刚入门的同学和没有比赛履历的同学供应了一个探索图像识别领域的平台。
我目前是暂列榜首(没想到转眼就被超越了),以是把自己的思路和想法轻微做一个分享,给有须要的人供应一个base line。

先来看数据集~~

100个汉字的演习集

10000张书法图片的测试集

上面的演习集统共有100个汉字,每一个汉字都有400张不同字体的图片,数据量上来看算是一个比较小的数据集。

等等,看到的确定是汉字吗,第一眼望过去我是真的emmmmm......甲骨文,篆体各种字体都冒出来了。
先喝口水镇静一下,仔细看一看创造图片都是gray的。
想了一想溘然以为这个和MNIST并没有太大的差异只是字体更加繁芜一些,可能要用轻微深一点的网络来演习。

图片看完了,那么开始撸代码了。
剖析究竟是剖析,还是实践才能解释统统。

2.数据集划分

竞赛中只给了Train和test,以是须要自己手动划分一个Val来做模型演习的验证测试。
在这里大略解释一下常常用的两种划分数据集的方法。

本地划分;内存划分。

本地划分:图片是按照文件夹分类的,以是只须要从每个文件夹中按Ratio抽取部分图片到val中即可,当然不要忘却了shuffle。

内存划分:把所有图片和标签读进内存中,存为list或者Array然后shuffle后按长度划分。
条件是把数据读进去内存不会爆炸掉。
内存划分只适宜小型数据集,不然会Boom!


注:划分数据集的时候一定要打乱数据,shuffle很主要!


1def move_ratio(data_list, original_str, replace_str):2 for x in data_list:3 fromImage = Image.open(x)4 x = x.replace(original_str, replace_str)5 fromImage.save(x)

注:这里只给出部分代码,文章最下面GitHub有完全链接。

1for d in $(ls datadir); do 2 for f in $(ls datadir/$d | shuf | head -n 100 ); do3 mkdir -p valid_dir/$d/4 mv datadir/$d/$f valid_dir/$d/;5 done;6done

注:这里引用dwSun的Linux Shell脚本,

如果想用大略脚本实现也可以采取他的代码~

模型建立与数据预处理

对付CNN网络来说,大的数据集对应大的演习样本,如果小的数据集想要用深层次的网络来演习的话,那么必不可少的一步便是数据增强。

数据增强的大部分方法,所有深度学习框架都已经封装好了。
这里我采取的是Keras自带的数据增强方法。

1from keras.preprocessing.image import ImageDataGenerator2datagen = ImageDataGenerator(3 # horizontal_flip=True,4 width_shift_range=0.15,5 height_shift_range=0.15,6 rescale=1 / 2557)

由于汉字是具有笔画顺序的,以是做了翻转往后演习的效果不是很好。
这里就做了一个宽度和高度的偏移,由于给的数据集图片长宽不是固定的而且字体的内容也是有长有短。
以是用这两种增强办法可以提高模型的准确率,结果测试这两种办法还是有效的。

数据处理完了,那么下面便是我们可爱的CNN网络模型了

cnn一把梭,嗯,便是干。

1# bn + prelu 2def bn_prelu(x): 3 x = BatchNormalization()(x) 4 x = PReLU()(x) 5 return x 6# build baseline model 7def build_model(out_dims, input_shape=(128, 128, 1)): 8 inputs_dim = Input(input_shape) 9 x = Conv2D(32, (3, 3), strides=(2, 2), padding='valid')(inputs_dim)10 x = bn_prelu(x)11 x = Conv2D(32, (3, 3), strides=(1, 1), padding='valid')(x)12 x = bn_prelu(x)13 x = MaxPool2D(pool_size=(2, 2))(x)14 x = Conv2D(64, (3, 3), strides=(1, 1), padding='valid')(x)15 x = bn_prelu(x)16 x = Conv2D(64, (3, 3), strides=(1, 1), padding='valid')(x)17 x = bn_prelu(x)18 x = MaxPool2D(pool_size=(2, 2))(x)19 x = Conv2D(128, (3, 3), strides=(1, 1), padding='valid')(x)20 x = bn_prelu(x)21 x = MaxPool2D(pool_size=(2, 2))(x)22 x = Conv2D(128, (3, 3), strides=(1, 1), padding='valid')(x)23 x = bn_prelu(x)24 x = AveragePooling2D(pool_size=(2, 2))(x)25 x_flat = Flatten()(x)26 fc1 = Dense(512)(x_flat)27 fc1 = bn_prelu(fc1)28 dp_1 = Dropout(0.3)(fc1)29 fc2 = Dense(out_dims)(dp_1)30 fc2 = Activation('softmax')(fc2)31 model = Model(inputs=inputs_dim, outputs=fc2)32 return model

这里用了6个大略的卷积层,和PRelu+BN层。

下面是一个比较大的模型ResNet50,Merge模型是已经Merge在了Keras的Applications中,可以直接用。
不过须要调度分类层。

1def resnet50_100(feat_dims, out_dims): 2 # resnett50 only have a input_shape=(128, 128, 3), if use resnet we must change 3 # shape at least shape=(197, 197, 1) 4 resnet_base_model = ResNet50(include_top=False, weights=None, input_shape=(128, 128, 1)) 5 # get output of original resnet50 6 x = resnet_base_model.get_layer('avg_pool').output 7 x = Flatten()(x) 8 fc = Dense(feat_dims)(x) 9 x = bn_prelu(fc)10 x = Dropout(0.5)(x)11 x = Dense(out_dims)(x)12 x = Activation(\公众softmax\"大众)(x)13 # buid myself model14 input_shape = resnet_base_model.input15 output_shape = x16 resnet50_100_model = Model(inputs=input_shape, outputs=output_shape)17 return resnet50_100_model

好了,炼丹炉有了接下来便是你懂的。

3.演习模型

演习模型和调参真的是一个技能活,这里我跑了共40个Epoch。
思路只有一个那便是先把Train的数据跑到loss低落并且先过拟合再说。
只要过拟合了后面的统统都好调度了,如果演习数据都不能到过拟合或者99以上那么要仔细想想数据量够不足和模型的选择了。

loss

acc

可以很清楚的看出来,演习数据集已经由拟合了。
我用的优化器是SGD,学习率设置的是lr=0.01。
val_acc可以跑到了0.94旁边,这是一个比较正常的演习水平。
还可以进一步的提高。

4.提高方法

数据增强:采纳其他的数据增强方法进一步扩大演习数据,这里可以采取GAN来天生近似于真实图片的数据。
衰减学习率:当到达一定Epoch的时候,loss不再低落了这个时候可以通过减小学习率的方法进一步演习。
模型领悟:模型领悟的方法在大部分数据集上都会有所提高,这个是最常用的一种竞赛办法。

以上便是我自己做的流程和思路,提交结果和评测的代码写在我的GitHub上面了,有兴趣参加比赛练手的同学可以参考一下。

Github地址:https://github.com/FlyEgle/chinese_font_recognition/

好多小伙伴是从开拓或者是其他工程上转到AI的,以是下面我给有须要的同学列举出一些必要的根本知识点:

数学:线性代数和概率论是必须要会的,而且基本的观点和打算都要懂。
可以把高数,线性代数和概率论看一遍,这里推举李航的统计学习方法。
图像处理:如果是做图像方面的小伙伴,那么须要把冈萨雷斯的图像处理那本巨作看一遍,须要懂基本的图像观点和基本方法。

还有机器学习深度学习经典书、如果能把这几本书完备吃透那也很厉害了,当然学习知识点的路子还有很多。

学习社区;Google;TinyMind。

如果想深入学习的话,我推举还是报名实训营,让更有履历的大咖导师为你指路,效率和效果都会翻倍!

在这里推举CSDN学院出品的《人工智能工程师直通车》实训营,目的是:通过120天的实战,将学员培养达到具备一年项目履历的人工智能工程师水平。
CSDN百天操持课程共分为3个阶段,4个月完成。

联系CSDN学院职场方案师,

获取一对一专属做事(WeChat ID:csdn26)

(包括:IT职场方案做事/专属折扣)

5.为什么报名CSDN学院?

很多学员都曾苦恼,事情中缺少“好师傅”,很多Bug,也都得绞尽脑汁自己办理。
在全栈特训营,这些问题都将不存在。

我们采纳讲师+课程助教的做事模式。

授课的两位老师分别是:中国科学院大学打算机与掌握学院副教授卿来云老师、和打算机视觉领域处理大牛智亮老师。
两位老师一个侧重理论知识、算法推倒;一个侧重实际操作,实战履历,可以全方面的为学员供应知识的讲解。

课程助教将会带领你一起占领项目,Review你的代码并给出见地。
末了,课程助教会带你们一起进行项目末了上线路演,并接管导师的点评。

课程大纲

对付课业完成精良的同学,CSDN学院还将供应名企推举,看到这里,你想不想踩在过来人的肩膀上,轻松实现转型人工智能工程师呢?

不妨添加CSDN学院小姐姐的微信聊一聊吧,报程序人生的粉丝,还将得到千元优惠券哦。

联系CSDN学院职场方案师(WeChat ID:csdn26),

获取一对一专属做事

(包括:IT职场方案做事/专属折扣)

末了,祝愿所有的朋友能学有所成~