从入门python到搭建神经网络

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/plusli/article/details/100061887

为了加深对机器学习的理解,我通过Tensorflow和Keras搭建了一些简单的神经网络模型。在这个过程中,对获取数据、数据预处理、模型训练、模型评估环节也有了更完整的理解。

一、学习路径

学习机器学习—>入门Python—> 入门tensorflow、keras搭建模型

1.在开始搭建模型之前,我已经二刷了李宏毅的机器学习视频,做学习笔记整理的时候又挑重点的进行了三刷。并阅读了相关书籍和AI技术通识类型文章。
2.入门Python,主要是熟悉语法,能看懂代码讲什么。网上有很多大牛分享python的学习视频,我选的是小甲鱼的视频。除了看视频,我还认真地做了课后题目,做题能对语法掌握更快。
3.机器学习的开发平台很多,我选择了入门tensorflow和keras。学习视频用的是莫烦的入门教程,视频录制的时间比较久了,tensorflow也迭代了不少版本,所以我还结合了新版本的代码来学习。至于keras,是对tensorflow或theano做进一步封装,相对简单些。

二、实现的模型

我搭建的几个Demo都是解决回归和分类问题。其中实现的算法有:简单的线性回归模型、浅层神经网络、CNN、RNN算法中的SimpleRNN和LSTM。同时,也使用了可视化工具展示训练过程和结果。

任务 案例 实现的算法
回归 预测一个线性函数 线性回归模型
- 预测一个一元二次函数 浅层神经网络
- 使用sin曲线预测cos曲线 LSTM
分类 手写数字识别 浅层神经网络
CNN
SimpleRNN

以下是部分结果展示:
1.预测一元二次函数 y=x^2-0.5

2.CNN实现手字数字识别

3.LSTM预测cos函数

三、搭建模型的总结

通过机器学习算法解决简单的回归、分类问题,也让我有了些收获,如基本概念、理解算法模型、初探工程实践等。下面我主要总结了机器学习的流程、模型过拟合的解决方法、可视化工具的使用、CNN/RNN的结构等。

1.机器学习的流程

1)数据采集:在搭建Demo中,回归问题使用的数据是使用numpy库生成的随机数据,手写数字识别的分类问题是Tensorflow和keras的MNIST数据包。(tip:在随机生成的数据中加入噪声来训练可提高模型的鲁棒性)

2)数据预处理:主要做数据归一化。例如使用RNN做手写数字识别时,需要先将输入图片X的数值除以255,使它的数值在0~1之间。另外,还需要将数据分成训练集和测试集。实践中需要做交叉验证,会把训练数据分成两组:用于训练模型的训练集和开发过程用于调参的验证集。具体操作是把模型在训练集训练好后,再用验证集来训练,选出比较好的模型。最后提交时再用全量训练集训练。

扫描二维码关注公众号,回复: 7566843 查看本文章

3)搭建模型(构建神经网络结构):

  • 选定一个模型,可以理解成定义一组函数。比如线性回归模型就是一组y=wx+b函数(w,b是任意值)我们需要机器做的就是找出最佳的w,b能让这个函数拟合目前已有的数据,并希望在新的数据上也有好的表现。同样,神经网络模型也可以看作找一个函数,在代码中定义结构的每个部件。
  • 让机器可以去判断函数的好坏。主要通过设置损失函数来判断,损失函数有:均方误差MSE、交叉熵Cross Entropy等。
  • 让机器可以挑出最好的函数。即找到一种优化方法可以使得误差最小。案例中使用到的优化器有:梯度下降、SGD、RMSprop、Adam,Tensorflow和Keras中还支持Momentum、Adagrad、Adadealtd、NAG、Adamax、Nadam等。在代码实现中导入优化器模块,然后设置优化器Optimizer=’’,直接调用就行。

4)训练模型并输出结果:神经网络建立好后,接下来可以拿数据去训练了。训练过程就是为了找到最优的参数。同时可以将训练和测试的结果打印出来,如输出训练或者测试的loss和accuracy。

5)模型评估:根据训练后输出的结果,我们可以看到模型的质量。如果模型在训练集中表现的不好,如误差太大,可以判断模型为欠拟合; 模型在训练集中表现得好,而在测试集中表现不好的,可以判断为过拟合。

6)模型调优:对模型评估后,需要通过一些手段对训练过程进行优化。

2.模型的泛化能力

泛化能力就是模型对未知数据的预测能力,通常通过测试误差来评价学习方法的泛化能力,包括过拟合和欠拟合。

在模型实现的过程中,我会尝试用不同的方法(如更换不同激活函数、损失函数、优化方法、学习率调整方法,增删隐藏层等),调整参数(如学习速率,batch_size, epochs,units,dropout rate等)去看误差结果和准确率,有时候结果会跑坏了,有时候会跑出还不错的结果,但最重要的是有了更直观的感受。以下是对常见欠拟合和过拟合的一些解决方法整理。

欠拟合的解决方法:
1)调整学习速率,可以调整理超参数,或者使用Adagrad、RMSProp、Adam方法等。
2)更换激活函数,比如使用Sigmoid容易出现梯度消失问题,可以尝试ReLU、Maxout。我在创建Demo时也尝试用不同的激活函数去运行,一般ReLU表现更好。
3)选择更适合的损失函数,如逻辑回归中如果使用均方误差函数不容易有好的结果,可改用交叉熵。
4)设置mini-batch,通常比没有设置batch表现要好

过拟合的解决方法:
1)在损失函数上加上正则化项
2)使用Dropout,这是对具有深度结构的神经网络进行优化的方法
3)早停法Early stopping
4)设计神经网络结构。如在手写数字分类问题上,使用只有一层神经网络运行出来的准确率是87%,使用CNN结果是93%

3.使用Dropout的表现

Dropout是解决深度神经网络的过拟合问题的方法之一。Dropput的精神是在于每次更新参数之前,神经元都有p%(可自行设置)的概率被舍弃,神经元舍弃的同时,与之相关的权重W就会变为0。这样神经网络结构会变得更瘦了。但需要注意的是,在测试时神经元是不被dropout的。

下图,是在神经网络加上dropout层后,训练和测试的loss曲线基本上很接近了(蓝色线是train,红色线是test)

下图,是没有加dropout层与加了dropout层的区别。红色线是没有使用dropout层的loss,蓝色线是加了dropout层loss表现。

4.可视化工具学习

1.画图库matplotlib
通过matplotlib来画出训练过程中一些数据的变化,可以更直观地观察数据特征和训练过程。上面右图中的dropout loss和overfitting loss就是通过matplotlib来实现的,可以每隔x次训练刷新一次,实现动态展示的效果。

2.学习了使用tensorflow的tensorboard工具去了解神经网络的训练过程。Tenboard可以将训练过程中的各类数据(例如神经网络结构、张量、激励函数、损失函数、神经元结构等)生成一个文件然后保存到自定义的路径,打开终端输入tensorboard --logdir加上路径(加路径方法:直接找到生成文件所在的文件夹,把文件夹拖拽到终端),然后回车即可显示网址。再通过浏览器打开就能可视化地展现这些信息。可视化的工具,可以使产品经理能针对模型训练的效果与开发进行沟通。


5.一些神经网络结构
通过本次创建模型来实现一些简单回归和分类问题,也加深了对CNN和RNN的结构理解

1)CNN的整体框架

CNN的典型结构是:卷积层—>池化层—>flatten—>全连接神经网络—>输出层(分类器)
Keras的代码实现上,是按顺序添加每一层,做每一层的参数设置。比如:卷积层需要设置的信息有:输入的形状(例如:1维的像素是28x28),卷积核数量,卷积核大小,步长,padding(例如:padding=same 意味着卷积后长宽不变,还是28x28,这种方式也叫zero padding)等

2)RNN
RNN可以理解为一个有记忆功能的深度神经网络。它可以记忆前序输入对隐层的影响,并用在当前输出的计算中,相当于建立了当前输入与过去输入之间的关联关系。RNN常应用在自然语言处理中。

Tensorflow和Keras支持的RNN主要有:LSTM、GRU、SimpleRNN

  • 普通递神经网络都有由重复模块组成的链式结构,这个模块通常是一个非常简单的结构,如一个双曲正切函数tanh
  • LSTM的重复模块比标准RNN的要复杂得多。LSTM的模块有四个部分:输入门、输出门、遗忘门、记忆Cell。其中,遗忘门的设计可以避免梯度消失问题的出现。为了避免梯度特别小,可以把学习率设小点。这次Demo中学习率设置为0.006。
  • GRU也可以操作记忆Cell,但只有两个门:输入门、输出门。

使用LSTM的任务是使用sin函数预测cos函数,也就是说输入的序列是sin函数,前序隐层输出是cos函数。如果预测值最后也呈cos函数时,表现机器经过训练发现规律,完成学习。

下面是tensorboard工具可视化的LSTM结构的主图:

四、遇到的问题

1.在刚开始使用tensorflow搭建神经网络时还是遇到不少bug,根据提示的error类型去查看问题,作为初学者还能改改明显的语法错误。但很多情况都得去百度,网上有不少人也有遇到同类问题的,所以基本上问题不会卡很久。
2.使用tensorboard可视化时,也是花了挺长时间,根据视频的操作方法拿到的地址总是打开没有图。当然最后也是解决了,具体方法我上面有写。
3.keras下载MNIST时总是报错,原以为是网速慢下载失败,手动下载了几次还是不行。最后才发现是SSL证书的问题。

以上是我从入门python到创建神经网络Demo过程的整理和总结。

写在最后

作为一名产品经理,我希望通过了解常见机器学习的开发平台的功能和工具,并自己搭建简单模型,可以让我在真正参与实践时,能更好地跟开发人员沟通。接下来,我将从AI应用领域出发,做目标领域的行业、场景、技术分析。转型AIPM的过程也许不完美,但学会犯错就是第一步,希望在行动中不断完善。

猜你喜欢

转载自blog.csdn.net/plusli/article/details/100061887
今日推荐