这是国科大NLP第一次大作业自写代码,请勿抄袭!
自然语言处理 第一次实验报告
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"
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"
reshape (Reshape) (None, 256, 768) 0
simple_rnn (SimpleRNN) (None, 32) 25632
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函数的时候更加地游刃有余。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。