tensorflow:TensorBoard, Oprations, Variables, Placeholder

1 TensorBoard

首先我们来测试一个最简单的例子,看怎么使用TensorBoad,如下代码:

# -*-coding:utf8 -*-
import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVRL']='2'

def add():
	a = tf.constant(2, name='a')
	b = tf.constant(3, name='b')
	x = tf.add(a,b, name='add')
	write = tf.summary.FileWriter('./graphs', tf.get_default_graph())
	with tf.Session() as sess:
		print(sess.run(x))

if __name__=='__main__':
	add()

接下来,让我们看看怎么调用tensorboard,首先,执行程序,然后图结构会存储在目录graphs中,再开启tensorboard:

tensorboard --logdir="./graphs" --port 6006

然后打开本地浏览器:http://localhost:6006/
接下来,我们就可以看到我们定义的图,如下所示:

在这里插入图片描述
TensorBoard不仅可以可视化图结构,而且还可以做很多其它的重要事,模型训练过程中loss,学习率等变化情况,用图形化展示结果,可以更好的分析问题。

2 Constants

2.1 自定义常量:

tf.constant(
	value,
	dtype=None,
	shape=None,
	name='Const',
	verify_shape=False
	)

让我们看一个简单的程序:

# -*-coding:utf8 -*-
import tensorflow as tf

def constant():
	a = tf.constant([2, 2], name='a')
	b = tf.constant([[0,1],[2,3]], name='b')
	x = tf.multiply(a, b, name='mul')
	with tf.Session() as sess:
		print(sess.run(x))

if __name__=='__main__':
	constant()

运行结果如下:
[[0 2]
[4 6]]

2.2 特殊值常量

我们还可以调用一些特殊函数,主要有如下类型:

  • tf.zeros(shape, dtype=tf.float32, name=None)
 eg: tf.zeros([2,3], t.int32) ==> [[0, 0, 0], [0, 0, 0]]
  • tf.zeros_like(input_tensor, dtype=None, name=None, optimize=True)
 eg: input_tensor is [[0,1],[2,3],[4,5]]
 tf.zeros_like(input_tensor) ==> [[0,0],[0,0],[0,0]]
  • tf.ones(shape, dtype=tf.float32, name-None)
  • tf.ones_like(input_tensor, dtype=None, name=None, optimize=True)
  • tf.fill(dims, value, name=None)
tf.fill([2,3], 8) ==> [[8,8,8],[8,8,8]]
  • tf.lin_space(start, stop, num, name=None)
tf.lin_space(10.0, 13.0, 4) ==> [10. 11. 12. 13.]
  • tf.range(start, limit=None, delta=1, dtype=None, name=‘range’)
tf.range(3, 18, 3) ==> [3 6 9 12 15]
tf.range(5) ==> [0 1 2 3 4]

2.3 随机常量

  • tf.random_normal
  • tf.truncated_normal
  • tf.random_uniform
  • tf.random_shuffle
  • tf.random_crop
  • tf.multinomial
  • tf.random_gamma

3 Oprations

tensorflow自定义很多Ops,按照功能类别主要分为如下几类:

类别 常用函数
element-wise数值计算 Add, Sub, Mul, Div, Exp, Log, Greater, Less, Equal, …
array数组计算 Concat, Slice, Split, Constant, Rank, Shape, Shuffle, …
矩阵计算 MatMul, MatrixInverse, MatrixDeterminant, …
状态操作 Variable, Assign, AssignAdd, …
神经网络函数 SoftMax, Sigmoid, ReLU, Convolution2D, MaxPool, …
队列操作 Enqueue, Dequeue, MutexAcquire, MutexRelease, …
控制流操作 Merge, Switch, Enter, Leave, NextIteration

3.1 数值计算Ops

在这里插入图片描述
这些函数与numpy里的函数很相似。

3.2 tensorflow中的数据类型

tensorflow中的数据类型主要有: 布尔型(boolean), 数值型(int, float)和字符串(strings)。
Tensorflow集成了Numpy的数据结构,tf.int32等于np.int32。在tensorflow里,要注意的是,常量值存储在图的定义中,所以如果常量值很多的时候,加载图将会代价很大。如下代码:

import tensorflow as tf
const = tf.constant([1.0, 2.0], name="const")
with tf.Session() as sess:
	print(sess.graph.as_graph_def())

运行结果如下:
在这里插入图片描述
常量数值都存储在图的定义之中。所以,当数据量很大,一般用variables或者readers类型定义。

4 Variables

定义参数主要有如下两种形式:

4.1 tf.Variable

如下定义:

s = tf.Variable(2, name="scalar")
m = tf.Variable([[0,1],[2,3]], name="matrix")
W = tf.Variable(tf.zeros([784, 10]))

tf.constant只是一个op,tf.Variable是一个class,由多个op组成,例如:
x = tf.Variable(…)
这个过程有初始化 x.initializer,读值 x.value(),写值 x.assign(…)等op。

4.2 tf.get_variable

s = tf.get_variable("scalar", initializer=tf.constant(2))
m = tf.get_variable("matrix", initializer=tf.constant([[0,2],[2,3]]))
W = tf.get_variable("big_matrix", shape=(784, 10), initializer=tf.zeros_initializer())

虽然tf.Variable和tf.get_variable都可以定义参数,但是推荐使用tf.get_variable,可以共享变量,更灵活的初始化值等。
接下来,让我们打印参数W的值,看一看:

with tf.Session() as sess:
	print(sess.run(W))

结果如下:
在这里插入图片描述
竟然报错!当你要执行一个op的时候,必须先初始化variables。最简单的办法就是一次性初始化所有变量 :

with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())

初始化部分参数变量:

with tf.Session() as sess:
	sess.run(tf.variables_initializer([s,m]))

初始化一个参数变量:

with tf.Session() as sess:
	sess.run(W.initializer)

初始化完后,我们来看下打印参数值:

with tf.Session() as sess:
	print(W.eval())

结果如下:
在这里插入图片描述
其中print(W.eval())与print(sess.run(W))是等价的,都是打印出参数值。

4.3 tf.Variable.assign()

import tensorflow as tf
W = tf.Variable(10)
W.assign(100)
with tf.Session() as sess:
	sess.run(W.initializer)
	print(W.eval())

上述程序,参数W的值是多少呢?答案是:10
看来是没起效果,因为,W.assign(100)只是定义了一个op,如果要想其作用,必须在一个session里执行它,改动下形式如下:

import tensorflow as tf
W = tf.Variable(10)
assign_op = W.assign(100)
with tf.Session() as sess:
	sess.run(W.initializer)
	sess.run(assign_op)
	print(W.eval())

结果终于正确了:100

5 Placeholder

在tensorflow里,一般分两步:

  • 集成构造一个graph
  • 用session执行图里的operations

在第一步里,集成构造一个图不需要真实的数值进行计算。例如:我们在定义一个函数的时候 f ( x , y ) = 2 ∗ x + y f(x,y)=2*x+y f(x,y)=2x+y,我们不需要知道 x x x y y y的值, x x x y y y只是一个占位符。
接下来我们看看tensorflow中的placeholder函数:

tf.placeholder(dtype, shap=None, name=None)

让我们来看怎么使用placeholder:

a = tf.placeholder(tf.float32, shape=[3])
b = tf.constant([5, 5, 5], tf.float32)
c =tf.add(a, b)
with tf.Session() as sess:
	print(sess.run(c, feed_dict={
    
    a: [1,2,3]}))

输出值为:[6, 7, 8],用feed_dict传送任何需要传值的的tensor。

猜你喜欢

转载自blog.csdn.net/BGoodHabit/article/details/108973399