tensorflow
Hur använder man TensorFlow grafsamlingar?
Sök…
Anmärkningar
När du har en enorm modell är det användbart att bilda några grupper av tensorer i din beräkningsgraf, som är kopplade till varandra. Till exempel innehåller tf.GraphKeys-klassen sådana standartkollektioner som:
tf.GraphKeys.VARIABLES
tf.GraphKeys.TRAINABLE_VARIABLES
tf.GraphKeys.SUMMARIES
Skapa din egen samling och använd den för att samla alla dina förluster.
Här skapar vi samling för förluster av Neural Network: s beräkningsgraf.
Skapa först en beräkningsgraf som så:
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))
För att skapa en ny samling kan du helt enkelt börja ringa tf.add_to_collection()
- det första samtalet skapar samlingen.
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)
Och slutligen kan du få tensorer från din samling:
loss = sum(tf.get_collection("my_losses"))
Observera att tf.get_collection()
returnerar en kopia av samlingen eller en tom lista om samlingen inte finns. Dessutom skapar den INTE samlingen om den inte finns. För att göra det kan du använda tf.get_collection_ref()
som returnerar en referens till samlingen och faktiskt skapar en tom om den inte finns ännu.
Samla variabler från kapslade områden
Nedan visas ett doldt lager Multilayer Perceptron (MLP) med kapslad omfång av variabler.
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 använder toppnivånamnet MLP
och har två lager med respektive omfattningsnamn fc1
och fc2
. Varje lager har också sina weights
och biases
.
Variablerna kan samlas på så sätt:
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")
Värdena på variablerna kan samlas in med sess.run()
. Om vi till exempel vill samla värdena på fc1_weight_vars
efter träning kan vi göra följande:
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]