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: A
Tensorof the same shape as
labelsand 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)
的参数:
- 第一个参数ys,tensor或tensor list,是关于xs的函数;
- 第二个参数xs是可训练变量;主要的功能就是求ys关于xs中的元素的导数;
- 返回值是一个和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)
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
传入参数的方法分两种:
-
cmd命令行传入参数
-
pycharm中传入参数
在bar中,选择Run-Edit Configurations,在parameters中输入参数。参数之间用空格隔断。
用上面的方式获取参数列表,此处用程序简单的将参数打印出来:
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