TensorFlow学习笔记(一)

  • Post author:
  • Post category:其他


Tensorflow的基本概念

  • 使用图(graphs)来表示计算任务,即一整个计算任务流程被抽象成一个有向图
  • 图的执行必须在被称之为会话(Session)的上下文中进行
  • 张量tensor表示数据
  • 通过变量(Variable)维护状态
  • 使用feed为任意操作(op)赋值
  • 使用fetch从任意操作中获取数据

注:可以将tensor看做不能被存储的数据,即经过操作op后,tensor将不存在。而variable可以看做可以被存储的数据(相当于C++中的一般性变量)

总而言之,Tensorflow是一个编程系统,使用图(graphs)来表示计算任务,图中的节点称之为op(operation),一个op获得0个或多个Tensor,执行计算,产生0个或多个Tensor。Tensor看作是一个n维数组或列表,图必须在会话(Session)里被启动。

例一:启动会话Session

import tensorflow as tf

#定义一个常量向量m1
m1=tf.constant([[3,3]])
#定义一个常量向量m2
m2=tf.constant([[2],[3]])
#定义一个对m1和m2做矩阵乘法的op
product=tf.matmul(m1,m2)
#尝试打印结果
print(product)

这里我们尝试直接对op结果进行打印,可以看到结果仅仅是一个tensor,而不是我们希望的到的答案(如下图)

这是因为,Tensorflow中的图必须在Session中运行,所以应该对代码进行如下修改:

import tensorflow as tf

#定义一个常量向量m1
m1=tf.constant([[3,3]])
#定义一个常量向量m2
m2=tf.constant([[2],[3]])
#定义一个对m1和m2做矩阵乘法的op
product=tf.matmul(m1,m2)
#定义一个会话,启动默认的图
sess=tf.Session()
#调用sess的run方法来执行矩阵乘法op
result=sess.run(product)
print(result)
#关闭会话
sess.close()

注意用这种方法,只要启动Session就必须关闭Session,因此也可以改成如下方式调用会话:

import tensorflow as tf

#定义一个常量向量m1
m1=tf.constant([[3,3]])
#定义一个常量向量m2
m2=tf.constant([[2],[3]])
#定义一个对m1和m2做矩阵乘法的op
product=tf.matmul(m1,m2)

with tf.Session() as sess:
    # 调用sess的run方法来执行矩阵乘法op
    result = sess.run(product)
    print(result)

结果如下所示:

例二:Tensorflow中的变量定义与使用

import tensorflow as tf

x=tf.Variable([1,2])
a=tf.Variable([3,3])
#定义一个减法op
sub=tf.subtract(x,a)
#定义一个假发op
add=tf.add(x,sub)

#初始化全局变量(TensorFlow中的变量在使用前必须初始化)
init=tf.global_variables_initializer()

with tf.Session() as sess:
    #run()方法,调用初始化的op
    sess.run(init)
    print(sess.run(sub))
    print(sess.run(add))

总之,在Tensorflow中使用变量Variable必须初始化。

#定义一个变量state=0
state=tf.Variable(0)
#定义一个加1的操作op
new_value=tf.add(state,1)
#赋值op
update=tf.assign(state,new_value)
#初始化
init=tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    #打印state初始值
    print(sess.run(state))
    #循环5次,每次state加1
    for i in range(5):
        sess.run(update)
        print(sess.run(state))

结果如下:

例三:Fetch和Feed操作

fetch的目的就是在会话中同时执行多个op得到结果。

input1=tf.constant(3.0)
input2=tf.constant(2.0)
input3=tf.constant(5.0)

#定义加法op
add=tf.add(input2,input3)
#定义乘法op
mul=tf.multiply(input1,add)

with tf.Session() as sess:
    result=sess.run([mul,add])    #Fetch
    print(result)

结果如下:

feed主要用于为占位符placeholder赋值,占位符相当于一个没有被赋值的变量,需要在使用时赋值。

#定义一个数据类型为float32的占位符
input1=tf.placeholder(tf.float32)
input2=tf.placeholder(tf.float32)
#定义乘法op
output=tf.multiply(input1,input2)

with tf.Session() as sess:
    #feed的数据必须以字典的形式传入
    print(sess.run(output,feed_dict={input1:[4.0],input2:[3.0]}))

结果如下:

例四:简单的综合应用

import tensorflow as tf
import numpy as np

#随机生成100个点,作为训练集
x_data=np.random.rand(100)
#这100个点对应的100个label
#可以看到,真实的斜率为0.1,真实的偏置为0.2
y_data=x_data*0.1+0.2

#构造一个线性模型
#偏置bias,初始值为0.0
b=tf.Variable(0.0)
#斜率k,初始值为0.0
k=tf.Variable(0.0)
y=k*x_data+b

#代价函数
loss=tf.reduce_mean(tf.square(y_data-y))
#定义一个梯度下降法优化器来进行训练,下降率为0.2
optimizer=tf.train.GradientDescentOptimizer(0.2)
#最小化代价函数
train=optimizer.minimize(loss)

init=tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    #迭代200次
    for step in range(200):
        sess.run(train)
        #每迭代20次打印一次k,b
        if step%20==0:
            print(step,sess.run([k,b]))

可以看到,经过迭代后,k和b近似于真实的k和b:

总结 :

  • 在tensorflow中,常量通过constant函数来定义。
  • 在tensorflow中,变量通过Variable函数来定义,注意:只要用到变量,就一定要run一下initialize_all_variables()来初始化变量。
  • Session在tensorflow中就像指针一样,指向需要运行的代码。
  • Session运行结束后,需要关闭。
  • Fetch对多个操作节点取值。
  • Feed给占位符赋值。



版权声明:本文为qq_29599907原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。