Почему случайное начальное число не может исправить случайный процесс в тензорном потоке, когда два оптимизатора воздействуют на одни и те же обучаемые переменные? - PullRequest
0 голосов
/ 06 сентября 2018
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 итераций). Однако тренировочный процесс не будет исправлен, когда режим ложный. В этом случае два оптимизатора работают с одинаковыми обучаемыми переменными.

...