创建自己的收藏并用它来收集所有的损失
在这里,我们将创建神经网络计算图的损失集合。
首先创建一个如下计算图:
with tf.variable_scope("Layer"):
W = tf.get_variable("weights", [m, k],
initializer=tf.zeros_initializer([m, k], dtype=tf.float32))
b1 = tf.get_variable("bias", [k],
initializer = tf.zeros_initializer([k], dtype=tf.float32))
z = tf.sigmoid((tf.matmul(input, W) + b1))
with tf.variable_scope("Softmax"):
U = tf.get_variable("weights", [k, r],
initializer=tf.zeros_initializer([k,r], dtype=tf.float32))
b2 = tf.get_variable("bias", [r],
initializer=tf.zeros_initializer([r], dtype=tf.float32))
out = tf.matmul(z, U) + b2
cross_entropy = tf.reduce_mean(
tf.nn.sparse_softmax_cross_entropy_with_logits(out, labels))
要创建新集合,你只需开始调用 tf.add_to_collection()
- 第一个调用将创建集合。
tf.add_to_collection("my_losses",
self.config.l2 * (tf.add_n([tf.reduce_sum(U ** 2), tf.reduce_sum(W ** 2)])))
tf.add_to_collection("my_losses", cross_entropy)
最后,你可以从你的收藏中获得张量:
loss = sum(tf.get_collection("my_losses"))
请注意,如果集合不存在,tf.get_collection()
将返回集合的副本或空列表。此外,如果它不存在,它不会创建集合。为此,你可以使用 tf.get_collection_ref()
返回对集合的引用,如果尚不存在则实际创建一个空集。