人工智能浅学
前言
寒假在家无聊,发现自己对人工智能这块儿实在是没有太多的接触,因此找了几天集中入了个门,这里记录一些自己的快速入门路线,主要涉及神经网络这块儿的内容。
一些很好的参考资料
花书,动手学深度学习,链接https://zh-v2.d2l.ai,里面可以下载到代码和ipynb的文件,这里面有个d2l的python包,我这里一直导入错误。然后我直接把d2l源码拿出来放到目录里导入,因为这玩意儿一共也就四个文件,分别对应pytorch、tensorflow等包,我用的pytorch,所以直接把d2l中关于pytorch的一个包拿出来即可使用。
花书想啃完还是比较困难的,适合日以继日坚持地看,像我这种想速成一下基础的,还是放弃了。感觉比起一个人单独看,也可以看些教学视频一起跟进,效果会比较好,比如李沐这种,b站也都有链接。
吴恩达老师的深度学习视频,b站有很多,我看的是这一版https://www.bilibili.com/video/BV16r4y1Y7jv,配套的笔记在https://github.com/fengdu78/deeplearning_ai_books上,本来是有作业题的,但因为版权问题被取消了
(但git历史的链接好像没失效),这一套比较注重基础,如果没啥基础硬啃,也还是比较困难。《20天吃掉那只Pytorch》和《30天吃掉那只TensorFlow2》。这也是很不错的教程,面向深度学习开发工具,每天花上一些时间,日积月累可以有很大成效。
各类机构教学视频,如黑马。这种在b站上诸如“最完整的深度学习”、“x小时学会深度学习”、“不会还有人没看…”等教学视频比比皆是。有些讲的还是可以的,毕竟机构是要赚钱的,内容比较杂,可能需要有针对性地去选择某一讲某一P的内容。
github的各种小仓库demo,比如我想找一个pytorch实现的mnist的gan对抗网络,就可以在github上搜索有没有人写过类似的可以借鉴参考。
我的路线
由于博主之前在一个项目里写过数据集相关代码,因此对于Pytorch的Dataset写法比较熟悉,在之前毫无基础的时候也看过一段时间吴恩达老师的教学视频,同时对一些简单的神经网络也知道概念,因此我针对我本身不太了解的内容进行调研和深入。
Pytorch基本流程
我是在朋友的推荐下看的这个视频进行学习【二十分钟搭建神经网络分类Fashion-MNIST数据集时尚物品】,并且有直接可以运行的github代码:https://github.com/TommyZihao/zihaopytorch,通过仔细分析这个简单demo,可以对pytorch的深度学习框架有一个初步的了解。
卷积神经网络
在了解了基本的Linear层后,可以对卷积神经网络进行初步了解,主要是了解nn.Conv2d
卷积和nn.MaxPool2d
池化的这两个概念,并且要知道图像进入这两个函数后的形态变化,以及在Pytorch中的实现,下面是一个非常简单的demo。
1 | class Net(nn.Module): |
构造数据集
前面使用的都是MNIST数据集,可以直接通过torchvision.datasets.MNIST()
函数进行下载,但是我们更得学会自己构造数据集,即去继承torch.utils.data.dataset.Dataset
类,并且实现这个类的三个函数(__init__
、__getitem__
和__len__
),然后使用 torch.utils.data.DataLoader()
构造Loader,在训练时直接迭代即可,下面是一个甲骨文识别的示例数据集。
1 | class ImageDataset(dataset.Dataset): |
练手项目
这里的练手项目指从搭建数据集、构建网络、调整参数训练、保存模型、使用模型的一整套流程。我使用的是一套甲骨文识别的练手项目(其实和手写数字分类差不多),使用卷积层和全连接层,划分了0.9和0.1的训练集和测试集。由于样本比较少,最后只达到了59%的准确率,数据集的写法如上面所示。这里贴一下网络的构造。
1 | class OracleRecognize(nn.Module): |
更进一步
在这之后,对最基本的网络已经有了解,接下来我的计划是对目前流行的网络进行学习。如RNN、LSTM、GAN等等,在数据集的使用上尽量采用MNIST这种比较简单的。
这是一个关于logistic、cnn、mlp、rnn、svm、knn等模型的github仓库,里面写了各种网络的MNIST数据集demo,有用的应该就rnn、svm和knn这三个,svm和knn虽然不属于神经网络,但也是人工智能的重要算法之一,可以进行学习。
情感分类
在bert出现之前,我们采用的是分词向量的方式。以IMDB数据集为例,可以从torchtext.datasets
中导入IMDB
数据集,它是一个二分类的电影评论数据集,对于每句评论,首先将其分词,然后将所有评论的分词结果合并成一个大的集合,即词表。生成词表时可以设置单词的出现频率高于某个阈值才放入。
1 | from torchtext.datasets import IMDB |
在处理每个batch
时,需要对每个评论进行分词,使用的是同一个分词器,即上述代码中的tokenizer
。
假设这里batch=64
,传进来64*2的列表,即(comment, index) * 64
,对每个comment分词后,假设分词数量最多的是max_length
,将其将comment维度转换为2维张量,即64 * max_length
,其中分词数不满max_length
的用0补齐。
分词后得到的是一个个单词,在词表中查找该单词的index替换,最后再传出去。
1 | def collate_fn(batch): |
在网络中需要先定义一个nn.Embedding
词表,将每个分词转换为向量,向量的长度embed_dim
可以自行指定,这会将(batchsize, max_seq_len)
扩大一维为(batchsize, max_seq_len, embed_dim)
,这里列举一个最简单的embeddingbag+DNN。
1 | class TextClassificationModel(nn.Module): |
GAN对抗网络
GAN包含有两个模型,一个是生成模型(Generative Model),一个是判别模型(Discriminative Model)。生成模型的任务是生成看起来自然真实的、和原始数据相似的实例。判别模型的任务是判断给定的实例看起来是自然真实的还是人为伪造的(真实实例来源于数据集,伪造实例来源于生成模型)。
提出GAN的论文中有这样的一个公式(懒得Latex再打一遍),其中G和D分别是生成模型和判别模型。
一样的,还是用最简单的MNIST数据集体会一下其精髓,这是判别器和生成器的代码:
1 | # 输入是长度为 100 的噪声(正态分布随机数) |
1 | # 输入是 28x28 的图片,输出为二分类的概率值,输出使用sigmoid函数激活0-1 |
这是训练过程的部分代码,后续我会整理完放github
1 | # 训练判别器 |
这是练了100次后的对比图,效果并不是很好,因为还需要有很多的技巧来优化如GCGAN和ConditionGAN,我并没有深入研究。
强化学习
有待填坑、、
总结
AI领域现在大热,得会一些基础的知识,有机会读研的话继续深造。