常用方法
自编码常用方法:代替和级联
栈式自编码会将网络中的中间层作为下一个网络的输入进行训练,我们可以得到网络中每一个中间层的原始值,为了能有更好的效果,还可以使用级联的方式进一步优化网络参数。在已有的模型上接着优化参数的步骤习惯上成为“微调”。但是通常在大量已标注训练数据的情况下使用。在这样的情况下,微调能显著提升分类器性能。但如果有大量未标注数据,”微调“作用有限
去噪+栈式
1 | import numpy as np |
在这个例子中,要建立4个网络:每一层都用一个网格来训练训练,于是我们需要训练3个网格,最后再把训练好的各个层组合到一起,形成第4个网络。所以我们在上面代码中为每一层网络定义了占位符,接着定义了学习参数。
第一层网络结构
1 | l1_out=tf.nn.sigmoid(tf.add(tf.matmul(x,weights["h1"]),biases["b1"])) |
第二层网络结构
1 | def l2_autodecoder(layer1_2,_weight,_biases): |
第三层网络结构
1 | l3_out = tf.matmul(l3x, weights['out']) + biases['out'] |
定义级联网络结构
1 | l1_l2out = tf.nn.sigmoid(tf.add(tf.matmul(l1_out, weights['l2_h1']), biases['l2_b1'])) |
第一层网络训练
1 | epochs = 50 |
第二层网络训练
1 | with tf.Session() as sess: |
第三层网络训练
1 | with tf.Session() as sess: |
测试
1 | # 测试 model |
可以看出,每层的训练参数叠在一起,网络会有比较好的表现
级联微调
1 | with tf.Session() as sess: |
从结果看,由于网络模型中各层的初始值都已经训练好了,所以一开始就是很低的错误率,且每次的迭代后,错误率都有很大幅度的下降。