经过几次迭代,人工神经网络变得跳动

时间:2018-06-26 03:09:56

标签: python tensorflow machine-learning

代码是我遇到的问题的简化复制。对于这个非常简单的任务,损失迅速减少(在2000多次情节之后),降至e-10级。但是,此后损失突然开始增加,从e-02到e-04的水平,在那里停留了片刻,然后又一次又一次地降低到e-10。

我的第一个猜测是这是由于学习率太高(虽然我的学习率下降了),但后来我觉得这不太正确。损失函数在本例中是完美的凸且对称的,因此,由于学习率高,它应该保持在一定水平附近,而不是先升高后降低。

附带的代码也可以重现类似的结果。我还附上了张量板的图形下方,小脉冲很常见,在大多数情况下都可以重现,但是大跳动可能无法重现,因为我在自己的跑步中只看到了一次或两次。该图不是很清楚,但是根据打印结果,损失将在数十集中保持高水平,而不仅仅是一集。

这背后有数学上的原因吗?谢谢。

enter image description here

import numpy as np
import tensorflow as tf
import time

def generate_data(batch_size,size):
    x_val=np.random.rand(batch_size,size)
    y_val=np.mean(x_val,axis=1,keepdims=True)
    return x_val,y_val

#-------------------------------------------Initialize-----------------------------------------------------
tf.reset_default_graph()
gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.15)
sess=tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

batch_size=8192
size=100

inputs=tf.placeholder(dtype=tf.float32, shape=[None,size])
label=tf.placeholder(dtype=tf.float32, shape=[None,1])

loss_summary = tf.Variable(0.)
summary_ops=tf.summary.scalar("Loss", loss_summary)
writer= tf.summary.FileWriter(logdir="tensorboard", graph=sess.graph)
#-------------------------------------------Model-----------------------------------------------------
net=tf.layers.dense(inputs,100)
net=tf.layers.dense(net,1)
loss=tf.reduce_mean(tf.square(net-label))
global_step=tf.get_variable(name='global_step',shape=(),trainable=False,dtype=tf.int16,initializer=tf.zeros_initializer)
lr= tf.train.exponential_decay(learning_rate=0.001,global_step=global_step,
                                                        decay_steps=500,decay_rate=0.99,name="lr")
opt=tf.train.AdamOptimizer(lr).minimize(loss,global_step=global_step)

#-----------------------------------------Run-------------------------------------------------------
sess.run(tf.global_variables_initializer())
for i in range(10000):
    t=time.time()
    x_val,y_val=generate_data(batch_size=batch_size,size=size)
    loss_val,_=sess.run([loss,opt],{inputs:x_val,label:y_val})
    summary=sess.run(summary_ops,feed_dict={loss_summary:loss_val})
    writer.add_summary(summary,i)
    writer.flush()
    print('Episode {}, loss {}, time {}'.format(i,loss_val,time.time()-t))

0 个答案:

没有答案