https://www.cnblogs.com/lienhua34/p/5998853.html
https://www.cnblogs.com/wuzhitj/p/6431381.html
一、基本概念
API文档:https://tensorflow.google.cn/api_docs/python
https://www.w3cschool.cn/tensorflow_python/tensorflow_python-fibz28ss.html
Tensorflow是一个基于图的计算系统,其主要应用于机器学习。
从Tensorflow名字的字面意思可以拆分成两部分来理解:Tensor+flow。
Tensor:中文名可以称为“张量”,其本质就是任意维度的数组。一个向量就是一个1维的Tensor,一个矩阵就是2维的Tensor。
Flow:指的就是图计算中的数据流。
要使用Tensorflow做什么事情的时候,一般需要三个操作步骤:
创建Tensor;
添加Operations(Operations输入Tensor,然后输出另一个Tensor);
执行计算(也就是运行一个可计算的图)。
Tensorflow有个图的概念,Operations会添加到图中,作为图的节点。在添加某Operation的时候,不会立即执行该Operation。Tensorflow会等待所有Operation添加完毕,然后Tensorflow会优化该计算图,以便决定如何执行计算。
二、简单示例
- 向量相加
[1. 1. 1. 1.] + [2. 2. 2. 2.] = [3. 3. 3. 3.]
# -*- coding: utf-8 -*-
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
'''
向量相加
'''
with tf.Session() as sess:
input1 = tf.constant([1.0,1.0,1.0,1.0])
input2 = tf.constant([2.0,2.0,2.0,2.0])
output = tf.add(input1, input2)
# 使用eval运行
result = sess.run(output)
print (result)
writer = tf.summary.FileWriter('logs/', sess.graph)
Tensorflow的计算必须要在一个Session的上下文中。Session会包含一个计算图,而这个图你添加的Tensors和Operations。当然,你在添加Tensor和Operation的时候,它们都不会立即进行计算,而是等到最后需要计算Session的结果的时候。当Tensorflow之后了计算图中的所有Tensor和Operation之后,其会知道如何去优化和执行图的计算。
两个tf.constant() 语句向计算图中创建了两个Tensor。调用tf.constant()的动作大致可以说为,创建两个指定维度的Tensor,以及两个constant操作符用于初始化相对应的Tensor(不会立即执行)。
tf.add()语句向计算图中添加了一个add操作,当不会立即执行,这时候add操作的结果还无法获取。
当我们最后调用output.eval()时,会触发Tensorflow执行计算图,从而获取output计算结点的结果。
三、基本类
1. Tensor类
在tensorflow中,数据是被封装在tensor对象中的。tensor是张量的意思,即包含从0到任意维度的张量。常数是0维度的张量,向量是1维度的张量,矩阵是二维度的张量,以及还有多维度的张量。
张量的函义:
3 # 这个 0 阶张量就是标量,shape=[]
[1., 2., 3.] # 这个 1 阶张量就是向量,shape=[3]
[[1., 2., 3.], [4., 5., 6.]] # 这个 2 阶张量就是二维数组,shape=[2, 3]
[[[1., 2., 3.]], [[7., 8., 9.]]] # 这个 3 阶张量就是三维数组,shape=[2, 1, 3]
张量使用:
# tensor1 是一个0维的 int32 tensor
tensor1 = tf.constant(1234)
# tensor2 是一个1维的 int32 tensor
tensor2 = tf.constant([123,456,789])
# tensor3 是一个二维的 int32 tensor
tensor3 = tf.constant([ [123,456,789], [222,333,444] ])
2. constant常量函数
constant()函数
constant函数提供在tensorflow中定义常量(不可更改的张量)的方法
tf.constant(value,dtype=None,shape=None,name=‘Const’,verify_shape=False)
作用:创建一个常量tensor
参数:
value: 一个dtype类型(如果指定了)的常量值(列表)。要注意的是,要是value是一个列表的话,那么列表的长度不能够超过形状参数指定的大小(如果指定了)。要是列表长度小于指定的,那么多余的由列表的最后一个元素来填充。
dtype: 返回tensor的类型
shape: 返回的tensor形状。
name: tensor的名字
verify_shape:布尔值,用于验证值的形状。
# 常量定义
a=tf.constant([[1,2],[3,4]])
b=tf.constant([[1,1],[0,1]])
print("a:",a)
print("b:",b)
print("a 的类型是:",type(a))
# 使用乘法操作
c=tf.matmul(a,b)
print("c:",c)
print("device:",c.device)
print("dtype:",c.dtype)
print("shape:",type(c.shape))
3. Variable变量类
tensorflow中的变量是通过Variable类来实现的。tensorflow中需要定义为变量的包括训练过程中的输入数据,输出数据,以及控制从输入到输出的学习机制,即网络参数。输入输出数据在tf中是用placeholder占位符来定义的,网络参数是用tf.Variable来定义的。
# 创建变量
w=tf.Variable(initial_value=[[1,2],[3,4]],dtype=tf.float32)
x=tf.Variable(initial_value=[[1,1],[1,1]],dtype=tf.float32)
# 相乘
y=tf.matmul(w,x)
# S形曲线的数学函数
z=tf.sigmoid(y)
# 初始化全局变量
init_op=tf.global_variables_initializer()
print(z)
属性:
device:这个变量的device
dtype:变量的元素类型
graph:存放变量的图
**initial_value: **这个变量的初始值
initializer:这个变量的初始化器
name:这个变脸的名字
op:此变量的操作。
函数
__init__(initial_value=None, trainable=True, collections=None, validate_shape=True, caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None, import_scope=None)
作用:
创建一个新的变量,初始值为initial_value(这个构造函数会创建两个操作(Op),一个变量OP和一个assignOp来设置变量为其初始化值)
参数:
initial_value: 一个Tensor类型或者是能够转化为Tensor的python对象类型。它是这个变量的初始值。这个初始值必须指定形状信息,不然后面的参数validate_shape需要设置为false。当然也能够传入一个无参数可调用并且返回制定初始值的对象,在这种情况下,dtype必须指定。
trainable: 如果为True(默认也为Ture),这个变量就会被添加到图的集合GraphKeys.TRAINABLE_VARIABLES.中去 ,这个collection被作为优化器类的默认列表。
collections:图的collection 键列表,新的变量被添加到这些collection中去。默认是[GraphKeys.GLOBAL_VARIABLES].
validate_shape: 如果是False的话,就允许变量能够被一个形状未知的值初始化,默认是True,表示必须知道形状。
caching_device: 可选,描述设备的字符串,表示哪个设备用来为读取缓存。默认是变量的device,
name: 可选,变量的名称
variable_def: VariableDef protocol buffer. If not None, recreates the Variable object with its contents. variable_def and the other arguments are mutually exclusive.
dtype: 如果被设置,初始化的值就会按照这里的类型来定。
expected_shape: TensorShape类型.要是设置了,那么初始的值会是这种形状
import_scope: Optional string. Name scope to add to the Variable. Only used when initializing from protocol buffer.
assign(value, use_locking=False)
作用:为变量指定一个新的值
参数:
value: Tensor,变量的新值
use_locking:如果True,在操作过程中使用锁定。
a = tf.Variable([10, 20])
b = tf.assign(a, [20, 30])
c = a + [10, 20]
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("a : ", sess.run(a))
# 因为b没有被run所以a还是[10 20]
print("c : ", sess.run(c))
# a = [20 30] 运行b,对a进行assign
print("b : ", sess.run(b))
# 因为b被run过了,所以a为[20 30]
print("a : ", sess.run(a))
# [20 30] + [10 20] = [30 50] 因为b被run过了,所以a为[20, 30], 那么c就是[30 50]
print("c : ", sess.run(c))
函数:assign_add()
assign_add(delta, use_locking=False)
作用:为这个变量加上一个值
参数:
delta: Tensor,待加的值
use_locking:如果True,在操作过程中使用锁定。
x = tf.Variable(1)
y = tf.assign_add(x, 2)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(y))
函数:assign_sub()
assign_sub(delta, use_locking=False)
作用:为这个变量减去一个值
参数:
delta: Tensor,待减的值
use_locking:如果True,在操作过程中使用锁定。
函数:read_value()
read_value()
作用:返回这个变量的值,在当前的上下文中读取。返回的是一个含有这个值的Tensor
函数:set_shape()
set_shape(shape)
作用:改变变量形状
参数:
shape:新的形状
4. placeholder 占位符
用于声明一个张量的数据格式,告诉系统这里会有一个这种格式的张量,但是还没有传入具体的值。
如:
X = tf.placeholder("float", shape=[None, 100])
上面声明了一个张量X,数据类型是float,100列,行数不确定。
5. Session
Tensorflow中的所有计算都构建在一张计算图中,这是一种对数学运算过程的可视化方法。
TensorFlow 底层是使用C++实现,这样可以保证计算效率,并使用 tf.Session类来连接客户端程序与C++运行时。上层的Python、Java等代码用来设计、定义模型,构建的Graph,最后通过tf.Session.run()方法传递给底层执行。
import tensorflow as tf
x = tf.placeholder("string")
with tf.Session() as sess:
output = sess.run(x, feed_dict={x : "run the map"})
print(output)