tensorflow
Come utilizzare le raccolte di grafici TensorFlow?
Ricerca…
Osservazioni
Quando hai un modello enorme, è utile formare alcuni gruppi di tensori nel tuo grafico computazionale, che sono collegati tra loro. Ad esempio la classe tf.GraphKeys contiene raccolte standard come:
tf.GraphKeys.VARIABLES
tf.GraphKeys.TRAINABLE_VARIABLES
tf.GraphKeys.SUMMARIES
Crea la tua collezione e usala per raccogliere tutte le tue perdite.
Qui creeremo la raccolta per le perdite del grafico computazionale della rete neurale.
Prima crea un grafico computazionale in questo modo:
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))
Per creare una nuova raccolta, puoi semplicemente iniziare a chiamare tf.add_to_collection()
- la prima chiamata creerà la raccolta.
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)
E finalmente puoi ottenere tensori dalla tua collezione:
loss = sum(tf.get_collection("my_losses"))
Si noti che tf.get_collection()
restituisce una copia della raccolta o una lista vuota se la collezione non esiste. Inoltre, NON crea la collezione se non esiste. Per fare ciò, è possibile utilizzare tf.get_collection_ref()
che restituisce un riferimento alla collezione e crea effettivamente uno vuoto se non esiste ancora.
Raccogli le variabili dagli ambiti nidificati
Di seguito è riportato un singolo strato nascosto Multilayer Perceptron (MLP) che utilizza l'ambito nidificato delle variabili.
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 utilizza il nome di ambito di livello superiore MLP
e ha due livelli con i rispettivi nomi di ambito fc1
e fc2
. Ogni livello ha anche le proprie variabili di weights
e biases
.
Le variabili possono essere raccolte in questo modo:
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")
I valori delle variabili possono essere raccolti usando il comando sess.run()
. Ad esempio, se desideriamo raccogliere i valori di fc1_weight_vars
dopo l'allenamento, potremmo fare quanto segue:
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]