tensorflow
TensorFlow 그래프 컬렉션을 사용하는 방법?
수색…
비고
거대한 모델을 가지고있을 때, 서로 연결되어있는 계산 그래프에 몇 가지 텐서 그룹을 형성하는 것이 유용합니다. 예를 들어, 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()
됩니다. 첫 번째 호출이 컬렉션을 만듭니다.
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 (Multilayer Perceptron)입니다.
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
사용하며 각각의 범위 이름이 fc1
및 fc2
두 개의 레이어가 있습니다. 각 계층에는 자체 weights
및 biases
변수가 있습니다.
변수는 다음과 같이 수집 할 수 있습니다.
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
의 값을 수집하려면 다음을 수행 할 수 있습니다.
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]