import tensorflow as tf
import numpy as np
# train data
input_data_part = np.array([[0,3,4,2,5],[2,3,1,3,2],[1,2,3,4,3],[1,2,1,4,3]],dtype = np.float32)
label_data = np.array([[1,0],[0,1],[0,1],[1,0]],dtype = np.float32)
# Flag when true,two optimizer effect on different variable, when false effect on the same parameters
mode = True
g1 =tf.Graph()
with g1.as_default():
# set the random seed in the graph
tf.set_random_seed(-1)
input_placeholder = tf.placeholder(dtype=tf.float32,shape=[4,5],name = "input_data")
output_data = tf.placeholder(dtype=tf.float32,shape=[4,2],name = "output_data")
param = {
input_placeholder:input_data_part,
output_data:label_data
}
with tf.variable_scope("net"):
w = tf.get_variable(name = "weight",
shape =[5,2],
dtype = tf.float32,
initializer=tf.truncated_normal_initializer(stddev=0.1))
b = tf.get_variable(name = "b",
shape =[2],
dtype = tf.float32,
initializer=tf.zeros_initializer)
result = tf.add(tf.matmul(input_placeholder,w),b)
loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=output_data,logits=result)
loss = tf.reduce_sum(tf.reduce_sum(loss,axis = -1))
if mode:
optimizer_1 = tf.train.AdamOptimizer(learning_rate=1e-2).minimize(loss,var_list=[w])
optimizer_2 = tf.train.FtrlOptimizer(learning_rate=1e-2).minimize(loss,var_list=[b])
else:
optimizer_1 = tf.train.AdamOptimizer(learning_rate=1e-2).minimize(loss)
optimizer_2 = tf.train.FtrlOptimizer(learning_rate=1e-2).minimize(loss)
train_op = tf.group(optimizer_1,optimizer_2)
with tf.Session(graph=g1) as sess:
tf.global_variables_initializer().run()
for i in range(10):
_,iter_loss =sess.run([train_op,loss],feed_dict = param)
print(iter_loss)
Приведенный выше код имеет два режима, когда режим истинен, два оптимизатора влияют на различные обучаемые переменные, и процесс фиксируется (фиксированная потеря партии за 10 итераций). Однако тренировочный процесс не будет исправлен, когда режим ложный. В этом случае два оптимизатора работают с одинаковыми обучаемыми переменными.