2 Star 0 Fork 0

最近......的Ender / dogandcat

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

这是国科大NLP第一次大作业自写代码,请勿抄袭!

自然语言处理 第一次实验报告

  1. 实验要求 本次实验要求任选一个机器学习或深度学习框架,实现一个分别基于三种模型:深度神经网络(Deep Neural Network, DNN),卷积神经网络(Convolutional Neural Network, CNN)和循环神经网络(Recurrent Neural Network, RNN)的猫狗图像分类模型。
  2. 实验设置 本次实验设置如下: 2.1 实验硬件设置 本次实验的硬件设置如下: 硬件名称 硬件参数 CPU Intel Core-i7 10750H 内存 16GB DDR4 显卡 Nvidia Geforce GTX 1650ti 硬盘 512GB SSD+ 1TB SSD 2.2 实验软件设置 本次实验的软件设置如下: 环境名称 软件版本 IDE Pycharm 2021.3 机器学习框架 Tensorflow-gpu 2.1.0,keras前端 科学计算工具 Numpy 1.19.2 2.3 实验数据集设置 本次实验的数据集采用了kaggle数据竞赛的猫狗图像分类数据集,其中训练集包括了百度网盘中的完整kaggle数据集中前20000张图片,其中包括10000张猫图和10000张狗图;测试集包括了百度网盘中的完整kaggle数据集中后5000张图片,其中包括了2500张猫图和2500张狗图,数据集构成如下所示: Cat Dog·· 训练集 10000 10000 测试集 2500 2500 我们将数据集导入到Tensorflow中后将数据集按顺序进行了shuffle、repeat、batch三步骤,最后形成了不易过拟合的Tensorflow数据集结构。其中batch size为32。 2.4 实验模型设置 在本次实验中,我们设置了三个模型:DNN、CNN和RNN模型,各模型的具体超参数设置如下所示: DNN: Model: "sequential"

Layer (type) Output Shape Param #

flatten (Flatten) (None, 196608) 0


dense (Dense) (None, 512) 100663808


dense_1 (Dense) (None, 256) 131328


dense_2 (Dense) (None, 128) 32896


dense_3 (Dense) (None, 1) 129

Total params: 100,828,161 Trainable params: 100,828,161 Non-trainable params: 0

CNN: Model: "sequential_1"

Layer (type) Output Shape Param #

conv2d (Conv2D) (None, 254, 254, 32) 896


max_pooling2d (MaxPooling2D) (None, 127, 127, 32) 0


conv2d_1 (Conv2D) (None, 125, 125, 64) 18496


max_pooling2d_1 (MaxPooling2 (None, 62, 62, 64) 0


conv2d_2 (Conv2D) (None, 60, 60, 64) 36928


flatten_1 (Flatten) (None, 230400) 0


dense_4 (Dense) (None, 128) 29491328


dense_5 (Dense) (None, 1) 129

Total params: 29,547,777 Trainable params: 29,547,777 Non-trainable params: 0

RNN:

Model: "sequential_2"


Layer (type) Output Shape Param #

reshape (Reshape) (None, 256, 768) 0


simple_rnn (SimpleRNN) (None, 32) 25632


dense_6 (Dense) (None, 1) 33

Total params: 25,665 Trainable params: 25,665 Non-trainable params: 0 三个模型的epoch次数为2,模型采用总体准确率和各类别准确率作为总体指标,使用的optimizer为Adam函数,使用的损失函数为binary交叉熵。 3. 实验结果 实验结果如下所示:

我们将图中的数据做成表格,如下所示:
Loss	Total accuracy	Dog accuracy	Cat accuracy

DNN 0.657 60.15% 71.12% 49.05% CNN 0.586 69.62% 52.92% 86.01% RNN 0.684 54.87% 85.11% 24.32%

其中可以看出,DNN和RNN的预测总体正确率相差无几,但是在具体的类别准确率上却差距很大,这可能是因为初始参数设置是随机的,再加上数据集也经过了shuffle导致的;而CNN的预测准确率和损失值却相对来说较高,尤其是再区分猫类别的accuracy非常高,达到了86.01%的程度 4. 总结与感悟 在本次实验中,我遇到了如下问题: 1) 在数据预处理过程中,我错误设置了label,而且因为python语言的脚本特性,我并没有检测出来,这导致了一开始我的模型准确率达到了100%,这很明显存在问题,最后我经过了检查,发现了我在设置label时将所有的label都设置为了0,也就是我将所有类别都设置为了一个类别,无论是猫还是狗,在学习过程中模型也自然发现了这一点,导致参数都向0的方向发展,最后导致了问题; 2) 在编写自定义metric函数的时候我遇到了一些问题。开发自定义metric函数是为了能够显示每一个类别的准确率,但是我在编写的过程中我发现metric函数的输入值都是Tensor,而Tensor转换为numpy数组非常麻烦,于是我便利用keras.backend库中的函数对Tensor直接进行处理,但是Tensor禁止进行很多直接的操作,例如直接进行加减或者直接进行类型转换等。这耗费了我很长的时间。 在本次实验中,我也有很多的感悟: 1) 虽然是利用python进行编程,但是适当的注释仍然非常必要。我本科是软件工程专业的,我们专业的课程内容要求我们学习了很多设计模式、软件架构等的知识。在进行这个实验的时候,我仍然按照正确的PEP格式进行代码的编写,这使得我的代码按照模块进行了分割,看上去非常干净。而且我对每个函数都进行输入参数和返回值的注释,使得Python的动态特性稍微偏向于“静态化”,这使得我在编写完函数后在使用该函数时能够使得Pycharm识别我是否正确了使用该函数,我的输入参数和输出参数是否正确。这使得我减少了很多debug的时间。我也针对每个函数进行了代码注释,写明了每个函数的参数作用和返回值,在函数内部我也针对可能难以理解的代码进行了行注释,加强了可理解性; 2) 在这次实验结束后,我对Tensorflow和keras的理解能力也增加了。我认为在Keras为前端的Tensorflow更加易于开发,尤其是模型创建部分,利用Keras Sequential模型就可以轻松建立起一个模型。这极大地增加了我创建模型的速度。同时,Keras也提供了很多Tensorflow函数的封装,这也极大增加了我对Tensorflow的函数的理解,因为Keras在封装的同时也会在源码部分写下很多相关的解释; 3) 本次实验也增加了我对课堂上关于模型参数、模型类型等的理解。例如我使用Tensorflow中提供的SimpleRNN函数时,一开始我直接输入了图像Tensor,它却进行了报错,后面我查看源码时才发现SimpleRNN只接受[batch, timestep, size]类型的张量,而batch_size因为我一开始已经提供,所以只能输入二维张量,但是我缺输入了三维张量,这就导致了问题。我在课堂上学习RNN时并未能特别理解RNN函数的意义,但是在开发完整个模型后我就突然理解了很多RNN相关的内容。再例如我在进行模型编译的时候我使用了Adam optimizer,我后来去查看keras API文档时发现keras提供了非常多的optimizer,包括RMSprop、Adamgrad、SGD、Ftrl、Nadam等,我才发现原来可选的optimizer竟然能够这么多,我随后也一个一个去了解这些optimizer的意义和作用,以及optimizer可选的learning rate等参数,我才深刻理解了原来optimizer的可选参数都是这些意思,这也极大充实了我在课堂上学到的机器学习相关知识。 4) 在编写自定义metric的时候,我感觉我对metric的理解也增加了。我发现其实准确率、precision、recall等数值都是在利用混淆矩阵做文章,通过不断等去对比label之间的差距来达到评估模型效果的作用。这次编写metric让我以后再进行编写metric函数的时候更加地游刃有余。

空文件

简介

This is the first homework of NLP class in UCAS 展开 收起
Python
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/enderbyendera/dogandcat.git
git@gitee.com:enderbyendera/dogandcat.git
enderbyendera
dogandcat
dogandcat
master

搜索帮助