TensorFlow是一个开源软件库,用于跨一系列任务进行数据流编程。它是一个符号数学库,也用于机器学习应用,如神经网络。2015年11月,谷歌开源TensorFlow。从那时起,TensorFlow已经成为Github上最受欢迎的机器学习库。(https://github.com/tensorflow/tensorflow)
为什么是TensorFlow?TensorFlow的流行有很多原因,但主要是因为计算图概念、自动微分和TensorFlow python API结构的适应性。这使得大多数程序员可以使用TensorFlow解决实际问题。
谷歌的Tensorflow引擎有一种独特的解决问题的方法。这种独特的方式可以非常有效地解决机器学习问题。我们将介绍了解Tensorflow如何运行的基本步骤。
张量流中的张量是什么
TensorFlow,顾名思义,是一个定义和运行涉及张量的计算的框架。张量是将向量和矩阵推广到可能更高的维度。在内部,TensorFlow将张量表示为基本数据类型的n维数组。张量中的每个元素都有相同的数据类型,并且数据类型总是已知的。形状(即其尺寸的数量和每个尺寸的大小)可能仅部分已知。如果输入的形状也是完全已知的,大多数操作都会产生形状完全已知的张量,但在某些情况下,只有在图形执行时才能找到张量的形状。
通用TensorFlow算法概述
这里我们将介绍Tensorflow算法的一般流程。
- 导入或生成数据
我们所有的机器学习算法都将依赖于数据。实际上,我们要么生成数据,要么使用外部数据源。有时,依赖生成的数据更好,因为我们想知道预期结果。tensorflow还预装了著名的数据集,如MNIST、CIFAR-10等。
- 转换和规范化数据
数据通常不是我们的Tensorflow算法所期望的正确维度或类型。我们必须先转换数据,然后才能使用它。大多数算法也需要标准化数据。Tensorflow内置函数,可以为您规范化数据。
data = tf.nn.batch_norm_with_global_normalization(...)
- 设置算法参数
我们的算法通常有一组参数,我们在整个过程中保持不变。例如,这可以是迭代次数、学习率或我们选择的其他固定参数。将它们一起初始化被认为是一种好的形式,这样读者或用户就可以很容易地找到它们。
learning_rate = 0.001 iterations = 1000
- 初始化变量和占位符
Tensorflow依赖于我们告诉它可以修改什么,不能修改什么。Tensorflow将在优化过程中修改变量,以最小化损失函数。为了实现这一点,我们通过占位符输入数据。我们需要用大小和类型来初始化这两个变量和占位符,以便Tensorflow知道会发生什么。
a_var = tf.constant(42) x_input = tf.placeholder(tf.float32, [None, input_size]) y_input = tf.placeholder(tf.fload32, [None, num_classes])
- 定义模型结构
在获得数据并初始化变量和占位符之后,我们必须定义模型。这是通过构建计算图来实现的。我们告诉Tensorflow必须对变量和占位符进行哪些操作才能得到我们的模型预测。
y_pred = tf.add(tf.mul(x_input, weight_matrix), b_matrix)
- 声明损失函数
定义模型后,我们必须能够评估输出。这就是我们声明损失函数的地方。损失函数非常重要,因为它告诉我们,我们的预测与实际值相差有多远。
loss = tf.reduce_mean(tf.square(y_actual – y_pred))
- 初始化并训练模型
现在我们已经准备好了一切,我们创建了一个实例或图形,并通过占位符输入数据,让Tensorflow更改变量以更好地预测我们的训练数据。下面是初始化计算图的一种方法。
with tf.Session(graph=graph) as session: ... session.run(...) ...
注意,我们也可以使用
session = tf.Session(graph=graph) session.run(…)
- 评估模型(可选)
一旦我们建立并训练了模型,我们就应该通过观察模型在新数据上通过一些特定标准的表现来评估模型。
- 预测新结果(可选)
了解如何对新的、看不见的数据进行预测也很重要。一旦我们对所有模型进行了培训,我们就可以对它们进行此操作。
总结
在Tensorflow中,我们必须先设置数据、变量、占位符和模型,然后再告诉程序训练和更改变量以改进预测。Tensorflow通过计算图来实现这一点。我们告诉它最小化损失函数,Tensorflow通过修改模型中的变量来做到这一点。Tensorflow知道如何修改变量,因为它跟踪模型中的计算,并自动计算每个变量的梯度。因此,我们可以看到进行更改和尝试不同的数据源是多么容易。
总的来说,算法在TensorFlow中是循环的。我们将该循环设置为一个计算图,(1)通过占位符输入数据,(2)计算计算图的输出,(3)使用损失函数将输出与所需输出进行比较,(4)根据自动反向传播修改模型变量,最后(5)重复该过程,直到满足停止标准。
现在开始tensorflow的实践课程,并使用它实现张量。
首先,我们需要导入所需的库。
import tensorflow as tf from tensorflow.python.framework import ops ops.reset_default_graph()
然后启动图形会话
sess = tf.Session()
现在是主要部分,即创建张量。
TensorFlow内置函数来创建用于变量的张量。例如,我们可以使用tf创建预定义形状的零填充张量。zeros()函数如下所示。
my_tensor = tf.zeros([1,20])
我们可以通过在会话中调用run()方法来计算张量。
sess.run(my_tensor)
TensorFlow算法需要知道哪些对象是变量,哪些是常量。所以我们用TensorFlow函数tf创建一个变量。变量()。请注意,您不能运行sess。运行(my_var),这将导致错误。因为TensorFlow使用计算图进行操作,所以我们必须创建一个变量初始化操作来计算变量。对于这个脚本,我们可以通过调用变量方法my_var.initializer一次初始化一个变量。
my_var = tf.Variable(tf.zeros([1,20])) sess.run(my_var.initializer) sess.run(my_var)
输出:
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]], dtype=float32)
现在,让我们创建变量来处理具有特定形状的维度,然后用所有“1”或“0”初始化变量
row_dim = 2 col_dim = 3 zero_var = tf.Variable(tf.zeros([row_dim, col_dim])) ones_var = tf.Variable(tf.ones([row_dim, col_dim]))
现在评估它们的值,我们可以再次对变量运行初始化器方法。
sess.run(zero_var.initializer) sess.run(ones_var.initializer) print(sess.run(zero_var)) print(sess.run(ones_var))
输出:
[[ 0. 0. 0.] [ 0. 0. 0.]] [[ 1. 1. 1.] [ 1. 1. 1.]]
这个名单还会继续下去。剩下的将供你学习,请跟随我的jupyter笔记本,从中获取更多关于张量的信息 在这里 .
在TensorBoard中可视化变量创建
为了可视化Tensorboard中变量的创建,我们将重置计算图并创建一个全局初始化操作。
# Reset graph ops.reset_default_graph() # Start a graph session sess = tf.Session() # Create variable my_var = tf.Variable(tf.zeros([ 1 , 20 ])) # Add summaries to tensorboard merged = tf.summary.merge_all() # Initialize graph writer: writer = tf.summary.FileWriter( "/tmp/variable_logs" , graph = sess.graph) # Initialize operation initialize_op = tf.global_variables_initializer() # Run initialization of variable sess.run(initialize_op) |
现在在cmd中运行以下命令。
tensorboard --logdir=/tmp
它会告诉我们可以在浏览器中浏览的URL,以查看Tensorboard,实现您的损失图。
代码创建所有类型的张量并对其求值。
import tensorflow as tf from tensorflow.python.framework import ops ops.reset_default_graph() # Introduce tensors in tf # Get graph handle sess = tf.Session() my_tensor = tf.zeros([ 1 , 20 ]) # Declare a variable my_var = tf.Variable(tf.zeros([ 1 , 20 ])) # Different kinds of variables row_dim = 2 col_dim = 3 # Zero initialized variable zero_var = tf.Variable(tf.zeros([row_dim, col_dim])) # One initialized variable ones_var = tf.Variable(tf.ones([row_dim, col_dim])) # shaped like other variable sess.run(zero_var.initializer) sess.run(ones_var.initializer) zero_similar = tf.Variable(tf.zeros_like(zero_var)) ones_similar = tf.Variable(tf.ones_like(ones_var)) sess.run(ones_similar.initializer) sess.run(zero_similar.initializer) # Fill shape with a constant fill_var = tf.Variable(tf.fill([row_dim, col_dim], - 1 )) # Create a variable from a constant const_var = tf.Variable(tf.constant([ 8 , 6 , 7 , 5 , 3 , 0 , 9 ])) # This can also be used to fill an array: const_fill_var = tf.Variable(tf.constant( - 1 , shape = [row_dim, col_dim])) # Sequence generation linear_var = tf.Variable(tf.linspace(start = 0.0 , stop = 1.0 , num = 3 )) # Generates [0.0, 0.5, 1.0] includes the end sequence_var = tf.Variable(tf. range (start = 6 , limit = 15 , delta = 3 )) # Generates [6, 9, 12] doesn't include the end # Random Numbers # Random Normal rnorm_var = tf.random_normal([row_dim, col_dim], mean = 0.0 , stddev = 1.0 ) # Add summaries to tensorboard merged = tf.summary.merge_all() # Initialize graph writer: writer = tf.summary.FileWriter( "/tmp/variable_logs" , graph = sess.graph) # Initialize operation initialize_op = tf.global_variables_initializer() # Run initialization of variable sess.run(initialize_op) |
输出:
参考链接:
1) Tensorflow文档