实现激活功能
准备
当我们开始使用神经网络时,我们会定期使用激活函数,因为激活函数是任何神经网络的强制性部分。 激活功能的目标是调整重量和偏差。 在TensorFlow中,激活函数是对张量起作用的非线性运算。 它们是以类似于以前的数学运算的方式运行的函数。 激活函数有很多用途,但是一些主要的概念是在标准化输出的同时,它们将非线性引入到图中。 使用以下命令启动TensorFlow图形:
import tensorflow as tf sess = tf.Session()
如何做
激活函数位于TensorFlow中的神经网络(nn)库中。 除了使用内置的激活功能外,我们还可以使用TensorFlow操作来设计我们自己的激活功能。 我们可以导入预定义的激活函数(将tensorflow.nn导入为nn)或者在函数调用中显式地写入.nn。 在这里,我们选择明确每个函数调用:
1.被称为ReLU的整流线性单元是将非线性引入到神经网络中的最普遍和最基本的方式。 这个函数只是max(0,x)。 这是连续的,但不平稳。 它显示如下:
print(sess.run(tf.nn.relu([-3., 3., 10.]))) [ 0. 3. 10.]
2.有时我们希望限制前面的ReLU激活函数的线性递增部分。 我们可以通过将max(0,x)函数嵌套到min()函数中来实现。 TensorFlow的实现被称为ReLU6函数。 这被定义为min(max(0,x),6)。 这是hard-sigmoid函数的一个版本,计算速度更快,不会受到消失(无限小近零)或爆炸值的影响。 当我们在第8章卷积神经网络和第9章递归神经网络中讨论更深的神经网络时,这将会派上用场。 它显示如下:
print(sess.run(tf.nn.relu6([-3., 3., 10.]))) [ 0. 3. 6.]
3.Sigmoid函数是最常见的连续平滑激活函数。 它也被称为逻辑函数,具有1 /(1 + exp(-x))的形式。 由于在训练期间倾向于将反向传播项归零,所以不常使用S形。 它显示如下:
print(sess.run(tf.nn.sigmoid([-1., 0., 1.]))) [ 0.26894143 0.5 0.7310586 ]
我们应该知道一些激活函数不是零中心的,例如S形。 这将要求我们在大多数计算图算法中使用数据之前将数据置零。
4.另一个平滑的激活函数是超切线。 超切线函数与sigmoid非常相似,除了不是介于0和1之间的范围,而是介于-1和1之间的范围。函数具有双曲正弦与双曲余弦之比的形式。 但另一种写法是((exp(x) - exp(-x))/(exp(x)+ exp(-x)),如下所示:
print(sess.run(tf.nn.tanh([-1., 0., 1.]))) [-0.76159418 0. 0.76159418 ]
5.softsign函数也被用作激活函数。 这个函数的形式是x /(abs(x)+ 1)。 softsign函数应该是对符号函数的连续逼近。 它显示如下:
print(sess.run(tf.nn.softsign([-1., 0., -1.]))) [-0.5 0. 0.5]
6.另一个函数softplus是ReLU函数的一个平滑版本。 这个函数的形式是log(exp(x)+ 1)。 它显示如下:
print(sess.run(tf.nn.softplus([-1., 0., -1.]))) [ 0.31326166 0.69314718 1.31326163]
softplus随着输入的增加而变为无穷大,而softsign则变为1.然而,随着输入变小,softplus接近零,softsign变为-1。
7.指数线性单位(ELU)与softplus函数非常相似,除了底部渐近线是-1而不是0.如果x <0 else x,则形式为(exp(x)+1)。 它显示如下:
print(sess.run(tf.nn.elu([-1., 0., -1.]))) [-0.63212055 0. 1. ]
如何运行
这些激活函数是我们将来在神经网络或其他计算图中引入非线性的方式。 注意在我们的网络中我们使用激活功能的位置很重要。 如果激活函数的范围在0到1之间(sigmoid),那么计算图只能输出0到1之间的值。
如果激活函数在节点内部并隐藏起来,那么我们想要知道范围在我们传递给它的张量上可能会产生的效果。 如果我们的张量的平均值为零,我们将要使用一个激活函数,尽可能地保留零附近的变化。 这意味着我们要选择一个激活函数,如双曲正切(tanh)或softsign。 如果张量全部被调整为正值,那么理想情况下我们将选择一个激活函数来保留正域中的方差。
更多
这里有两个图表来说明不同的激活功能。 下图显示了以下函数ReLU,ReLU6,softplus,指数LU,S形,softsign和双曲正切:
图3:softplus,ReLU,ReLU6和指数LU的激活功能
在图3中,我们可以看到四个激活函数softplus,ReLU,ReLU6和指数LU。 这些函数向左变为零,然后线性增加到零的右侧,除了ReLU6,其最大值为6:
图4:Sigmoid,双曲正切(tanh)和软标志激活函数
在图4中,我们有激活函数sigmoid,双曲正切(tanh)和softsign。 这些激活功能都是平滑的,并具有S形状。 请注意,这些函数有两个水平渐近线。
使用数据源
对于本书的大部分内容,我们将依靠使用数据集来使用机器学习算法。 本节介绍如何通过TensorFlow和Python访问各种数据集。
准备
在TensorFlow中,我们将使用的一些数据集内置到Python库中,其中一些将需要Python脚本下载,另一些将通过Internet手动下载。 几乎所有这些数据集都需要有效的Internet连接才能检索数据。
如何做
1. iris数据:这个数据集可以说是机器学习中使用的最经典的数据集,也许是所有的统计数据。 这是一个数据集,测量萼片长度,萼片宽度,花瓣长度和花瓣宽度的三个不同类型的鸢尾花:Iris setosa, Iris virginica, and Iris versicolor. 总共有150个测量值,每个物种有50个测量值。 要在Python中加载数据集,我们使用Scikit Learn的数据集函数,如下所示:
from sklearn import datasets iris = datasets.load_iris() print(len(iris.data)) 150 print(len(iris.target)) 150 print(iris.target[0]) # Sepal length, Sepal width, Petal length, Petal width [ 5.1 3.5 1.4 0.2] print(set(iris.target)) # I. setosa, I. virginica, I. versicolor {0, 1, 2}
2.出生体重数据:马萨诸塞大学阿默斯特分校编制了许多有趣的统计数据集(1)。 一个这样的数据集是衡量婴儿出生体重和其他人口统计和医疗测量的母亲和家庭的历史。 有11个变量有189个观察值。 这里是如何访问Python中的数据:
import requests birthdata_url = 'https://www.umass.edu/statdata/statdata/data/ lowbwt.dat' birth_file = requests.get(birthdata_url) birth_data = birth_file.text.split('\'r\n') [5:] birth_header = [x for x in birth_data[0].split( '') if len(x)>=1] birth_data = [[float(x) for x in y.split( ')'' if len(x)>=1] for y in birth_data[1:] if len(y)>=1] print(len(birth_data)) 189 print(len(birth_data[0])) 11
3.波士顿房屋数据:卡内基梅隆大学在其Statlib图书馆中维护一个数据库库。 这个数据很容易通过加州大学欧文分校的机器学习库(2)获得。 有506房屋价值的观察与各种人口数据和住房属性(14变量)。 这里是如何访问Python中的数据:
import requests housing_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data' housing_header = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV0'] housing_file = requests.get(housing_url) housing_data = [[float(x) for x in y.split( '') if len(x)>=1] for y in housing_file.text.split('\n') if len(y)>=1] print(len(housing_data)) 506 print(len(housing_data[0])) 14
4.MNIST手写数据:MNIST(混合国家标准与技术研究院)是较大的NIST手写数据库的子集。 MNIST手写数据集位于Yann LeCun网站(https://yann.lecun.com/exdb/mnist /)上。 它是一个包含7万个单位数字图像(0-9)的数据库,其中约6万个注释用于训练集,10,000个用于测试集。 这个数据集经常用于图像识别,TensorFlow提供了内置函数来访问这些数据。 在机器学习中,提供验证数据以防止过度拟合(目标泄漏)也很重要。 由于这个TensorFlow,把5000个火车集合放到一个验证集中。 这里是如何访问Python中的数据:
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/"," one_hot=True) print(len(mnist.train.images)) 55000 print(len(mnist.test.images)) 10000 print(len(mnist.validation.images)) 5000 print(mnist.train.labels[1,:]) # The first label is a 3''' [ 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
5.垃圾邮件文本数据。 UCI的机器学习数据库库(2)也包含垃圾邮件文本消息数据集。 我们可以访问这个.zip文件并获取垃圾邮件文本数据,如下所示:
import requests import io from zipfile import ZipFile zip_url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/00228/smsspamcollection.zip' r = requests.get(zip_url) z = ZipFile(io.BytesIO(r.content)) file = z.read('SMSSpamCollection') text_data = file.decode() text_data = text_data.encode('ascii',errors='ignore') text_data = text_data.decode().split(\n') text_data = [x.split(\t') for x in text_data if len(x)>=1] [text_data_target, text_data_train] = [list(x) for x in zip(*text_ data)] print(len(text_data_train)) 5574 print(set(text_data_target)) {'ham', 'spam'} print(text_data_train[1]) Ok lar... Joking wif u oni...
6.Movie评论数据:Cornell的Bo Pang发布了一个电影评论数据集,将评论分为好或坏(3)。 你可以在网站上找到这些数据,http://www.cs.cornell.edu/people/pabo/movie-review-data/。 要下载,提取和转换这些数据,我们运行以下代码:
import requests import io import tarfile movie_data_url = 'http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.tar.gz' r = requests.get(movie_data_url) # Stream data into temp object stream_data = io.BytesIO(r.content) tmp = io.BytesIO() while True: s = stream_data.read(16384) if not s: break tmp.write(s) stream_data.close() tmp.seek(0) # Extract tar file tar_file = tarfile.open(fileobj=tmp, mode="r:gz") pos = tar_file.extractfile('rt'-polaritydata/rt-polarity.pos') neg = tar_file.extractfile('rt'-polaritydata/rt-polarity.neg') # Save pos/neg reviews (Also deal with encoding) pos_data = [] for line in pos: pos_data.append(line.decode('ISO'-8859-1'). encode('ascii',errors='ignore').decode()) neg_data = [] for line in neg: neg_data.append(line.decode('ISO'-8859-1'). encode('ascii',errors='ignore').decode()) tar_file.close() print(len(pos_data)) 5331 print(len(neg_data)) 5331 # Print out first negative review print(neg_data[0]) simplistic , silly and tedious .
7.CIFAR-10图像数据:加拿大高级研究所已经发布了一个图像集,其中包含8000万个标记的彩色图像(每个图像缩放为32x32像素)。 有10个不同的目标类(飞机,汽车,鸟类等)。 CIFAR-10是一个拥有60,000个图像的子集。 训练集中有50,000张图片,测试集中有10,000张。 由于我们将以多种方式使用这个数据集,并且因为它是我们较大的数据集之一,所以每次我们需要时都不会运行脚本。 要获得这个数据集,请导航到http://www.cs.toronto.edu/~kriz/cifar.html,然后下载CIFAR-10数据集。 我们将解释如何在适当的章节中使用这个数据集。
8.莎士比亚文本资料:古腾堡计划(5)是一个发行电子版免费书籍的项目。 他们把莎士比亚的所有作品汇编在一起,下面是如何通过Python访问文本文件:
import requests shakespeare_url = 'http://www.gutenberg.org/cache/epub/100/pg100. txt' # Get Shakespeare text response = requests.get(shakespeare_url) shakespeare_file = response.content # Decode binary into string shakespeare_text = shakespeare_file.decode('utf-8') # Drop first few descriptive paragraphs. shakespeare_text = shakespeare_text[7675:] print(len(shakespeare_text)) # Number of characters 5582212
9.英语 - 德语句子翻译数据:Tatoeba项目(http:// tatoeba.org)收集多种语言的句子翻译。 他们的数据已经在Creative Commons License下发布。 根据这些数据,ManyThings.org(http://www.manythings.org)已经在可供下载的文本文件中编译了句子到句子的翻译。 这里我们将使用英文 - 德文翻译文件,但是您可以将URL更改为您想要使用的任何语言:
import requests import io from zipfile import ZipFile sentence_url = 'http://www.manythings.org/anki/deu-eng.zip' r = requests.get(sentence_url) z = ZipFile(io.BytesIO(r.content)) file = z.read('deu.txt''') # Format Data eng_ger_data = file.decode() eng_ger_data = eng_ger_data.encode('ascii''',errors='ignore''') eng_ger_data = eng_ger_data.decode().split(\n''') eng_ger_data = [x.split(\t''') for x in eng_ger_data if len(x)>=1] [english_sentence, german_sentence] = [list(x) for x in zip(*eng_ ger_data)] print(len(english_sentence)) 137673 print(len(german_sentence)) 137673 print(eng_ger_data[10]) ['I won!, 'Ich habe gewonnen!']
如何运行
当在配方中使用这些数据集中的一个时,我们将参考本节,并假定数据以前面介绍的方式加载。如果需要进一步的数据转换或预处理,则这些代码将在配方本身中提供。
更多
Hosmer,D.W.,Lemeshow,S.和Sturdivant,R.X.(2013)。应用逻辑回归:第3版。
https://www.umass.edu/statdata/statdata/data/lowbwt.txt
Lichman,M(2013) UCI机器学习库http://archive.ics.uci.edu/ml
加利福尼亚州伊尔文:加州大学信息与计算机科学学院。
Bo Pang,Lillian Lee和Shivakumar Vaithyanathan,Thumbs up?
Sentiment Classification using Machine Learning Techniques,Proceedings of EMNLP 2002. http://www.cs.cornell.edu/people/pabo/movie-review-data/
Krizhevsky(2009年)从微小的图像学习多层特征 http://www.cs.toronto.edu/~kriz/cifar.html
古腾堡工程 2016年4月访问http://www.gutenberg.org/