1.导入TensorFlow
import tensorflow as tf
2.计算图
TensorFlow 核心程序由两个独立的部分组成:
- 1.创建计算图
- 2.运行计算图
计算图是一系列 tensorflow 的操作被排列成节点图的过程。
(1) tf.constant()
node1 = tf.constant(4.0,dtype = tf.float32)
node2 = tf.constant(3.0)
print(node1,node2)
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
上面打印的结果没有预想地输出 3.0 和 4.0,这是因为 TensorFlow 一定要在 session 中运行计算图。一个 session 封装了 TensorFlow 运行时的控制和状态。创建 session 并调用 run() 来运行计算图,如下所示:
with tf.Session() as sess:
s = sess.run([node1,node2])
print(s)
[4.0, 3.0]
(2) tf.placeholder()
用 tf.constant 创建的都是不变的量,还可以用一种参数化的方法来创建输入,然后在 session 中运行的时候,喂入数据。这也可以理解为 placeholder 名字的由来,先占着一个位子,后续用到的时候再在该位子上投入数据。
a = tf.placeholder(tf.int32)
b = tf.placeholder(tf.int32)
c = tf.add(a,b)
sess = tf.Session()
print(sess.run(c,{a:1,b:3}))
print(sess.run(c,{a:[1,2],b:[2,3]}))
4
[3 5]
(3) tf.Variable()
在深度学习中,往往需要一个模型能够进行任意的输入(权重 weight 和偏差 bias)以使得模型更好地预测输出值。tf.constant 和 tf.placeholder 都实现不了这样的需求。这时就需要引入 tf.Variable(), Variable 由类型和初始数值组成:
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)
x = tf.placeholder(tf.float32)
linear_model = W*x + b
与常量不同的是,创建了变量后必须要进行初始化操作,可以使用tf.global_variables_initializer()
来初始化全部的变量。
后续详细补充一下 Variabe 这块的内容
但需要注意的是:tf.global_variables_initializer() 不是万能的,在变量之间存在依赖关系的时候,可能会出现初始化错误,此时需要先通过局部初始化的方式初始化部分变量,或者对于需要在其他变量初始化的基础上通过运算得到的变量中采用 variable.initialized_value() 来显式的表明初始化顺序。
init = tf.global_variables_initializer()
sess.run(init)
- 随机生成 weight 可以调用 tf.truncated_normal(),这样采取的是截断正态分布的方法,生成的值服从具有指定平均值和标准差的正态分布,如果生成的值大于平均值 2 个标准差(2σ)则丢弃重新选择,这样做能防止任何一个随机权重压倒其他权重。采用正态分布的方法则调用
tf.random_normal()
可以查看谷歌TensorFlow的api文档中关于tf.truncated_normal()的说明。
可以查看这篇笔记对于权重初始化的研究能更清晰为什么使用截断正态分布。
随机初始化权重的原因是防止模型训练时卡在某一点。
n_features = 784
n_labels = 10
weigths = tf.Variable(tf.truncated_normal([n_features, n_labels]))
- 随机生成 bias 可以调用最简单的方法 tf.zeros()。因为权重随机初始化已经防止了模型训练卡在某一点,所以用最简单的方法初始化 bias 就好。
n_labels = 10
bias = tf.Variable(tf.zeros(n_labels))
(4) 创建session的两种方法
- 方法一:
with tf.Session() as sess :
sess.run(tf.global_variables_initializer())
采用方法一,最后会自动关闭 session。
- 方法二:
sess = tf.Session()
sess.run(tf.global_variables_initializer())
sess.close()
采用方法二,最后需要手动关闭 session。
3. 启动 TensorBoard
首先将计算图保存为 TensorBoard 摘要文件,具体操作如下所示:
import tensorflow as tf
a = tf.constant(3.0, name='a')
b = tf.constant(4.0, name='b')
c = tf.constant(5.0, name='x')
x = tf.multiply(c, tf.add(a, b))
# Create the summary writer after graph definition and before running your session
writer = tf.summary.FileWriter('./graphs', tf.get_default_graph())
sess = tf.Session()
print(sess.run(x))
writer.close() # close the writer when you’re done using it
之后会在当前工作目录下生成 graphs
的子目录,该目录包含 event
文件,文件名称如下所示:
events.out.tfevents.{timestamp}.{hostname}
然后在新的终端 cd 到工作目录,然后执行以下命令:
tensorboard --logdir "./graphs"
执行后会出现如下结果:
2019-03-12 15:37:54.346189: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2019-03-12 15:37:54.773453: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1356] Found device 0 with properties:
name: GeForce GTX 1060 6GB major: 6 minor: 1 memoryClockRate(GHz): 1.7715
pciBusID: 0000:01:00.0
totalMemory: 6.00GiB freeMemory: 4.97GiB
2019-03-12 15:37:54.779131: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:1435] Adding visible gpu devices: 0
2019-03-12 15:37:55.477459: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-03-12 15:37:55.481515: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:929] 0
2019-03-12 15:37:55.483649: I T:\src\github\tensorflow\tensorflow\core\common_runtime\gpu\gpu_device.cc:942] 0: N
TensorBoard 1.8.0 at http://DESKTOP-S10OVAS:6006 (Press CTRL+C to quit)
把最后出现的链接 http://DESKTOP-S10OVAS:6006
复制到浏览器,就可以查看到如下结果:
4. 搭建简单的神经网络
- 使用
tf.nn.relu()
调用 relu 激活函数 - 使用
tf.nn.sigmoid()
调用 sigmoid 激活函数
import tensorflow as tf
# intput
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
# weigths
weights_1 = tf.Variable(tf.truncated_normal([3, 2]), tf.float32)
weights_2 = tf.Variable(tf.truncated_normal([2, 1]), tf.float32)
# bias
bias_1 = tf.Variable(tf.zeros([3, 2]), tf.float32)
bias_2 = tf.Variable(tf.zeros([1]), tf.float32)
# bulid a Neural Network
input = x
hidden_layer = tf.nn.relu(tf.add(tf.matmul(x, weights_1), bias_1))
output = tf.nn.sigmoid(tf.add(tf.matmul(hidden_layer, weights_2), bias_2))
with tf.Session() as sess :
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(output,{x: [[1,2,3]], y: [[1,2,3]]}))
5. 计算神经网络的损失
import tensorflow as tf
# intput
x = tf.placeholder(tf.float32)
y = tf.placeholder(tf.float32)
# weigths
weights_1 = tf.Variable(tf.truncated_normal([3, 2]))
weights_2 = tf.Variable(tf.truncated_normal([2, 1]))
# bias
bias_1 = tf.Variable(tf.zeros([3, 2]))
bias_2 = tf.Variable(tf.zeros([1]))
# bulid a Neural Network
input = x
hidden_layer = tf.nn.relu(tf.add(tf.matmul(x, weights_1), bias_1))
output = tf.nn.sigmoid(tf.add(tf.matmul(hidden_layer, weights_2), bias_2))
# loss--Cross Entropy
loss = - y * tf.log(output) - (1 - y) * tf.log(1 - output)
with tf.Session() as sess :
init = tf.global_variables_initializer()
sess.run(init)
#print(sess.run(output,{x: [[1,2,3]], y: [[1]]}))
print(sess.run(loss,{x: [[1,2,3]],y: [[1]]}))