Une autre option pour réaliser cela avec la bibliothèque contrib.learn
est la suivante, basée sur le tutoriel Deep MNIST sur le site de Tensorflow. Tout d'abord, en supposant que vous avez importé les bibliothèques pertinentes (telles que import tensorflow.contrib.layers as layers
), vous pouvez définir un réseau dans une méthode séparée :
def reseau_plus_facile(x, reg):
""" Un réseau basé sur tf.contrib.learn, avec l'entrée `x`. """
with tf.variable_scope('EasyNet'):
out = layers.flatten(x)
out = layers.fully_connected(out,
num_outputs=200,
weights_initializer = layers.xavier_initializer(uniform=True),
weights_regularizer = layers.l2_regularizer(scale=reg),
activation_fn = tf.nn.tanh)
out = layers.fully_connected(out,
num_outputs=200,
weights_initializer = layers.xavier_initializer(uniform=True),
weights_regularizer = layers.l2_regularizer(scale=reg),
activation_fn = tf.nn.tanh)
out = layers.fully_connected(out,
num_outputs=10, # Parce qu'il y a dix chiffres!
weights_initializer = layers.xavier_initializer(uniform=True),
weights_regularizer = layers.l2_regularizer(scale=reg),
activation_fn = None)
return out
Ensuite, dans une méthode principale, vous pouvez utiliser le code suivant :
def principal(_):
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)
x = tf.placeholder(tf.float32, [None, 784])
y_ = tf.placeholder(tf.float32, [None, 10])
# Créer un réseau avec régularisation
y_conv = reseau_plus_facile(x, FLAGS.regu)
weights = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, 'EasyNet')
print("")
for w in weights:
shp = w.get_shape().as_list()
print("- {} shape:{} size:{}".format(w.name, shp, np.prod(shp)))
print("")
reg_ws = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES, 'EasyNet')
for w in reg_ws:
shp = w.get_shape().as_list()
print("- {} shape:{} size:{}".format(w.name, shp, np.prod(shp)))
print("")
# Créer la fonction de perte `loss_fn` avec régularisation.
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
loss_fn = cross_entropy + tf.reduce_sum(reg_ws)
train_step = tf.train.AdamOptimizer(1e-4).minimize(loss_fn)
Pour que cela fonctionne, vous devez suivre le tutoriel MNIST auquel j'ai donné un lien précédemment et importer les bibliothèques pertinentes, mais c'est un bel exercice pour apprendre TensorFlow et il est facile de voir comment la régularisation affecte la sortie. Si vous appliquez une régularisation en tant qu'argument, vous obtenez ce qui suit :
- EasyNet/fully_connected/weights:0 shape:[784, 200] size:156800
- EasyNet/fully_connected/biases:0 shape:[200] size:200
- EasyNet/fully_connected_1/weights:0 shape:[200, 200] size:40000
- EasyNet/fully_connected_1/biases:0 shape:[200] size:200
- EasyNet/fully_connected_2/weights:0 shape:[200, 10] size:2000
- EasyNet/fully_connected_2/biases:0 shape:[10] size:10
- EasyNet/fully_connected/kernel/Regularizer/l2_regularizer:0 shape:[] size:1.0
- EasyNet/fully_connected_1/kernel/Regularizer/l2_regularizer:0 shape:[] size:1.0
- EasyNet/fully_connected_2/kernel/Regularizer/l2_regularizer:0 shape:[] size:1.0
Remarquez que la partie régularisation vous donne trois éléments, basés sur les éléments disponibles.
Avec des régularisations de 0, 0.0001, 0.01 et 1.0, j'obtiens des valeurs de précision de test de 0.9468, 0.9476, 0.9183 et 0.1135, respectivement, montrant les dangers des termes de régularisation élevés.
1 votes
Juste pour être super explicite, est-ce que la façon de le faire est
S = tf.get_variable(name='S', regularizer=tf.contrib.layers.l2_regularizer )
?0 votes
@Pinocchio l'as-tu compris?
2 votes
@Euler_Salter Je ne m'en souviens plus, désolé ! Je n'utilise plus tensor flow maintenant !