Tensorflow练习上手
基于tensorflow 1.5.0 CPU版本或tensorflow 1.3.0(依撰写时电脑环境定)
1.第一个Tensorflow网络
打开Jupyter Notebook开始第一个Tensorflow网络实践。
tensorflow版本为1.5.0 CPU
import tensorflow as tf #导入tensorflow,并命名为tf
a = tf.constant(3, name='input_a') #申明一个常量节点,取数值为3,命名为input_a
b = tf.constant(5, name='input_b') #申明一个常量节点,取数值为5,命名为input_b
c = tf.multiply(a,b,name='mult_c') #申明一个乘法输出节点,为a,b的积,命名为mult_c
d = tf.add(a,b, name='add_d') #申明一个加法输出节点,为a,b的和,命名为add_d
e = tf.add(c,d, name='add_e') #申明一个加法输出节点,为c,d的和,命名为add_e
sess = tf.Session() #申明一个tensorflow Session变量,任何一个tensorflow网络都需要一个Session变量,以便后续进行运行
sess.run(e) #运行网络,输出节点e
执行的结果为
23
该结果为3 * 5 + 3 + 5 = 23
这里23是运行结果。我们可以使用“="将运行结果赋值给某个变量。比如:
output = sess.run(e)
这里在cmd下执行会有一个提示:
Your CPU supports instructions that this TensorFlow binary was not compiled to use:AVX
这里并不深究原因,毕竟是第一个tensorflow网络,只要能跑下去,暂且不管性能的问题。
2.将网络数据流图可视化
打开之前的简单tensorflow网络
tensorflow版本为1.5.0 cpu
可视化的目的是为了更好的理解以及介绍网络。要使用可视化,需要使用TensorBoard。TensorBoard会伴随Tensorflow一起安装。
首先需要创建一个SummaryWriter对象,并用之来保存数据流图的数据和概括统计量。
writer = tf.summary.FileWriter('./my_graph',sess.graph) #将sess的数据流图和数据和概括统计量存入执行目录下的my_graph目录,输入为sess的graph属性
此时找到当前python执行的my_graph文件夹,查询是否有执行后的graph文件。一般命名为:
events.out.tfevents.1519047535.XXXX
这里xxxx是电脑名。这说明writer这句执行成功。
然后在cmd执行
c:\>tensorboard --logdir="my_graph" #启动tensorboard并画出之前存的graph文件。
注意这里logdir后面是“=”号,没有空格,"mygraph"不能用'mygraph'。否则都会因为找不到文件夹而显示没有图标。
命令输入后会显示:
TensorBoard 1.5.1 at http://XXXX:6006 <Press CTRL+C to quit>
新开一个浏览器,在地址栏输入http://XXXX:6006,即可进入TensorBoard界面。
完成查看后,使用以下命令撤销使用的资源,结束本次练习。
writer.close()
sess.close()
3.将上述的网络变为以张量表示
所谓张量,其实也可以称为向量,不过这里为了区别于数学中的定义,称为张量。 下面回到之前的网络:
tensorflow版本为1.5.0 GPU
import tensorflow as tf
a = tf.constant([5,3], name='input_a') #定义一个张量常数,该张量(向量)为1维,替代之前a,b两个常数,并命名为input_a
b = tf.reduce_prod(a, name='prod_b') #张量乘法,当引入的为张量时,可以接收所有张量并进行乘法操作,此处为5*3
c = tf.reduce_sum(a, name='sum_c') #张量加法,当引入的为张量时,可以接收所有的张量并进行加法操作,此处为5+3
d = tf.add(b,c, name='add_d')
sess = tf.Session()
sess.run(d)
计算的结果为23,即5*3+5+3 = 23
4.张量的形状
前面推出了从常数到张量的演变。下面介绍张量的表示方式。
在matlab里,申明一个3*4维矩阵使用如下语句:
matrix_1 = zeros(4*3);
这里(4*3)描述了这个矩阵的形状。同样,在tensorflow中定义一个张量的形状(shape)用类似的方法。由于张量可以是列表(list),也可以是元组(tuple)。因此分开写。
tensorflow版本为1.5.0 GPU
#list型
a = [] #定义一个0阶张量,即常数
b = [3] #定义一个长度为3的1阶张量,即1维向量
c = [3,2] #定义一个3*2维张量
d = [None] #定义一个任意长度的张量
e = [None,3] #定义一个行数任意,列数为3的2阶张量
f = [3,None,None] #定义一个一维为3,2,3维长度任意的3阶张量
#tuple型
a = () #定义一个0阶张量,即常数
b = (3) #定义一个长度为3的1阶张量,即1维向量
c = (3,2)#定义一个3*2维张量
d = (None) #定义一个任意长度的张量
e = (None,3) #定义一个行数任意,列数为3的2阶张量
f = (3,None,None) #定义一个一维为3,2,3维长度任意的3阶张量
若想知道一个张量的维度,可以使用".shape"来查询。
import tensorflow as tf
a = [] #定义一个0阶张量,即常数
b = [3] #定义一个长度为3的1阶张量,即1维向量
c = [3,2] #定义一个3*2维张量
d = [None] #定义一个任意长度的张量
e = [None,3] #定义一个行数任意,列数为3的2阶张量
f = [3,None,None] #定义一个一维为3,2,3维长度任意的3阶张量
shape_a = tf.shape(a, name='shape_a') #定义张量a的shape名字为shape_a
shape_b = tf.shape(b, name='shape_b') #定义张量b的shape名字为shape_b 这里名字重名并不影响结果,可能影响可视化图上的名称标注
shape_c = tf.shape(c, name='shape_c') #定义张量c的shape名字为shape_c 这里名字重名并不影响结果,可能影响可视化图上的名称标注
#shape_d = tf.shape(d, name='shape_d') #长度里头有None这种不确定项的无法使用shape命令
sess.tf.Session()
output = []
output.append(sess.run(shape_a))
output.append(sess.run(shape_b))
output.append(sess.run(shape_c))
output的输出为
[array([0]), array([1]), array([2])]