Tensorflow入门
在看《Tensorflow:实战Google深度学习框架》,自己在网上买了书,PDF下载地址:http://download.csdn.net/download/nsguf/10113564。
Tensorflow计算模型--计算图,这篇文章可以让新手对Tensorflow有一些基本的了解。最开始我看到名字时,我以为就是使用其他语言直接调用即可,而Tensorflow对python的接口做的相对较好,所以之前我对python也进行了一定的学习,等我再来看tensorflow的时候发现,好像对python的要求并不是很高,大部分是Tensorflow自己的调用方法,比如声明变量,直接用tf.Variable()方法即可;还有一个感触就是Tensorflow有自己的一些方法去对变量进行计算,和NumPy有点像。好,现在开始学习。
首先来个小例子,可以对Tensorflow有一个最初的了解,基本没有用到python。
#Tensorflow中的所有计算都会被转化为计算图上的节点,而节点之间的边描述了 #计算之间的依赖关系 import tensorflow as tf #先引用包 print(tf.__version__)#查看版本 hello=tf.constant('Hello')#一个计算,计算结果为一个张量,保存在变量hello中 a=tf.constant([1.0,2.0],name='a') b=tf.constant([2.0,3.0],name='b') g=tf.Graph()#获取整个图 print(a.graph is tf.get_default_graph())#a.graph用于查看张量a所属的计算图
#============================================================================== # with g.device('/gpu:0'):#指定计算运行的设备 # result=a+b #============================================================================== result=a+b#a和b的类型必须一样,否则会报错,所以建议在创建变量时,在后边添加dtype=tf.float32 print(result) print(result.get_shape())#获取维度 #tf.InteractiveSession()加载它自身作为默认构建的session,tensor.eval()和operation.run()取决于默认的session. #换句话说:InteractiveSession 输入的代码少,原因就是它允许变量不需要使用session就可以产生结构。 #会话总结 #============================================================================== # sess=tf.InteractiveSession()#方法一,这是官网上给的方法 # print(result.eval()) # sess.close() #============================================================================== #============================================================================== # sess=tf.Session()#方法二,close方法必须调用,否则造成内存泄漏 # print(sess.run(result))#该方法与下行结果相同 # print(result.eval(session=sess))#在方法一中,则无需指定session # sess.close() #============================================================================== #============================================================================== # with tf.Session() as sess:#改编方法二、利用上下文管理器解决close的调用, # print(sess.run(result)) #============================================================================== #============================================================================== # sess=tf.Session()#Tensorflow会自动生成一个默认的计算图,若没有特殊指定,则运算自动加入,但tensorflow不会自动生成默认的会话 # with sess.as_default():#指定默认会话 # print(result.eval()) #============================================================================== #使用ConfigProto可以对会话进行配置,且对上述两种方法都可 config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)#第一个参数表示当在某些不能在GPU上运算的情况下,自动调整到CPU上,第二个参数表示日志中将会记录每个节点在哪个设备上以方便调试,默认都为false sess1=tf.InteractiveSession(config=config) sess2=tf.Session(config=config) with sess1.as_default(): print(result.eval())
最后的输出是:
1.2.1 Tensor("add_15:0", shape=(2,), dtype=float32) (2,) [ 3. 5.]
从上面例子可以看出,好像用的都是Tensorflow自己的接口。下面再看一个例子,三层简单传播网络的前向传播算法。三层便代表图中的输入层、隐藏层、输出层;除了输入层,其他的神经元都是多个输入一个输出,在该算法中,输出=输入取值的加权和,其实也就相当于矩阵乘法,有兴趣的可以去看看这本书。tf有自己的矩阵乘法接口:tf.matmul(x,w1),代码如下:
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))#声明变量的方法,声明了之后类型不可变,shape可变,使用validate_shape=False参数,但是使用罕见 w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) x=tf.constant([[0.7,0.9]]) #定义向前传播的神经网络 a=tf.matmul(x,w1)#矩阵乘法 y=tf.matmul(a,w2) #============================================================================== # sess=tf.Session() # sess.run(w1.initializer)#创建的变量都要初始化,给变量赋值 # sess.run(w2.initializer) # print(sess.run(y))#只需run最后结果即可 # sess.close() #============================================================================== with tf.Session() as sess: #sess.run(w1.initializer) #sess.run(w2.initializer) tf.global_variables_initializer().run()#初始化所有变量,和上面方法结果一样 print(sess.run(y))#只需run最后结果即可
上述的x是默认的常量,如果需要后面输入怎么办呢?将x的取值换成x=tf.placeholder(tf.float32,shape=(1,2),name='input'),然后在最后run(y)的时候加上参数feed_dict={x: [[0.7,0.9]]}即可,代码如下:
#利用placeholder增加输出 w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))#声明变量的方法,stddev:标准差,mean:平均值,seed:随机数种子 w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) x=tf.placeholder(tf.float32,shape=(1,2),name='input') #定义向前传播的神经网络 a=tf.matmul(x,w1)#矩阵乘法 y=tf.matmul(a,w2) with tf.Session() as sess: tf.global_variables_initializer().run() print(sess.run(y, feed_dict={x: [[0.7,0.9]]}))
其中要注意的是,placeholder中的shape参数值需要和run中的feed_dict中x的值得shape一致,否则报错。如果需要传入多个值也可以,直接将shape和x的值换掉,如下:
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))#声明变量的方法,stddev:标准差,mean:平均值,seed:随机数种子 w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1)) x=tf.placeholder(tf.float32,shape=(3,2),name='input') #定义向前传播的神经网络 a=tf.matmul(x,w1)#矩阵乘法 y=tf.matmul(a,w2) with tf.Session() as sess: tf.global_variables_initializer().run() print(sess.run(y, feed_dict={x: [[0.7,0.9],[0.1,0.4],[0.5,0.8]]}))
最后给出几个方法给参考:
print(tf.all_variables())#获取计算图上所有的变量 print(tf.trainable_variables())#获取需要优化的参数 #Tensorflow随机数生成函数 tf.random_normal()#正态分布 主要参数:平均值,标准差,取值类型 tf.truncated_normal()#正态分布,若随机值偏离平均值超过两个标准差,则重新随机 主要参数:平均值,标准差,取值类型 tf.random_uniform()#均匀分布 主要参数:最小最大取值,取值类型 tf.random_gamma()#Gamma分布 主要参数:形状参数alpha、尺度参数beta、取值类型 #常数生成函数和NumPy很像 tf.zeros([2,3],tf.int32)#全0 tf.ones([2,3],tf.int32)#全1 tf.fill([2,3],9)#全填满后边的参数9 tf.constant([1,2,3])#给定值
都去试一下吧,加深印象。