tensorflow的CNN网络趟坑经验(持续更新)

权重初始化
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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值