Tensorflow知识点小结
写在前面
最近在学习Tensorflow的一些知识。做一些记录方便自己查阅,如果有可能也希望能帮大家更好的学习。文中有不当的地方请私信我或留言,大家共同进步。
一、相关资源
(1)官网
最关键的资源是tensorflow的官网.注意tensorflow中国站不是org结尾的网站,而是以cn结尾的站点。不用翻墙也能访问。
https://tensorflow.google.cn/
(2)github
Google在github上有一个tensorflow仓库,里面特别需要关注的是research文件夹。有很多功能有已经有相关实现。
https://github.com/tensorflow/tensorflow
二、基础知识
根据例子来讲解可能效果会更好,下面给出一个例子,原文来自
https://www.jianshu.com/p/ce213e6b2dc0
当然类似的例子官网里也有,有兴趣的同学可以去看看。
import tensorflow as tf
import numpy as np
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3
### create tensorflow structure start
### #定义变量
Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
biases = tf.Variable(tf.zeros([1]))
#如何计算预测值
y = Weights * x_data + biases
# loss function
loss = tf.reduce_mean(tf.square(y-y_data))
#梯度下降优化器,定义learning rate
optimizer = tf.train.GradientDescentOptimizer(0.5) #训练目标是loss最小化
train = optimizer.minimize(loss)
#初始化变量,即初始化 Weights 和 biases
init = tf.global_variables_initializer()
#创建session,进行参数初始化
sess = tf.Session()
sess.run(init)
#开始训练200步,每隔20步输出一下两个参数
for step in range(201):
sess.run(train)
if step % 20 == 0:
print(step,sess.run(Weights),sess.run(biases)) ### create tensorflow structure end ###
上面的代码很简单,输入是100个二维坐标点(x,y)这些点均落在y=0.1x+0.3这条线上。
假设我们只知道100个点的坐标,我们能否根据这些点找到y=0.1x+0.3“这条线”?
显然是可以的。
现在我们根据上述代码,来引出tensorflow的一些基本知识。
(一)tf.Variable
这里我们已经知道这“可能是”一个线性函数。所以要拟合线性函数,就是确定斜率和偏置。
Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
biases = tf.Variable(tf.zeros([1]))
关于Variable的介绍,可以参考官网的API文档
https://tensorflow.google.cn/api_docs/python/tf/Variable
原文是这么说的:
A variable maintains state in the graph across calls to run(). You add a variable to the graph by constructing an instance of the class Variable.
这句话的大概意思就是说就像数据结构里的图,variable就像图上的节点。需要注意的是和python里可以“肆意”赋值,自动完成类型转换不同。Variable若需修改类型需要显示声明,在次不再赘述。
(二)tf.reduce_mean
先来看看函数原型:
tf.reduce_mean(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)
这个函数的含义是:
Computes the mean of elements across dimensions of a tensor.
又引用了一次API……这个函数是用来计算沿某一维度向量元素的均值的。
比如给出一个3*2的tensor,怎么计算均值?六个数相加除6,还是三三分组,两两分组?所以得要指定一下沿哪个维度计算均值。
回到上面的代码,似乎也没指定维度axis啊。
loss = tf.reduce_mean(tf.square(y-y_data))
其实在这种情况下,整个tensor所有元素求和再平均。
下面再看个例子可能更好懂。仔细观察一下维度0和1分别是什么方向?
# 'x' is [[1., 1.]
# [2., 2.]]
tf.reduce_mean(x) ==> 1.5
tf.reduce_mean(x, 0) ==> [1.5, 1.5]
tf.reduce_mean(x, 1) ==> [1., 2.]
我们可以发现reduction_indices=1时,每个二维向量“内部求和”。下面有张图可以说明一下这个问题。其实也就二维的情况容易混淆,其它情况(三维或更多维)沿哪个维度压缩应当是清晰的。
image.png
(三)tf.train
我们再看看一个相当重要的部分train。
#梯度下降优化器,定义learning rate
optimizer = tf.train.GradientDescentOptimizer(0.5) #训练目标是loss最小化
train = optimizer.minimize(loss)
这部分的内容其实比较多,建议看看training的文档。
https://tensorflow.google.cn/versions/master/api_guides/python/train
下面我们理一理,这个train的用途。
1、Optimizers(优化器)
2、Gradient Computation(计算梯度)
3、Gradient Clipping(梯度裁剪)
4、Decaying the learning rate(学习率衰减)
5、Moving Averages(滑动平均)
6、Coordinator and QueueRunner
7、Distributed execution
8、Reading Summaries from Event Files
9、Training Hooks
10、Training Utilities
列举了很多但是不一定会都用到,碰到哪个讲哪儿吧!今天先说说Optimizers。
Optimizers
The Optimizer base class provides methods to compute gradients for a loss and apply gradients to variables. A collection of subclasses implement classic optimization algorithms such as GradientDescent and Adagrad.
Optimizer就是用来计算loss的梯度,怎么计算呢?
以GradientDescentOptimizer为例,我们注意到
先是定义了一个optimizer,再将loss传递给optimizer。
train = optimizer.minimize(loss)
minimize是什么呢?从字面看最小化loss。
其实我们知道,怎么去实现一个BP算法最小化loss?至少需要两个过程吧?一是计算梯度,二是将梯度赋值。不断重复两个过程。minimize就是这两个过程的合并。它把一些细节性的东西,比如每算完一轮梯度赋值,总轮数加一等等这些事情都做了。我们只要抽象的理解成经过这一步骤出来的loss是“足够小的”。其它优化器类似。
剩下的部分建议参考
https://www.jianshu.com/p/ce213e6b2dc0
写的很好,本文不再赘述。祝您学习愉快!