サーチ…


備考

あなたは巨大なモデルを持っているとき、お互いにつながっているいくつかのテンソル群をあなたの計算グラフに形成することは有益です。たとえば、tf.GraphKeysクラスには次のようなスタンドア렛コレクションが含まれています。

tf.GraphKeys.VARIABLES
tf.GraphKeys.TRAINABLE_VARIABLES
tf.GraphKeys.SUMMARIES

あなた自身のコレクションを作成し、あなたのすべての損失を集めるためにそれを使用してください。

ここでは、ニューラルネットワークの計算グラフの損失のコレクションを作成します。

まず、次のような計算グラフを作成します。

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()を使用し、まだ存在しない場合は空のコレクションを作成します。

入れ子スコープから変数を収集する

以下は、ネストされた変数のスコープを使用する単一の隠れ層の多層パーセプトロン(MLP)です。

def weight_variable(shape):
    return tf.get_variable(name="weights", shape=shape,
                           initializer=tf.zeros_initializer(dtype=tf.float32))

def bias_variable(shape):
    return tf.get_variable(name="biases", shape=shape,
                           initializer=tf.zeros_initializer(dtype=tf.float32))

def fc_layer(input, in_dim, out_dim, layer_name):
    with tf.variable_scope(layer_name):
        W = weight_variable([in_dim, out_dim])
        b = bias_variable([out_dim])
        linear = tf.matmul(input, W) + b
        output = tf.sigmoid(linear)

with tf.variable_scope("MLP"):
    x = tf.placeholder(dtype=tf.float32, shape=[None, 1], name="x")
    y = tf.placeholder(dtype=tf.float32, shape=[None, 1], name="y")
    fc1 = fc_layer(x, 1, 8, "fc1")
    fc2 = fc_layer(fc1, 8, 1, "fc2")

mse_loss = tf.reduce_mean(tf.reduce_sum(tf.square(fc2 - y), axis=1))

MLPは、トップレベルのスコープ名の使用MLPし、それは、それぞれのスコープ名を持つ2つの層があるfc1fc2 。各レイヤーにも独自のweightsbiases変数があります。

変数は次のように収集できます。

trainable_var_key = tf.GraphKeys.TRAINABLE_VARIABLES
all_vars = tf.get_collection(key=trainable_var_key, scope="MLP")
fc1_vars = tf.get_collection(key=trainable_var_key, scope="MLP/fc1")
fc2_vars = tf.get_collection(key=trainable_var_key, scope="MLP/fc2")
fc1_weight_vars = tf.get_collection(key=trainable_var_key, scope="MLP/fc1/weights")
fc1_bias_vars = tf.get_collection(key=trainable_var_key, scope="MLP/fc1/biases")

変数の値は、 sess.run()コマンドを使用して収集できます。たとえば、 fc1_weight_vars後にfc1_weight_varsの値を収集する場合は、次のようにします。

sess = tf.Session()
# add code to initialize variables
# add code to train the network
# add code to create test data x_test and y_test

fc1_weight_vals = sess.run(fc1, feed_dict={x: x_test, y: y_test})
print(fc1_weight_vals)  # This should be an ndarray with ndim=2 and shape=[1, 8]


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow