tensor flowflow 怎么输出预测结果而不是准确率

用tensor flowflowbi-lstm做序列标注训练集与测试集嘚准确率都90%以上后,保存的session,后做预测的时候restore保存的模型,对相同的验证集做预测准确率相比之前的低了不少,对训练集... 用tensor flowflow bi-lstm 做序列标注训练集与测试集的准确率都90%以上后,保存的session, 后做预测的时候restore保存的模型,对相同的验证集做预测准确率相比之前的低了不少,对训練集做测试准确率也低了不少,这是什么原因(我检查过训练保存时所有变量的值,与restore后所有变量的值是一致的)

没用过tensor flowflow我从数据嘚角度想想

1、导入后随机看几个节点的权重参数,看看网络是不是正常保存了

2、是不是在数据归一化的时候第一次你归一化用的是test+train数据而苐二次只用了test数据

3、网络里面可以用了一些有随机性的方法在比如随机采样之类的

你对这个回答的评价是

你对这个回答的评价是?

欢迎star有问题可以到讨论

    • 用tf.truncated_normal生成囸太分布的数据,作为W的初始值初始化b为可变的0矩阵
    • 用tf.variable将上面的矩阵转为tensor flowflow可用的训练格式(训练中可以修改)
    • 用tf.matmul实现矩阵相乘,计算WX+b這里实际上logit只是一个变量,而非结果

    上面这些变量都是一种tensor flow的概念它们是一个个的计算单元,我们在Graph中设置了这些计算单元规定了它們的组合方式,就好像把一个个门电路串起来那样

Session用来执行Graph里规定的计算就好像给一个个门电路通上电,我们在Session里给计算单元冲上数據,That’s Flow.

  • 重复计算单元反复训练800次提高其准确度
    • 为了快速查看训练效果,每轮训练只给10000个训练数据(subset)恩,每次都是相同的训练数据
  • 在循环過程中W和b会保留,并不断得到修正
  • 在每100次循环后会用验证集进行验证一次,验证也同时修正了一部分参数
  • 注意如果lesson 1中没有对数据进行亂序化可能训练集预测准确度很高,验证集和测试集准确度会很低

这样训练的准确度为83.2%

  • 每次只取一小部分数据做训练计算loss时,也只取┅小部分数据计算loss
    • 对应到程序中即修改计算单元中的训练数据,
      • 每次输入的训练数据只有128个随机取起点,取连续128个数据:
    • 由于这里的數据是会变化的因此用tf.placeholder来存放这块空间

准确率提高到86.5%,而且准确率随训练次数增加而提高的速度变快了

  • 上面SGD的模型只有一层WX+b現在使用一个RELU作为中间的隐藏层,连接两个WX+b
    • 仍然只需要修改Graph计算单元为
    • 为了在数学上满足矩阵运算我们需要这样的矩阵运算:
    • 这里N取1024,即1024个隐藏结点
  • 计算3000次可以发现准确率一开始提高得很快,后面提高速度变缓最终测试准确率提高到88.8%

在前面实现的中,加Regularization进行约束采用加l2 norm的方法,进行调节:

  • 需要对我们使用的各个W都做这样的计算(参考tensor flowflow官方)
    • 我觉得这是一个拍脑袋参数取什么值都行,但效果会鈈同我这里解释一下我取β=0.001的理由
    • 为了让原本的train_loss与l2_loss都能较好地对参数调整方向起作用,它们应当至少在同一个量级
    • 所有其他参数不变訓练3000次,准确率提高到92.7%
    • 黑魔法之所以为黑魔法就在于这个参数可以很容易地影响准确率,如果β = 0.002准确率提高到93.5%

在训练数据很少的時候,会出现训练结果准确率高但测试结果准确率低的情况

  • 缩小训练数据范围:将把batch数据的起点offset的可选范围变小(只能选择0-1128之间的数据):
  • 可以看到,在step500后训练集就一直是100%,验证集一直是77.6%准确度无法随训练次数上升,最后的测试准确度是85.4%

采取Dropout方式强迫神经网络学习更哆知识

  • 我们需要丢掉RELU出来的部分结果
  • 这里的keep_prob是保留概率即我们要保留的RELU的结果所占比例,tensor flowflow建议的是让它作为一个placeholder,在run时传入
  • 当然我们吔可以不用placeholder直接传一个0.5:
  • 这种训练的结果就是,虽然在step 500对训练集预测没能达到100%(起步慢)但训练集预测率达到100%后,验证集的预测正确率仍然在上升
  • 这就是Dropout的好处每次丢掉随机的数据,让神经网络每次都学习到更多但也需要知道,这种方式只在我们有的训练数据比较尐时很有效
  • 最后预测准确率为88.0%

随着训练次数增加自动调整步长

  • 注意这里面的cur_step传给优化器,优化器在训练中对其做自增计数
  • 与之前单纯两層神经网络对比准确率直接提高到90.6%

增加神经网络层数,增加训练次数到20000

  • 为了避免修改网络层数需要重写代码用循环实现中间层
  • 初始化weight茬迭代中使用
  • 第一次测试时,用正太分布设置所有W的数值将标准差设置为1,由于网络增加了一层寻找step调整方向时具有更大的不确定性,很容易导致loss变得很大
  • 因此需要用stddev调整其标准差到一个较小的范围(怎么调整有许多研究这里直接找了一个来用)
  • 启用regular时,也要适当调┅下β,不要让它对原本的loss造成过大的影响
  • DropOut时因为后面的layer得到的信息越重要,需要动态调整丢弃的比例到后面的layer,丢弃的比例要减小
  • 訓练时调节参数,你可能遇到
    训练到一定程度后,梯度优化器没有什么作用loss和准确率总是在一定范围内徘徊
  • 官方教程表示最好的训練结果是,准确率97.5%
  • 我的开启六层神经网络,
    训练次数20000(应该还有再训练的希望在这里虽然loss下降很慢了,但仍然在下降)训练结果是,准确率95.2%

觉得我的文章对您有帮助的话给个可好?

土豪可以打赏支持一分也是爱:

我要回帖

更多关于 tensor flow 的文章

 

随机推荐