Tensorflow中每个操作符当做一个节点,连接节点的线称为边,边中流动的数据称为tensor。有一类特殊的边中没有数据流动,这种边称为是依赖控制,作用是让起始节点执行完后在执行目标节点,可以进行灵活的条件控制。
运算核(kernal)是指一个运算操作在某个具体硬件(比如CPU或GPU中)的实现。
Tensorflow内建的操作运算有如下:
类型 | 实例 |
---|---|
标量运算 | Add、Sub、Mul、Div、Exp、Log、Greater、Less、Equal |
向量运算 | Concat、Slice、Split、Constant、Rank、Shape、Shuffle |
矩阵运算 | MatMul、MatrixInverse、MatrixDeterminant |
带状态的运算 | Variable、Assign、AssignAdd |
神经网络组件 | SoftMax、Sigmoid、ReLU、Convolution2D、MaxPooling |
储存、恢复 | Save、Restore |
队列及同步运算 | Enqueue、Dequeue、MutexAcquire、MutexRelease |
控制流 | Merge、Switch、Enter、Leave、NextIteration |
1、设置定量
import tensorflow as tf
node1 = tf.constant(3.0,dtype = tf.float32)
node2 = tf.constant([2.3],dtype = tf.float32)
sess = tf.Session()
print(sess.run([node1,node2]))
使用tf.constant可以创建定量,但是必须使用session才能显示定量的数据,session封装了tensorflow的控制以及状态,调用run方法,可以得到constant的值。
2、tf的操作符,加法
import tensorflow as tf
node1 = tf.constant(3.0,dtype = tf.float32)
node2 = tf.constant([2.3],dtype = tf.float32)
node3 = tf.add(node1,node2)
sess = tf.Session()
print(sess.run(node3))
3、placeholder类型量
placeholder相对与constant型,可以接受外部输入,改变自身的数值。
import tensorflow as tf
node1 = tf.placeholder(tf.float32)
node2 = tf.placeholder(tf.float32)
node3 = node1 + node2
sess = tf.Session()
print(sess.run(node3,{node1:3,node2:4}))
node1与node2 为创建的两个可以就收外部输入的量,可以通过字典传入数据。
import tensorflow as tf
node1 = tf.placeholder(tf.float32)
node2 = tf.placeholder(tf.float32)
node3 = node1 + node2
node4 = node3 * 2
sess = tf.Session()
print(sess.run(node4,{node1:[3,4],node2:[4,5]}))
可以使用连续运算操作符,并且字典可以通过列表形式传入多个数据。
placeholder用于提供输入数据,在定义时,数据类型是需要指定的,但是维度信息可以不用·给定,如果不确定可以用None代替。
x = tf.placeholder(tf.float32,shape=(None,2),name = 'x-input')
4、variable类型
在机器学习中,我们需要在训练过程中调整参数,这种可在训练过程中调整的数据类型为variable类型。可以通过一个初始值与数据类型进行声明。
import tensorflow as tf
weight = tf.Variable(3,dtype = tf.float32)
bias = tf.Variable(1,dtype = tf.float32)
x = tf.placeholder(tf.float32)
y = weight * x + bias
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
print(sess.run(y,{x:3}))
与constant类型(在声明时就初始化)不同,variable类型变量需要调用如下代码进行初始化:
init = tf.global_variables_initializer()
sess.run(init)
tf.Variable的作用就是保存和更新神经网络中的参数。初始值可以设置为随机数。如下方式
import tensorflow as tf
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,mean=1,seed=1,dtype=tf.float32))
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(w1))
Tensorflow随机数生成函数
函数名称 | 随机数分布 | 主要参数 |
---|---|---|
tf.random_normal | 正态分布 | 平均值,标准差,取值类型 |
tf.truncated_normal | 正态分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个数将会被重新生成 |
Tensorflow生成常数函数
函数名称 | 功能 | 样例 |
---|---|---|
tf.zeros | 生成全0的数组 | tf.zeros([2,3],int32)->[[0,0,0],[0,0,0]] |
tf.ones | 生成全1的数组 | tf.ones([2,3],int32)->[[1,1,1],[1,1,1]] |
tf.fill | 产生一个全部为给定数字的数组 | tf.fill([2,3],9)->[[9,9,9],[9,9,9]] |
tf.constant | 产生一个给定值的常量 | tf.constant([2,3])->[2,3] |
Tensorflow也支持通过其他变量的初始值来初始化新的变量,如下所示
import tensorflow as tf
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,mean=1,seed=1,dtype=tf.float32))
w2 = tf.Variable(w1.initialized_value())
w2使用w1的初始值进行初始化
如果变量声明时,参数trainable为True,那么这个变量会被加入GraphKeys.TRANINABLE_VARIABLES集合中。在Tensorflow中可以通过tf.trainable_variables()
函数得到所有需要优化的参数。Tensorflow中提供的神经网络优化算法将会GraphKeys.TRANINABLE_VARIABLES集合中的变量当做默认的优化对象。
5、loss function 误差计算
import tensorflow as tf
weight = tf.Variable(3,dtype = tf.float32)
bias = tf.Variable(1,dtype = tf.float32)
x = tf.placeholder(tf.float32)
line_regress = weight * x + bias
y = tf.placeholder(tf.float32)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
squared_deltas = tf.square(line_regress - y)
loss = tf.reduce_sum(squared_deltas)
print(sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]}))
y为理想输出,line_regress为实际计算输出。loss为误差平方和。
6、variable类型变量的改变
import tensorflow as tf
weight = tf.Variable(3,dtype = tf.float32)
bias = tf.Variable(1,dtype = tf.float32)
x = tf.placeholder(tf.float32)
line_regress = weight * x + bias
y = tf.placeholder(tf.float32)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
squared_deltas = tf.square(line_regress - y)
loss = tf.reduce_sum(squared_deltas)
fixW = tf.assign(weight, -1.)
fixb = tf.assign(bias, 1.)
sess.run([fixW, fixb])
print(sess.run(loss,{x:[1,2,3,4],y:[0,-1,-2,-3]}))
使用了如下代码,对variable类型量进行了重新赋值:
fixW = tf.assign(weight, -1.)
fixb = tf.assign(bias, 1.)
sess.run([fixW, fixb])
维度是变量的一个重要属性,但是维度能够在程序运行中进行改变,但是需要设置参数validate_shape=False
fixW = tf.assign(w1,w2,validate_shape = False)
7、训练
简单的使用梯度下降法,确定上述线性回归的参数值。
import tensorflow as tf
weight = tf.Variable(1,dtype = tf.float32)
bias = tf.Variable(-1,dtype = tf.float32)
x = tf.placeholder(tf.float32)
line_regress = weight * x + bias
y = tf.placeholder(tf.float32)
init = tf.global_variables_initializer()
sess = tf.Session()
squared_deltas = tf.square(line_regress - y)
loss = tf.reduce_sum(squared_deltas)
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)
sess.run(init)
for i in range(1000):
sess.run(train,{x:[1,2,3,4],y:[0,-1,-2,-3]})
if i % 10 == 0:
print(i,sess.run([weight,bias,loss],{x:[1,2,3,4],y:[0,-1,-2,-3]}))
8、线性回归例程
import numpy as np
import tensorflow as tf
##声明特征列表
feature_columns = [tf.feature_column.numeric_column("x",shape=[1])]
##创建线性回归,还有线性分类,神经网络分类等
estimator = tf.estimator.LinearRegressor(feature_columns = feature_columns)
##创建训练数据
x_train = np.array([1.,2.,3.,4.])
y_train = np.array([0.,-1.,-2.,-3.])
x_eval = np.array([2.,5.,8.,1.])
y_eval = np.array([-1.01, -4.1, -7, 0.])
input_fn = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=None,shuffle=True)
train_input_fn = tf.estimator.inputs.numpy_input_fn({'x':x_train},y_train,batch_size=4,num_epochs=1000,shuffle=False)
eval_input_fn = tf.estimator.inputs.numpy_input_fn({'x':x_eval},y_eval,batch_size=4,num_epochs=1000,shuffle=False)
##训练
estimator.train(input_fn=input_fn,steps=1000)
train_metrics = estimator.evaluate(input_fn=train_input_fn)
eval_metrics = estimator.evaluate(input_fn=eval_input_fn)
eval_pre = estimator.predict(input_fn= eval_input_fn)
print("train metrics: %r"%train_metrics)
print('eval metrics: %r'%eval_metrics)
for i in eval_pre:
print('predict: ',i)
WALDM