tensorflow review 1(基础)


tensorflow 基础

张量的类型

张量在tensorflow中并没有真正的计算只是保存了计算过程。
一个张量中主要保存了三个属性,name,shape和type
image

计算图上一个节点就代表一个计算,计算的结果就保存在张量中。通常张量的命名通过node:src_output的形式来给出,add:0表示来自计算节点add输出的第一个结果

tensorflow通常通过dtype来指定实数类型,tensorflow支持14种不同的类型包括实数(tf.float32,tf.float64),整数(tf.int8,tf.int16,tf.int32,tf.int64,tf.uint8)布尔型(tf.bool)和复数(tf.complex64,tf.complex128)

tensorflow运行模型——会话

tensorflow中通过会话来执行定义好的运算,当所有计算完成后需要关闭会话来回收资源
会话的两种模式:

  1. 明确需要调用会话生成函数和关闭会话函数
sess = tf.Session()
sess.run(something)
sess.close()

通过python上下文管理器来使用会话可以避免因为异常而出错的情况

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

tensorflow不会自动生成会话而需要手动指定,当默认会话被指定后可以通过eval函数来计算张量的取值。

sess = tf.Session()
with sess.as_default():
    print(result.eval())
# 同样也可以通过一下代码来完成
sess = tf.Session()
print(sess.run(result))
print(result.eval(session=sess))

为了方便,tensorflow提供了一种直接构建默认会话的函数,tf.InteractiveSession,会将生成的会话注册成默认会话

sess = tf.InteractiveSession()
print(result.eval())
sess.close()

神经网络参数和tensorflow变量

tf.Variable的作用就是保存和更新神经网络中的参数,在变量声明函数中给出了初始化这个变量的方法。变量的初始值可以为随机数,常数,或者是通过其他变量法的初始值计算得到
image

weights = tf.Variable(tf.random_normal([2,3],stddev=2))

image

w2 = tf.Variable(weights.initialized_value())

在tensorflow中一个变量的值被使用之前需要被明确的调用。

import tensorflow as tf
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1))
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)  # 初始化w1
sess.run(w2.initializer)  # 初始化w2
# 初始化变量之后才能计算a,y
print(sess.run(y))
sess.close()
[[ 3.95757794]]

深层神经网络

# 计算交叉熵
y = tf.nn.softmax(tf.matmul(x, W) + b) 
cross_entropy = -tf.reduce_mean(tf.reduce_sum(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)),reduction_indices=1))
# 或者在tensorflow中一行代码
cross_entropy = tf.nn.softmax_cross_entropy(y,y_)

指数衰减法更新学习率

decay_rate是衰减系数,decay_steps是衰减速度
tf.train.exponential_decay函数可以通过设置参数staircase选择不同的衰减方式,当staircase=True时,global_step/decay_steps会被转换成整数
decayed_learning_rate = learning_rate*decay_rate^(global / dacay_steps)
global_step = tf.Variable(0)
learning_rate = tf.train.exponential_decay(0.1,global_step,100,0.96,starcase=True)
# 使用指数衰减的学习率,在minimize函数中传入global_step将自动更新global_step参数从而使得学习率也得到更新
learning_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(myloss,global_step=global_step)

正则化

loss = tf.reduce_mean(tf.square(y_-y)) + tf.contrib.layers.l2_regularizer(0.5)(w1)
但是当网络参数增多之后这样会导致loss的定义很长,可以使用collection解决这个问题
# 获取一层神经网络的权重,并将这个权重的L2正则化损失加入名称为'losses'的集合中
def get_weight(shape, lmbda):
    var = tf.Variable(tf.random_normal(shape), dtype=tf.float32)
    # add_to_collection函数将这个新生成变量的L2正则化损失加入集合
    tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(lmbda)(var))
    return var

x = tf.placeholder(tf.float32, shape=(None,2))
y_ = tf.placeholder(tf.float32, shape=(None,1))
batch_size = 8
# 定义了每一层网络中节点的个数
layer_dimension = [2,10,10,10,1]
n_layers = len(layer_dimension)
# 这个变量维护前向传播时最深层的节点,开始的时候就是输入层
cur_layer = x
# 当前层的节点个数
in_dimension = layer_dimension[0]
for i in range(1, n_layers):
    out_dimension = layer_dimension[i]
    #生成当前层中权重的变量,并将这个变量的L2正则化损失加入计算图上的集合
    weight = get_weight([in_dimension, out_dimension], 0.001)
    bias = tf.Variable(tf.constant(0.1, shape=[out_dimension]))
    cur_layer = tf.nn.relu(tf.mamul(cur_layer, weight) + bias)
    in_dimension = layer_dimension[i]

mse_loss = tf.reduce(tf.square(y_ - cur_layer))
# 将均方误差加入损失集合
tf.add_to_collection('losses', mse_loss)
loss = tf.add_n(tf.get_collection('losses'))

滑动平均模型

滑动平均模型可以在一定程度上提高模型准确率
tf.train.ExponentialMovingAverage对每一个变量会维护一个影子变量,这个影子变量的初始值就是相应变量的初始值,而每次运行变量更新时,影子变量的值会更新为:
shadow_variable = decay*shadow_variable+(1-decay)*variable
# 定义一个变量用于计算滑动平均,初始值为0
v1 = tf.Variable(0, dtype=tf.float32)
# step模拟神经网络迭代的轮数,可以动态控制衰减率
step = tf.Variable(0, trainable=False)
ema = tf.train.ExponentialMovingAverage(0.99, step)
# 定义一个更新变量滑动平均的操作,这里需要指定一个列表
maintain_averages_op = ema.apply([v1])
with tf.Session() as sess:
    init_op = ...
    sess.run(init_op)

image


文章作者: lovelyfrog
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 lovelyfrog !
  目录