Tensorflow记录(1)
A simple neural network
1 | def training(X, Y): |
一个很简单的神经网络,但一般tensorflow训练neural network的步骤大致如此:
- 定义网络结构和前向传播的输出结果
- 定义损失函数和选择反向传播优化算法
- 生成会话(tf.Session),并在训练数据集上反复运行优化算法
优化 learning rates
Learning rate 决定了参数每次更新的幅度,如果幅度过大,则可能导致参数在极优值两侧来回移动. 可以通过使学习率衰减的方式来避免这样的情况发生:
1 | decayed_learning_ratee = learning_rate * decay_rate ^ (global_step / decay_steps) |
其中learning_rate为初始学习率,decay_rate为衰减率,decay_steps为衰减速度,在tensorflow中可以这样实现:
1 | tf.train.exponential_decay( |
L1 && L2
在tensorflow中,实现L1和L2正则化非常简单:
1 | loss = tf.reduce_mean(tf.square(output - y)) + tf.contrib.layers.l2_regularizer(lambda_)(weights) |
但当网络结构或程序结构比较复杂时,网络结构的定义代码和计算损失函数部分的代码可能不在同一个函数内,这样通过变量这样的方式就不方便了,可以使用tensorflow中提供的collection,which can store a group of entity(like tensor) on the computation graph(tf.Graph), codes are shown below :
1 | def get_weight(shapee, lambda): |
变量管理
当程序比较复杂时,在不同的函数直接传递参数是一件很麻烦的事情,tensorflow提供了通过变量名来创建或者获取一个变量的机制. 其中主要通过 tf.get_variable() 和 tf.variable_scope() 实现.
1 | # 以下两个定义是等价的 |
对于 tf.get_variable() 来说,参数中的变量名称是必填的. tf.variable_scope() 是一个上下文管理器.
1 | with tf.variable_scope('foo'): |
当 tf.variable_scope() 函数使用参数 reuse=True 时,这个上下文管理内的 tf.get_variable() 函数会直接获取已经创建的变量,如果变量不存在则报错;当 reuse=False 或 reuse=None 时, tf.get_variable() 函数将创建新的变量,如果变量已存在则报错. 下面的例子用来展示一个实际的小应用:
1 | def inference(input_tensor, resue=False): |