一、计算图
Tensorlfow中的计算是通过一个有向图directed graph或则计算图computation graph来实现的。将每一个运算操作operation作为一个节点node,节点之间通过边edge连接。这个计算图描述的数据计算流程用户可以进行相关分支、循环、选择。使用的语言是python、C++、java、Go等。计算图中每一个节点可以有多个输入和输出,每个节点只能描述一种运算操作。所以节点是运算操作的实例化(instance)。在计算图中传递(流动flow)的数据叫张量(tensor)tensor的数据类型可以预先定义也可以根据计算图的结构推断得到,特殊情况下的依赖控制边(control dependencies),他的功能是起始节点执行计算后再执行目标节点方便用户进行条件控制,只要用在限制内存的高峰值。
import tenorlfow as tf
b = tf.Variable(tf.zeros([100])) #生成100维的向量初始化为0
w = tf.Veriable(tf.random_unifrom([784,100],-1,1) #生成784*100的随机矩阵w
x = tf.placeholder(name = "x") #输入的placeholder
relu = tf.nn.relu(tf.matmul(w,x)+b) #ReLU(Wx+b)
C = [. . .] #根据ReLU函数的结果计算Cost
s = tf.Seeion( )
for step in range(0,10):
input = . . .construct 100-D input arry . . .# 为输入创建一个100维的向量
result = s. run(C,feed_dirc = {x: input}) #获取Cost供给输入x
print(step,result)
二、tf.Session
import tensorflow as tf
matrix1 = tf.constant([[3, 3]])
matrix2 = tf.constant([[2],
[2]])
product = tf.matmul(matrix1, matrix2) # matrix multiply np.dot(m1, m2)
# method 1
sess = tf.Session()
result = sess.run(product)
print(result)
sess.close()
# method 2
with tf.Session() as sess:
result2 = sess.run(product)
print(result2)
三、tf.Variable
一个变量通过调用run() 方法维持图的状态。你通过构造variable 类的实例来添加一个变量到图中。Variable() 构造器需要一个初始值,可以是任意类型和shape 的Tensor。初始值定义了变量的type和shape。构造完成之后,变量的type和shape 是固定的。可以使用assign 方法来修改变量的值。如果你想修改变量的shape,你必须使用assign 操作,并且 validate_shpe=False就像任何Tensor,通过Variable() 创建的variable,可以用作图中其他操作节点的输入。另外,所有操作承载的Tensor 类传递给variables. 所以你可以仅仅通过对变量执行算术来对图中添加节点。
import tensorflow as tf
state = tf.Variable(0, name='counter')
print(state.name)
one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)
#init = tf.initialize_all_variables() # deprecated
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for _ in range(3):
sess.run(update)
print(sess.run(state))
四、tf.placeholder(dtype, shape=None, name=None)
指定初始值,可在运行时,通过 Session.run 的函数的 feed_dict 参数指定,dtype:数据类型。常用的是tf.float32,tf.float64等数值类型,shape:数据形状。默认是None,就是一维值,也可以是多维,比如[2,3], [None, 3]表示列是3,行不定,name:名称。
x = tf.placeholder(tf.float32, shape=(1024, 1024))
y = tf.matmul(x, x)
with tf.Session() as sess:
print(sess.run(y)) # ERROR: 此处x还没有赋值.
rand_array = np.random.rand(1024, 1024)
print(sess.run(y, feed_dict={x: rand_array})) # Will succeed.
五、feed_dict={}
当传入数据时,需要使用feed_dict={}字典形式将数据传入。y是和x有关联的计算,意思是计算y必须先定义x。一般都是讲数据一个batch一个batch一次迭代输入。
sess.run(y, feed_dict={x: [0.7, 0.9]})
六、循环训练
首先定义循环体,再将需要训练的数据进行定义,之后运行训练步骤。定时打印模型训练情况、定时保存模型,防止意外训练中断还能继续训练。
for i in range(training_steps):
x, y = mnist.train.next_batch(batch_size)#使用mnist数据集举例
_, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x:x, y:y})
#一个逗号前面的值代表run列表里的一个返回
#每过1000步进行一次训练情况打印和模型保存
if i % 1000 == 0:
print("After %d training step(s), loss on training batch is %g" % (step,loss_value))# 打印训练情况
saver.save(sess, os.path.join(model_save_path, model_name),global_step=global_step)#定时保存模型
七、变量初始化