二维码

TensorFlow随机性

1659 人阅读 | 时间:2018年12月02日 09:47

机器学习模型是许多变量的复杂集合,但必须经过培训才能找到好的值。这也意味着必须将这些“权重”设置为初始值。一种选择是从所有权重开始为零,然后从那里开始。然而,这会在算法上引起问题 - 基本上,错误的梯度在修复错误方面存在问题。相反,我们经常将这些权重设置为随机值。在那之后,模型学习并调整。

TensorFlow有许多用于生成随机数的内置方法。这包括我们熟悉的发行版,如“uniform”,以及您可能听说过的其他发行版,如“普通”发行版。统一分布就像你掷骰子时得到的那样 - 有一组值,它们都是同样可能的。正态分布是统计类中教授的标准,其中数据具有更可能的平均值,并且围绕它具有“钟形”曲线。正如我们将看到的那样,其他也包括在内。

在本课中,我们将创建一个基本的辅助函数,它只运行一个TensorFlow变量。这个小功能非常有用!它创建一个会话,初始化变量并为我们运行它。它仅限于单个变量,因此对于较大的程序可能没有用。

import tensorflow as tf  def run_variable(variable):     tf.initialize_all_variables()     with tf.Session() as sess:         return sess.run(variable)

希望现在这对你们来说都很熟悉。如果没有,请再看看我们关于变量的课程,开始吧。

让我们从基本分布开始,统一分布。

my_distribution = tf.random_uniform((6, 4), seed=42) uniform = run_variable(my_distribution)

这为我们提供了一个6乘4的张量(有关随机值的更多信息,请参阅广播。为了可视化,我们可以使用直方图:

from matplotlib import pyplot as plt  plt.hist(uniform.flatten()) plt.show()

请注意,如果您使用的是Jupyter笔记本,请%matplotlib inline改用并删除该plt.show()行。

结果图显示了图片,虽然还不是很清楚......

TensorFlow随机性

此直方图显示可能的值介于0和1之间。每个值应该具有相同的可能性,但实际上并不是这样。原因是我们只选择了少量的值。如果我们增加数组的大小,它会变得更加均匀

large_normal = tf.random_uniform((600, 400), seed=42) large_uniform = run_variable(large_normal)  plt.hist(large_uniform.flatten()) plt.show()
TensorFlow随机性

那更均匀!

如果您没有任何其他信息,均匀分布对于在机器学习模型中初始化权重非常有用。它也是一个“有界”分布,它具有设定的最小值和最大值,随机值不能超出该范围。要更改范围,例如更改为0和10,则乘以范围并添加最小值。在课程结束时有一个练习。

另一种常用的分布是正态分布,在TensorFlow中实现为random_normal函数:

distribution = tf.random_normal((600, 4), seed=42) normal = run_variable(distribution) plt.hist(normal.flatten()) plt.show()
TensorFlow随机性

默认情况下,此分布的平均值约为0,标准差为1.这些值不受限制,但与您偏离的平均值相比变得越来越不可能,标准差设置可能性降低的速率。在实践中,大约60%的值落在与每个方向上的平均值的一个标准偏差的“半径”内,并且99%落在4个标准偏差内。

平均值和标准偏差是random_normal函数的参数例如,高度可近似建模为正态分布,平均值约为170cm,标准偏差约为15cm。

distribution = tf.random_normal((10000,), seed=42, mean=170, stddev=15) normal = run_variable(distribution) plt.hist(normal.flatten()) plt.show()
TensorFlow随机性

到目前为止,我们的直方图已经使用matplotlib生成。我们也可以使用TensorFlow来创建它们!histogram_fixed_width函数采用一系列值(如我们的随机值),范围和要计算的二进制数。然后计算每个bin的范围内有多少个值,并将结果作为数组返回。

import numpy as np bins = tf.histogram_fixed_width(normal, (normal.min(), normal.max()), nbins=20) histogram_bins = run_variable(bins) x_values = np.linspace(normal.min(), normal.max(), len(histogram_bins)) plt.bar(x_values, histogram_bins,)

plt.bar调用中,我们再次手动生成bin值,然后histogram_bins使用条形图将它们绘制为x值作为高度。

TensorFlow随机性

这是正确的,但看起来不对。直方图值在那里,但宽度非常窄(我们的箱子仅由单个值表示)。我们来解决这个问题:

bar_width = (normal.max() - normal.min()) / len(histogram_bins) plt.bar(x_values, histogram_bins, width=bar_width)
TensorFlow随机性

  1. 使用Uniform分布对单个掷骰子进行建模。绘制结果以确保其符合您的期望

  2. 使用单个图形中的纯TensorFlow调用替换本课程的最后一个代码块。换句话说,使用TensorFlow概念来代替.min().max()len电话。只有在没有TensorFlow的情况下才能进行绘图!


©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×