前言:开始学习TensorFlow框架,以下概念表述均来自网络,仅供自己理解和学习。
TensorFlow教程:TensorFlow快速入门教程(非常详细)
TensorFlow模型的理解
网上有很多的Tensorflow安装教程,我也写了一篇《win7 64位 安装tensorflow》,链接地址:https://blog.csdn.net/Logintern09/article/details/105825437
如果已安装了 TensorFlow,则可以调用 pip install --upgrade tensorflow 进行升级。
TensorFlow入门极简教程(一),链接地址:https://www.jianshu.com/p/4665d6803bcf
上面的文章告诉我:TensorFlow 不是一个严格的“神经网络”库。只要你可以将你的计算表示为一个数据流图,你就可以使用Tensorflow。在Google,科学家用Tensorflow尝试新的算法,产品团队则用Tensorflow来训练和使用计算模型,并直接提供给在线用户。使用Tensorflow可以让应用型研究者将想法迅速运用到产品中,也可以让学术性研究者更直接地彼此分享代码,从而提高科研产出率。
TensorFlow框架介绍,链接地址:https://www.cnblogs.com/kongweisi/p/11038395.html
简单地说,tf框架中,代码的执行都要在会话中进行,而这里所说的图往往指的都是默认图,不需要我们去指定。因此我们只要开启会话,(在默认图中)执行代码即可,代码所执行的操作,我们称之op,即节点。
计算图模型,链接地址:https://zhuanlan.zhihu.com/p/35226768
Tensorflow是一种计算图模型,即用图的形式来表示运算过程的一种模型。Tensorflow程序一般分为图的构建和图的执行两个阶段。图的构建阶段也称为图的定义阶段,该过程会在图模型中定义所需的运算,每次运算的的结果以及原始的输入数据都可称为一个节点(operation ,缩写为op)。
图包含了一组tf.Operation代表计算单元的对象和tf.Tensor代表计算单元之间流动的数据。
为什么Tensorflow要使用图模型?图模型有什么优势呢?
首先,图模型的最大好处是节约系统开销,提高资源的利用率,可以更加高效的进行运算。因为我们在图的执行阶段,只需要运行我们需要的op,这样就大大的提高了资源的利用率;其次,这种结构有利于我们提取中间某些节点的结果,方便以后利用中间的节点去进行其它运算;还有就是这种结构对分布式运算更加友好,运算的过程可以分配给多个CPU或是GPU同时进行,提高运算效率;最后,因为图模型把运算分解成了很多个子环节,所以这种结构也让我们的求导变得更加方便。
Tensorflow框架实现中的“三”种图,连接地址:https://zhuanlan.zhihu.com/p/31308381
图(graph)是 tensorflow 用于表达计算任务的一个核心概念。从前端(python)描述神经网络的结构,到后端在多机和分布式系统上部署,到底层 Device(CPU、GPU、TPU)上运行,都是基于图来完成。
节点之间的边就是张量,是一个 n 维数组, 类型为tf.Tensor。Tensor具有以下两个重要的属性:(1)type:数据类型;(2)shape:形状(阶)。
TensorFlow框架之会话,链接地址:https://www.cnblogs.com/kongweisi/p/11038550.html
应用sess.run或者eval运行图程序并获取张量值
应用feed_dict机制实现运行时填充数据
Placeholder:占位符。这是一个在定义时不需要赋值,但在使用之前必须赋值(feed)的变量,通常用作训练数据。
在运行图时,需要为所有的变量和占位符赋值,否则就会报错。会话的主要任务是在图运算时分配CPU或GPU。tf.Session 对象使用分布式 TensorFlow 运行时提供对本地计算机中的设备和远程设备的访问权限。
TensorFlow常量、变量和占位符详解
Variable:变量,它和占位符的不同是它在定义时需要赋值,而且它的数值是可以在图的计算过程中随时改变的。因此,占位符通常用作图的输入(即训练数据),而变量用作图中可以被“训练”或“学习”的那些tensor,例如y=ax+b中的a和b。
我们所说的“训练”,也就是不停的计算一个图,获得图的计算结果,再根据结果的值调整节点变量的值,然后根据新的变量的值再重新计算图,如此重复,直到结果令人满意(小于某个阈值),或跑到了一个无穷大/小(这说明图的变量初始值设置的有问题),或者结果基本不变了为止。
TensorFlow实现反向传播算法详解
Tensorflow常用函数使用说明及实例简记
Tensorflow一些常用基本概念与函数
Tensorflow常用函数
原文:对于tensor特定值进行逻辑判断和操作
#判断每一个数是否大于threshold
greater = tf.greater(x, threshold)
#判断每一个数是否小于threshold
less = tf.less(x,threshold)
#判断每一个数是否大于等于threshold
greater_equal=tf.greater_equal(x, threshold)
#判断每一个数是否小于等于threshold
less_equal=tf.less_equal(x, threshold)
#判断每一个数是否等于threshold
equal = tf.equal(x, threshold)
#判断每一个数是否不等于threshold
not_equal=tf.not_equal(x, threshold)
这些比较函数会输出bool类型的tensor,那么就可以配合tf.where来使用
tf.where(
condition,
x=None,
y=None,
name=None
)
x中为true的元素值不变,false的元素值替换为y中对应位置的值,因此,x,y是同一shape的
实践小栗子:
#将小于等于threshold的值替换为0
greater = tf.greater(x, threshold)
output = tf.where(greater,x,tf.subtract(x,x))
with tf.Session() as sess:
feed_dict={x:[1,2,3,4,5],threshold:3}
print(sess.run(output,feed_dict=feed_dict))
output: [0 0 0 4 5]
tf.gather_nd允许在多维上进行索引,得到新的向量
比如,想要获得大于0的元素的集合
idxs = tf.where(x>0)
output = tf.gather_nd(idxs)
原文:tf.cast()数据类型转换
tf.cast()函数的作用是执行 tensorflow 中张量数据类型转换,比如读入的图片如果是int8类型的,一般在要在训练前把图像的数据格式转换为float32。
int32转换为float32:
import tensorflow as tf
t1 = tf.Variable([1,2,3,4,5])
t2 = tf.cast(t1,dtype=tf.float32)
print 't1: {}'.format(t1)
print 't2: {}'.format(t2)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
sess.run(t2)
print t2.eval()
输出:
t1: <tf.Variable 'Variable:0' shape=(5,) dtype=int32_ref>
t2: Tensor("Cast:0", shape=(5,), dtype=float32)
[ 1. 2. 3. 4. 5.]
Tensorflow中保存模型时生成的各种文件区别和作用
tensorflow模型的格式通常支持多种,主要有CheckPoint(.ckpt)、GraphDef(.pb)、SavedModel。
ckpt存储参数值
pbtxt存储网络图
pb既存储参数值又存储网络图
graph.pbtxt: 这其实是一个文本文件,保存了模型的结构信息,部分信息如下所示:
node_def {
name: "FixedLengthRecordDataset/input_pipeline_task10/buffer_size"
op: "Const"
device: "/job:worker/task:10/device:CPU:0"
attr {
key: "dtype"
value {
type: DT_INT64
}
}
attr {
key: "value"
value {
tensor {
dtype: DT_INT64
tensor_shape {
}
int64_val: 262144
}
}
}
}
node_def {
name: "FixedLengthRecordDataset"
op: "FixedLengthRecordDataset"
input: "FixedLengthRecordDataset/input_pipeline_task10/filenames:output:0"
input: "FixedLengthRecordDataset/input_pipeline_task10/header_bytes:output:0"
input: "FixedLengthRecordDataset/input_pipeline_task10/record_bytes:output:0"
input: "FixedLengthRecordDataset/input_pipeline_task10/footer_bytes:output:0"
input: "FixedLengthRecordDataset/input_pipeline_task10/buffer_size:output:0"
device: "/job:worker/task:10/device:CPU:0"
}
...