赞
踩
该篇文档基于kaggle course[1],通过简单的理论介绍、程序代码、运行图以及动画等来帮助大家入门深度学习,既然是入门,所以没有太多模型推导以及高级技巧相关,都是深度学习中最基础的内容,希望大家看过之后可以自己动手基于Tensorflow或者Keras搭建一个处理回归或者分类问题的简单的神经网络模型,并通过dropout等手段优化模型结果;
每部分都有对应的练习,练习都是很有针对性的,而且都很有趣,尤其是一些练习中都写好了动画的可视化展示,还是很有心的;
目录:
•概述•线性模型:单神经元•非线性模型:深度神经网络•模型训练:随机梯度下降•验证模型:过拟合和欠拟合•提升性能:Dropout和Batch Normalization•分类问题
经过本篇文章,你将搭建自己的深度神经网络,使用Keras和Tensorflow,创建全连接神经网络,在分类和回归问题上应用神经网络,通过随机梯度下降训练网络、通过dropout等技术提升模型性能;
近些年在AI方面的主要发展都在深度学习,尤其是应用于自然语言处理、图像识别、游戏AI等领域,深度学习能得到更接近于人类的结果;
深度学习是一种允许大量深度计算为特征的机器学习方法,深度计算使得深度学习模型可以理解真实世界数据中的复杂和高维的信息模式,比如这句话的含义是什么、这张图中的人在干嘛等等;
通过这种优势和灵活性,神经网络成为深度学习的定义模型,神经网络由神经元组成,每个神经元单独看只是一个简单的计算单元,神经网络的能力来自于许多神经元之间的复杂的组合模式;
只有一个输入的线性单元对应公式如下:
y = w*x+b
x
为输入,神经元连接的权重为w
,w
的更新就是神经网络学习的过程,b
为偏差,它与输入没有关系,偏差允许神经元不依赖输入来修改输出,y
是神经元的输出,即公式y=w*x+b
的结果;
神经元通常作为神经网络的一部分,往往也会将一个单独的神经元模型作为基准模型,单神经元模型是线性模型;
假设我们使用糖分
作为输入训练模型,卡路里
作为输出,假设偏差b
为90,权重w
为2.5,当糖分
为5时,卡路里
为2.5*5+90=102.5
;
当我们期望使用多个输入而不是一个时,其实就是将多个输入连接并神经元,计算每个连接权重,并全部加起来得到最终输出,如下:
y = w_0x_0 + w_1x_1 + w_2*x_2 + b
上述公式使用了三个输入,并分别对应各自的连接权重,从输入维度上看,单个输入拟合一条直线,两个输入你和一个平面,多个输入拟合的则是超平面;
最简单的创建线性单元模型是通过keras.Sequential
,可以通过dense层来创建上述提到的线性单元模型,对于一个有三个输入,一个输出的线性模型,Keras创建方式如下:
from tensorflow import kerasfrom tensorflow.keras import layers# Create a network with 1 linear unitmodel = keras.Sequential([ layers.Dense(units=1, input_shape=[3])])
其中units
为1表示该层只有一个输出,input_shape
为[3]则表示有3个输入,之所以参数是个列表[],这是因为在图像领域可能需要三维输入,比如[高度,宽度,通道];
可以通过这个notebook[2]来进行这部分的练习,里面包含了如何通过keras搭建线性单元的神经元模型,并通过其weights属性来查看模型的连接权重和偏差,最后还有一个未训练的模型在预测中的表现,可以看到其随机权重在每次运行结果都不一样;
典型的神经网络通过层来组织他们的神经元,当我们把线性单元整理到一起时,我们就得到了一个dense层,神经网络通过叠加dense层来将输入以越来越复杂的方式进行转换,在一个训练好的神经网络模型,每一层都会将输入转换的更接近结果一点;
激活函数作用于层的输出,最常用的是整流函数max(0,x),纠正函数将负部分处理为0,当我们将整流函数应用于一个线性单元时,也就得到了ReLU,而之前的线性公式:
y=w*x+b
也变成了:
y = max(0, w*x+b)
可以看到,函数也从线性转为了非线性,整流函数图像如下:
输出层之前通常有一些隐含层,一般我们不能直接看到他们的输出(因为他们的输出并不是最后输出,而是作为下一层的输入,因此无法直接看到),注意当处理回归问题时,最后一层也就是输出层是线性单元,也就是没有应用激活函数,当我们要处理分类或者其他问题时,仍然需要对应的激活函数;
通过keras.Sequential
创建多层神经网络方式很简单,只要从第一层到最后一层依次通过layer
定义即可,第一层获取输入,最后一层产生输出,代码如下:
from tensorflow.keras import layersmodel = keras.Sequential([ # the hidden ReLU layers layers.Dense(units=4, activation='relu', input_shape=[2]), layers.Dense(units=3, activation='relu'), # the linear output layer layers.Dense(units=1),])
其中各个layer
表示各个堆叠的网络层,activation
表示各个层的激活函数,可以看到最后一层是没有的,这是因为它处理的是回归问题,且最后一层输出只有一个,而其他层则不一定;
你可以通过这个notebook[3]来进行这部分练习,其中包含如何通过keras.Sequential
搭建
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。