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])#给定值

  都去试一下吧,加深印象。

posted @ 2017-09-01 17:43  NSGUF  阅读(511)  评论(0编辑  收藏  举报