权重初始化
loss固定不变
训练集验证集测试集划分
loss不稳定
模型恢复/测试
权重初始化
如果激活函数使用sigmoid和tanh,则最好使用xavir
tf.contrib.layers.xavier_initializer(uniform=True, seed=None, dtype=tf.float32)
- 如果使用relu,则最好使用he initial
tf.contrib.layers.variance_scaling_initializer(uniform=True, seed=None, dtype=tf.float32)
loss固定不变
值为0.693或者0.313是根据不同的分类函数而有所不同
网上解决方法很多
有用xavier初始化解决的,有用BN解决的。我就是用后者跳出大坑
简单记录下就是在最后分类之前某处插入BN。
训练集验证集测试集划分
训练+验证=0.8
训练=0.8×0.9=0.72
验证=0.8×0.1=0.08
测试=0.2
按照如上调整比例后,刚开始训练(无迁移,初始化权重)就会出现超高训练准确率(比如100%)的问题解决掉了,但是原因没有想明白。
loss不稳定
学习率调整引入warm up机制后,训练的loss稳步下降
with tf.name_scope('learn_rate'):
self.global_step = tf.Variable(1.0, dtype=tf.float64, trainable=False, name='global_step')
warmup_steps = tf.constant(self.warmup_periods * self.steps_per_period,
dtype=tf.float64, name='warmup_steps')
train_steps = tf.constant( (self.first_stage_epochs + self.second_stage_epochs)* self.steps_per_period,
dtype=tf.float64, name='train_steps')
self.learn_rate = tf.cond(
pred=self.global_step < warmup_steps,
true_fn=lambda: self.global_step / warmup_steps * self.learn_rate_init,
false_fn=lambda: self.learn_rate_end + 0.5 * (self.learn_rate_init - self.learn_rate_end) *
(1 + tf.cos(
(self.global_step - warmup_steps) / (train_steps - warmup_steps) * np.pi))
)
global_step_update = tf.assign_add(self.global_step, 1.0)
模型恢复/测试
快速完整的教程,用于保存和恢复Tensorflow模型
上面这个是英文教程,不过不要紧,毕竟代码为主。关键确实是看过教程里面敲棒der~英语实在有困难,谷歌翻译吧。
捋一下我的思路
1.加载模型结构图
saver= tf.train.import_meta_graph('xxx.meta')
2.模型参数初始化!!!
创建会话然后初始化,我被这一步绊住好几个小时qaq
因为我的思路本来是“我要恢复模型,给它赋权重值什么的,不需要初始化啊,初始化不是要重新训练了么”,陷入这个怪圈无法自拔,后来看到一篇明确说是模型恢复然后遇到相同报错的文章,终于试了一下,于是,bug消失术!!!
这个故事告诉我们不要想当然啊!!!
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
3.恢复检查点
saver.restore(sess, tf.train.latest_checkpoint('G:/Python/Sirius/checkpoint/'))
4.向会话传参
feed_dict={self.input_data:x_batch, self.y_true:y_batch, self.trainable:False}
acc=sess.run(self.acc,feed_dict)