UP | HOME

Tensorflow 基本调参技巧

Table of Contents

1 Tensorflow_3

  1. loss fn 的选择交叉熵适合 s 型激(sigmoid, tanh)活函数; 方差适合线性激活函数
  2. dropout 对治过拟合: 训练速度加快,但收敛速度放慢,对治过拟合, 你可以设置 keep_probability of each layer
  3. epoch_number 会影响训练效果, 你可能要多试几种 epoch 值来最终决定自己的 epoch.你应该观察 acc_test 和 acc_train, 当他们数值不怎么变化时, 也就意味着他们收敛了,这个时候的batch_number最合适
  4. 优化器: 一般在做实验时选择速度较快的优化器(比如Ada系), 真正出论文的时候选用精度最高的
  5. W 和 b 的初始值: W 一般使用截断(truncated_normal)的标准差为0.1的高斯随机值作为初始值; b 一般使用 0.1 作为初始值

screenshot_2018-07-28_14-17-59.png

screenshot_2018-07-28_14-19-45.png

screenshot_2018-07-28_14-20-54.png

screenshot_2018-07-28_14-24-17.png

screenshot_2018-07-28_14-34-02.png

screenshot_2018-07-28_14-36-22.png

2 Dropout

<<包导入>>

<<数据准备>>
# numpy构造(with/without noise)
# 从已有数据集导入内存

<<图参数>>
# 批次大小, 批次数量
# dropout 保留率
<<图构造>>
# 一模,
# 两函: err fn(单点错误), loss fn(整体错误)
# 两器: 初始化器, 优化器
# 准确率计算

<<图计算>>
# 运行两器
# 获得准确率
# 绘图
 1: import tensorflow as tf
 2: from tensorflow.examples.tutorials.mnist import input_data
 3: 
 4: # 载入数据
 5: mnist = input_data.read_data_sets("MNIST", one_hot=True)
 6: 
 7: 
 8: # 设置模型参数
 9: # 设置批次大小
10: batch_size = 100
11: # 计算共有多少批次
12: n_batch = mnist.train.num_examples // batch_size
13: 
14: # 定义两个 placeholder
15: x = tf.placeholder(tf.float32, [None, 784])
16: y = tf.placeholder(tf.float32, [None, 10])
17: keep_prob = tf.placeholder(tf.float32)
18: 
19: # 创建简单神经网络(无隐藏层)
20: W1 = tf.Variable(tf.truncated_normal([784, 2000], stddev=0.1)) (WandB)
21: b1 = tf.Variable(tf.zeros([2000]) + 0.1)
22: L1 = tf.nn.tanh(tf.matmul(x, W1) + b1)
23: L1_drop = tf.nn.dropout(L1, keep_prob)
24: 
25: W2 = tf.Variable(tf.truncated_normal([2000, 2000], stddev=0.1))
26: b2 = tf.Variable(tf.zeros([2000]) + 0.1)
27: L2 = tf.nn.tanh(tf.matmul(L1_drop, W2) + b2)
28: L2_drop = tf.nn.dropout(L2, keep_prob)
29: 
30: W3 = tf.Variable(tf.truncated_normal([2000, 1000], stddev=0.1))
31: b3 = tf.Variable(tf.zeros([1000]) + 0.1)
32: L3 = tf.nn.tanh(tf.matmul(L2_drop, W3) + b3)
33: L3_drop = tf.nn.dropout(L3, keep_prob)
34: 
35: W4 = tf.Variable(tf.truncated_normal([1000, 10], stddev=0.1))
36: b4 = tf.Variable(tf.zeros([10])+ 0.1)
37: prediction = tf.nn.softmax(tf.matmul(L3_drop, W4) + b4)
38: 
39: # 二函,二器
40: init = tf.global_variables_initializer()
41: optimizer = tf.train.GradientDescentOptimizer(0.2)
42: loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y, logits=prediction))
43: train = optimizer.minimize(loss)
44: 
45: # 预测对错存在一个向量中
46: correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(prediction, 1))
47: # 计算准确率
48: accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
49: 
50: 
51: # 图计算
52: with tf.Session() as sess:
53:     sess.run(init)
54:     # 采取训练一轮就测试一轮的方式
55:     for epoch in range(31):
56:         # 训练模型
57:         acc_train = 0
58:         for batch in range(n_batch):
59:             batch_xs, batch_ys = mnist.train.next_batch(batch_size)
60:             sess.run(train, feed_dict={x:batch_xs, y:batch_ys, keep_prob:1.0})
61: 
62:         # 测试模型
63:         # 测试集必须使用已经训练完毕的模型
64:         acc_test = sess.run(accuracy, feed_dict={x:mnist.test.images, y:mnist.test.labels, keep_prob:1.0})
65:         acc_train = sess.run(accuracy, feed_dict={x:mnist.train.images, y:mnist.train.labels, keep_prob:1.0})
66:         print("Iter " + str(epoch) + " ,Train:" + str(acc_train) + " ,Test:" + str(acc_test))

0 - 389d4752-a44f-49d9-a250-494187b67e51

一般对W初始化为截断的标准差为0.1的高斯随机值, 一般对b初始化为0.1

                     某一层神经元的输出
                        --
L1_drop = tf.nn.dropout(L1, keep_prob)
                            ---------
                            保留多少百分比神经元

一般而言你想要手动指定的值, 或是从其他地方获取的值, 都设置为 placeholder, 比如 keep_prob, dataset, labels; 而你希望及其取学习的参数, 则设置为 Variable, 比如 W 和 b. 一般 dropout 的 keep_prob 也设置为 placeholder 交由我们自己指定.

import numpy as np
p = np.polynomial.Polynomial([1, 2, 3])
p

0 - a66c0a82-bedf-48c4-acdc-2d6b93640de2