1. loss function

tf.nn.sparse_softmax_cross_entropy_with_logits(
    labels=None, 
    logits=None
)

tf.nn.softmax_cross_entropy_with_logits(
    labels=None,
    logits=None
)

这两个函数只有输入的labels有区别,前者要输入labels的稠密表示,函数自身就带有将稠密的labels进行one-hot编码的操作;而后者需要输入labels的稀疏编码。比如一个二分类问题,属于第二类的样例的label,稠密表示为:1;稀疏表示为[0, 1]。

* 此处logits就是没经过softmax得到概率分布的网络输出。
此处两个函数的过程分为两步:1. 将logits经过softmax函数获得output的概率分布;2. 利用输出的概率分布和labels计算交叉熵。

上面两个函数的返回值都是Returns: ATensorof the same shape aslabelsand of the same type as ’logits‘ with the softmax cross entropy loss.形状是和logits的维度一致,因此为了转化为一个标量值作为loss function可以写做:

tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(
        labels=None,
        logits=None
    )
)

有了logits,即可对输出进行预测:

loss = tf.argmax(tf,nn.softmax(logits=logits), axis=1)

2. calculate gradients

# 获取所有可训练变量 trainable variable
t_variables = tf.trainable_variables()

# 利用得到的loss,计算训练可训练变量的梯度
gradients = tf.gradients(loss, t_variables, aggregation_method=tf.AggregationMethod.EXPERIMENTAL_TREE)

解释一下gradients(ys, xs, grad_ys=None, name='gradients', colocate_gradients_with_ops=False, gate_gradients=False, aggregation_method=None, stop_gradients=None)的参数:

  1. 第一个参数ys,tensor或tensor list,是关于xs的函数;
  2. 第二个参数xs是可训练变量;主要的功能就是求ys关于xs中的元素的导数;
  3. 返回值是一个和xs参数的shape一致的tensor,得到的结果中si是ys中所有元素对xi的导数之和;

可以利用stop_gradient()函数,阻挡某节点的梯度传递,

node_stopped = tf.stop_gradient(node)

进行梯度裁剪:tf.clip_by_global_norm(t_list, clip_norm, use_norm=None, name=None)返回的第一个参数是梯度的列表,第二个参数是表示global norm一个scalar。

grads, global_norm = tf.clip_by_global_norm(gradients, 1.0)

TensorFlow: Built Graph

3. optimizer

global_step = tf.Variable(0, name="global_step", trainable=False)
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
train_op = optimizer.apply_gradients(
    zip(grads, tvars),
    global_step=global_step
)

先设置一个global_step,在每次优化的时候进行计数。训练的操作要利用optimizer.apply_gradients函数进行训练。
tf.train.AdamOptimizer.apply_gradients(self, grads_and_vars, global_step=None, name=None)函数中,grads_and_vars是梯度和可训练变量,一般用zip函数封装起来;第二个参数是可训练变量global_step,每次调用train_op都会进行一次计数。

4. set args

传入参数的方法分两种:

  1. cmd命令行传入参数
    TensorFlow: Built Graph

  2. pycharm中传入参数
    在bar中,选择Run-Edit Configurations,在parameters中输入参数。参数之间用空格隔断。
    TensorFlow: Built Graph

用上面的方式获取参数列表,此处用程序简单的将参数打印出来:

import sys

# read arguments as a list
args = sys.argv
for i, arg in enumerate(args):
    print(arg)
[Out]: 
D:/Develop/Exercises/tf/tf06_arg.py
mode=train
num_epoch=200
batch_size=64

相关文章: