Lors de la création et de l'entraînement d'un modèle avec Deep Learning, vous souhaitez parfois spécifier les paramètres à entraîner. Par exemple, lorsque vous apprenez deux réseaux en alternance et que vous ne souhaitez pas mettre à jour les paramètres d'un réseau.
Il existe plusieurs façons de spécifier les paramètres à apprendre.
python
x = tf.Variable(tf.constant([2.]), name='x', trainable=False)
python
opt = tf.train.GradientDescentOptimizer(1.0)
train = opt.minimize(f, var_list=[w,b])
Le n ° 2 est plus facile de changer le code.
L'exécution de code comme celui ci-dessous mettra à jour les variables w, b, x, y_. (Le code ci-dessous n'est pas pratique, et généralement x et y_ sont utilisés comme espaces réservés, donc cela n'a pas d'importance, mais veuillez me pardonner comme exemple.)
python
import tensorflow as tf
import numpy as np
w = tf.Variable(tf.constant([3.]), name='w')
b = tf.Variable(tf.constant([1.]), name='b')
x = tf.Variable(tf.constant([2.]), name='x')
y_ = tf.Variable(tf.constant([5.]), name='y_')
p = w*x
y = p+b
s = -y
t = s +y_
f = t*t
gx, gb, gw, gp, gy, gy_,gs, gt, gf = tf.gradients(f, [x, b, w, p, y, y_,s, t, f])
init = tf.initialize_all_variables()
opt = tf.train.GradientDescentOptimizer(1.0)
train = opt.minimize(f)
with tf.Session() as sess:
sess.run(init)
print 'x:%.2f, w:%.2f, b:%.2f' % (sess.run(x), sess.run(w), sess.run(b))
print 'p:%.2f, y:%.2f, y_:%.2f'% (sess.run(p), sess.run(y), sess.run(y_))
print 's:%.2f, t:%.2f, f:%.2f' % (sess.run(s), sess.run(t), sess.run(f))
print '---------- gradient ----------'
print 'gx:%.2f, gw:%.2f, gb: %.2f' % (sess.run(gx), sess.run(gw), sess.run(gb))
print 'gp:%.2f, gy:%.2f, gy_:%.2f' %(sess.run(gp), sess.run(gy), sess.run(gy_))
print 'gs:%.2f, gt:%.2f, gf:%.2f' %(sess.run(gs), sess.run(gt), sess.run(gf))
print '---------- run GradientDescentOptimizer ----------'
sess.run(train)
print 'x:%.2f, w:%.2f, b:%.2f' % (sess.run(x), sess.run(w), sess.run(b))
print 'p:%.2f, y:%.2f, y_:%.2f'% (sess.run(p), sess.run(y), sess.run(y_))
print 's:%.2f, t:%.2f, f:%.2f'%(sess.run(s), sess.run(t), sess.run(f))
print '---------- gradient ----------'
print 'gx:%.2f, gw:%.2f, gb: %.2f' % (sess.run(gx), sess.run(gw), sess.run(gb))
print 'gp:%.2f, gy:%.2f, gy_:%.2f' %(sess.run(gp), sess.run(gy), sess.run(gy_))
print 'gs:%.2f, gt:%.2f, gf:%.2f' %(sess.run(gs), sess.run(gt), sess.run(gf))
Résultat d'exécution
sess.run(train)Après x et y_La valeur de est également mise à jour.
x:2.00, w:3.00, b:1.00 p:6.00, y:7.00, y_:5.00 s:-7.00, t:-2.00, f:4.00 ---------- gradient ---------- gx:12.00, gw:8.00, gb: 4.00 gp:4.00, gy:4.00, gy_:-4.00 gs:-4.00, gt:-4.00, gf:1.00 ---------- run GradientDescentOptimizer ---------- x:-10.00, w:-5.00, b:-3.00 p:50.00, y:47.00, y_:9.00 s:-47.00, t:-38.00, f:1444.00 ---------- gradient ---------- gx:-380.00, gw:-760.00, gb: 76.00 gp:76.00, gy:76.00, gy_:-76.00 gs:-76.00, gt:-76.00, gf:1.00
## Lorsque formable est spécifié
#### **`python`**
```lang
import tensorflow as tf
import numpy as np
w = tf.Variable(tf.constant([3.]), name='w')
b = tf.Variable(tf.constant([1.]), name='b')
x = tf.Variable(tf.constant([2.]), name='x', trainable=False)
y_ = tf.Variable(tf.constant([5.]), name='y_', trainable=False)
p = w*x
y = p+b
s = -y
t = s +y_
f = t*t
gx, gb, gw, gp, gy, gy_,gs, gt, gf = tf.gradients(f, [x, b, w, p, y, y_,s, t, f])
init = tf.initialize_all_variables()
opt = tf.train.GradientDescentOptimizer(1.0)
train = opt.minimize(f)
with tf.Session() as sess:
sess.run(init)
print 'x:%.2f, w:%.2f, b:%.2f' % (sess.run(x), sess.run(w), sess.run(b))
print 'p:%.2f, y:%.2f, y_:%.2f'% (sess.run(p), sess.run(y), sess.run(y_))
print 's:%.2f, t:%.2f, f:%.2f' % (sess.run(s), sess.run(t), sess.run(f))
print '---------- gradient ----------'
print 'gx:%.2f, gw:%.2f, gb: %.2f' % (sess.run(gx), sess.run(gw), sess.run(gb))
print 'gp:%.2f, gy:%.2f, gy_:%.2f' %(sess.run(gp), sess.run(gy), sess.run(gy_))
print 'gs:%.2f, gt:%.2f, gf:%.2f' %(sess.run(gs), sess.run(gt), sess.run(gf))
print '---------- run GradientDescentOptimizer ----------'
sess.run(train)
print 'x:%.2f, w:%.2f, b:%.2f' % (sess.run(x), sess.run(w), sess.run(b))
print 'p:%.2f, y:%.2f, y_:%.2f'% (sess.run(p), sess.run(y), sess.run(y_))
print 's:%.2f, t:%.2f, f:%.2f'%(sess.run(s), sess.run(t), sess.run(f))
print '---------- gradient ----------'
print 'gx:%.2f, gw:%.2f, gb: %.2f' % (sess.run(gx), sess.run(gw), sess.run(gb))
print 'gp:%.2f, gy:%.2f, gy_:%.2f' %(sess.run(gp), sess.run(gy), sess.run(gy_))
print 'gs:%.2f, gt:%.2f, gf:%.2f' %(sess.run(gs), sess.run(gt), sess.run(gf))
Résultat d'exécution
sess.run(train)Même après x et y_Vous pouvez voir que la valeur de est également inchangée.
x:2.00, w:3.00, b:1.00 p:6.00, y:7.00, y_:5.00 s:-7.00, t:-2.00, f:4.00 ---------- gradient ---------- gx:12.00, gw:8.00, gb: 4.00 gp:4.00, gy:4.00, gy_:-4.00 gs:-4.00, gt:-4.00, gf:1.00 ---------- run GradientDescentOptimizer ---------- x:2.00, w:-5.00, b:-3.00 p:-10.00, y:-13.00, y_:5.00 s:13.00, t:18.00, f:324.00 ---------- gradient ---------- gx:180.00, gw:-72.00, gb: -36.00 gp:-36.00, gy:-36.00, gy_:36.00 gs:36.00, gt:36.00, gf:1.00
## Lors de la transmission d'une liste de variables à mettre à jour vers Optimizer
Si vous souhaitez transmettre une liste de variables à Optimizer, transmettez var_list comme argument à minimiser.
#### **`python`**
```lang
import tensorflow as tf
import numpy as np
w = tf.Variable(tf.constant([3.]), name='w')
b = tf.Variable(tf.constant([1.]), name='b')
x = tf.Variable(tf.constant([2.]), name='x')
y_ = tf.Variable(tf.constant([5.]), name='y_')
p = w*x
y = p+b
s = -y
t = s +y_
f = t*t
gx, gb, gw, gp, gy, gy_,gs, gt, gf = tf.gradients(f, [x, b, w, p, y, y_,s, t, f])
init = tf.initialize_all_variables()
opt = tf.train.GradientDescentOptimizer(1.0)
train = opt.minimize(f, var_list=[w,b])
with tf.Session() as sess:
sess.run(init)
print 'x:%.2f, w:%.2f, b:%.2f' % (sess.run(x), sess.run(w), sess.run(b))
print 'p:%.2f, y:%.2f, y_:%.2f'% (sess.run(p), sess.run(y), sess.run(y_))
print 's:%.2f, t:%.2f, f:%.2f' % (sess.run(s), sess.run(t), sess.run(f))
print '---------- gradient ----------'
print 'gx:%.2f, gw:%.2f, gb: %.2f' % (sess.run(gx), sess.run(gw), sess.run(gb))
print 'gp:%.2f, gy:%.2f, gy_:%.2f' %(sess.run(gp), sess.run(gy), sess.run(gy_))
print 'gs:%.2f, gt:%.2f, gf:%.2f' %(sess.run(gs), sess.run(gt), sess.run(gf))
print '---------- run GradientDescentOptimizer ----------'
sess.run(train)
print 'x:%.2f, w:%.2f, b:%.2f' % (sess.run(x), sess.run(w), sess.run(b))
print 'p:%.2f, y:%.2f, y_:%.2f'% (sess.run(p), sess.run(y), sess.run(y_))
print 's:%.2f, t:%.2f, f:%.2f'%(sess.run(s), sess.run(t), sess.run(f))
print '---------- gradient ----------'
print 'gx:%.2f, gw:%.2f, gb: %.2f' % (sess.run(gx), sess.run(gw), sess.run(gb))
print 'gp:%.2f, gy:%.2f, gy_:%.2f' %(sess.run(gp), sess.run(gy), sess.run(gy_))
print 'gs:%.2f, gt:%.2f, gf:%.2f' %(sess.run(gs), sess.run(gt), sess.run(gf))
Résultat d'exécution
x:2.00, w:3.00, b:1.00
p:6.00, y:7.00, y_:5.00
s:-7.00, t:-2.00, f:4.00
---------- gradient ----------
gx:12.00, gw:8.00, gb: 4.00
gp:4.00, gy:4.00, gy_:-4.00
gs:-4.00, gt:-4.00, gf:1.00
---------- run GradientDescentOptimizer ----------
x:2.00, w:-5.00, b:-3.00
p:-10.00, y:-13.00, y_:5.00
s:13.00, t:18.00, f:324.00
---------- gradient ----------
gx:180.00, gw:-72.00, gb: -36.00
gp:-36.00, gy:-36.00, gy_:36.00
gs:36.00, gt:36.00, gf:1.00
Si vous ne voulez pas vous donner la peine de lister les variables dans var_list, l'utilisation de scope le rend un peu plus facile. La procédure est la suivante.
python
import tensorflow as tf
import numpy as np
with tf.variable_scope("params"):
w = tf.Variable(tf.constant([3.]), name='w')
b = tf.Variable(tf.constant([1.]), name='b')
with tf.variable_scope("input"):
x = tf.Variable(tf.constant([2.]), name='x')
y_ = tf.Variable(tf.constant([5.]), name='y_')
with tf.variable_scope("intermediate"):
p = w*x
y = p+b
s = -y
t = s +y_
f = t*t
gx, gb, gw, gp, gy, gy_,gs, gt, gf = tf.gradients(f, [x, b, w, p, y, y_,s, t, f])
train_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope="params")
print 'train_vars'
for v in train_vars:
print v.name
init = tf.initialize_all_variables()
opt = tf.train.GradientDescentOptimizer(1.0)
train = opt.minimize(f, var_list=train_vars)
with tf.Session() as sess:
sess.run(init)
print 'x:%.2f, w:%.2f, b:%.2f' % (sess.run(x), sess.run(w), sess.run(b))
print 'p:%.2f, y:%.2f, y_:%.2f'% (sess.run(p), sess.run(y), sess.run(y_))
print 's:%.2f, t:%.2f, f:%.2f' % (sess.run(s), sess.run(t), sess.run(f))
print '---------- gradient ----------'
print 'gx:%.2f, gw:%.2f, gb: %.2f' % (sess.run(gx), sess.run(gw), sess.run(gb))
print 'gp:%.2f, gy:%.2f, gy_:%.2f' %(sess.run(gp), sess.run(gy), sess.run(gy_))
print 'gs:%.2f, gt:%.2f, gf:%.2f' %(sess.run(gs), sess.run(gt), sess.run(gf))
print '---------- run GradientDescentOptimizer ----------'
sess.run(train)
print 'x:%.2f, w:%.2f, b:%.2f' % (sess.run(x), sess.run(w), sess.run(b))
print 'p:%.2f, y:%.2f, y_:%.2f'% (sess.run(p), sess.run(y), sess.run(y_))
print 's:%.2f, t:%.2f, f:%.2f'%(sess.run(s), sess.run(t), sess.run(f))
print '---------- gradient ----------'
print 'gx:%.2f, gw:%.2f, gb: %.2f' % (sess.run(gx), sess.run(gw), sess.run(gb))
print 'gp:%.2f, gy:%.2f, gy_:%.2f' %(sess.run(gp), sess.run(gy), sess.run(gy_))
print 'gs:%.2f, gt:%.2f, gf:%.2f' %(sess.run(gs), sess.run(gt), sess.run(gf))
Résultat d'exécution
train_vars
params/w:0
params/b:0
x:2.00, w:3.00, b:1.00
p:6.00, y:7.00, y_:5.00
s:-7.00, t:-2.00, f:4.00
---------- gradient ----------
gx:12.00, gw:8.00, gb: 4.00
gp:4.00, gy:4.00, gy_:-4.00
gs:-4.00, gt:-4.00, gf:1.00
---------- run GradientDescentOptimizer ----------
x:2.00, w:-5.00, b:-3.00
p:-10.00, y:-13.00, y_:5.00
s:13.00, t:18.00, f:324.00
---------- gradient ----------
gx:180.00, gw:-72.00, gb: -36.00
gp:-36.00, gy:-36.00, gy_:36.00
gs:36.00, gt:36.00, gf:1.00
Recommended Posts