使用TensorFlow训练模型的姿势

又名TensorFlow踩坑记
模型终于run起来,但是还是有问题,这几天我的状态:
打开三个终端,
一个输入Top 看内存占用:
10.6%还算正常,毕竟前几天我是经常50%以上爆内存的人...

一个终端输入:
watch -n 2  nvidia-smi 看GPU使用情况 :
我使用的是第三个GPU,占了9G,GPU利用率100%也正常

一个终端实时观察模型输出:
不到一个epoch,目前Loss没有明显下降,不过有初步下降趋势,毕竟前几天我的Loss曲线神奇上升。
怀疑自己写了个梯度上升模型,分分钟Loss20多...


以上过程是训练模型的第一步
跑第一个Epoch 肉眼看Loss下降,如果不下降,出现各种神奇的上升曲线,多半是Learnning_rate设置的太大了。
我之前跑传统机器学习模型,我眼里learning_rate 0.01就很小了,后来才知道deeplearning 里 learning rate
0.00001起是正常的....

训练模型多个Epoch 肉眼看是不够了,这时候要使用TensorBoard 观看Loss的下降情况:步骤如下:

1. 在计算损失函数时: 将要观察的loss 写入tf.summary
with
tf.name_scope('loss'): # 计算交叉熵损失函数 diff = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y cross_entropy = tf.reduce_mean(diff) tf.summary.scalar('loss', cross_entropy)

2. 在构建会话,初始化参数前加上: log_dir是保存文件的位置
with tf.Session(config=config) as sess:
        merged = tf.summary.merge_all()
        writer = tf.summary.FileWriter(log_dir, sess.graph)
        sess.run(init)

3. 打开你的终端,输入: 
tensorboard --logdir='你保存的路径'

这里可能出现个小问题:

ERROR:tensorflow:TensorBoard attempted to bind to port 6006, but it was already in use
TensorBoard attempted to bind to port 6006, but it was already in use
解决方案:
输入命令:

lsof -i:6006
  • 1

结果:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Xvnc4 4969 amax 0u IPv4 655595 0t0 TCP *:x11-6 (LISTEN)

输入命令:

kill -9 4969
  • 1

再次运行:

tensorboard --logdir='你保存的路径' 就可以了
成功的训练曲线大家都看到了,而失败的各有各的奇葩之处,请看失败的典型:










改进的方法:
1. 调小Learning_rate
2. 各种优化器中选用AdamOptimizer ,MomentumOptimizer等,相对于其他不容易产生Loss爆炸
3. 少使用FullyConnect层,可以用Maxpooling(AveragePooling) + 1*1的卷积代替FC

Optimizer
GradientDescentOptimizer
AdagradOptimizer
AdagradDAOptimizer
MomentumOptimizer
AdamOptimizer
FtrlOptimizer
RMSPropOptimizer

你可能感兴趣的:(代码)