创建自己的收藏并用它来收集所有的损失

在这里,我们将创建神经网络计算图的损失集合。

首先创建一个如下计算图:

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() 返回对集合的引用,如果尚不存在则实际创建一个空集。