# 【TensorFlow】学习率、迭代次数和初始化方式对准确率的影响

43 篇文章 3 订阅
34 篇文章 5 订阅

## 代码

from tensorflow.examples.tutorials.mnist import input_data

from __future__ import print_function
import tensorflow as tf
import matplotlib.pyplot as plt
# 如果运行提示没有seaborn库，可以注释掉这行代码
# 也可以使用 pip install seaborn或者 conda install seaborn安装
import seaborn
# 我是在Jupyter Notebook下运行的
# 如果你是在命令行运行那么就注释掉下面这一行
%matplotlib inline

# 设置模型
# 学习率
learning_rate = 0.01
# 训练迭代次数
training_epochs = 50
# batch大小
batch_size = 100
# 每多少次迭代显示一次损失
display_step = 1

x = tf.placeholder(tf.float32, [None, 784])
y = tf.placeholder(tf.float32, [None, 10])

# 模型参数
# W = tf.Variable(tf.zeros([784, 10]))
# b = tf.Variable(tf.zeros([10]))
W = tf.Variable(tf.truncated_normal([784, 10]))
b = tf.Variable(tf.truncated_normal([10]))

# 建立模型
pred = tf.nn.softmax(tf.matmul(x, W) + b)

# 定义损失函数：交叉熵
cost = tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred), reduction_indices=1))

# 梯度下降

# 初始化所有变量
init = tf.initialize_all_variables()

# 训练模型
with tf.Session() as sess:
sess.run(init)

ax1 = plt.subplot(211)
ax1.set_ylabel("Accuracy")
ax2 = plt.subplot(212, sharex=ax1)
ax2.set_ylabel("Cost")
ax2.set_xlabel("Epoch")
plt.setp(ax1.get_xticklabels(), visible=False)

for epoch in range(training_epochs):
avg_cost = 0
total_batch = int(mnist.train.num_examples / batch_size)

for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
_, c = sess.run([optimizer, cost], feed_dict={x: batch_xs, y: batch_ys})

avg_cost += c / total_batch

if (epoch + 1) % display_step == 0:
# 计算测试准确率
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

ax1.plot(epoch+1, accuracy.eval({x: mnist.test.images, y: mnist.test.labels}), 'mo')
ax2.plot(epoch+1, avg_cost, 'co')

print("Epoch:", '%04d' % (epoch+1), "cost=", '{:.9f}'.format(avg_cost), end=' ')
print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))

print("Optimization Finished!")

print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))
plt.suptitle("learning rate=%f, training epochs=%i, with tf.truncated_normal()" % (learning_rate, training_epochs), size=14)
plt.savefig('AC8.png', dpi=300)
plt.show()


# 所有变量初始化为0
# W = tf.Variable(tf.zeros([784, 10]))
# b = tf.Variable(tf.zeros([10]))

# 所有变量初始化为符合标准截断正态分布的随机数
W = tf.Variable(tf.truncated_normal([784, 10]))
b = tf.Variable(tf.truncated_normal([10]))


## 结果

### 符号说明

• lr：Learning Rate，学习率
• te：Training Epochs，训练迭代次数
• ztf.zeros()，变量初始化为0
• ttf.truncated_normal()，变量初始化为标准截断正态分布的随机数

### 最终准确率比较

• 学习率为0.1，迭代次数为50次，并且采用随机初始化方式时准确率远远低于其他方式，甚至不足90%。而学习率为0.1，迭代次数为50次，并且采用随机初始化的方式时准确率最高。
• 对于采用随机初始化的方式，在其他参数相同的情况下增大迭代次数会明显的提高准确率。而对于初始化为0的情况则无明显变化。
• 其他参数相同的情况下，过度增大学习率的确是会导致准确率下降的，查看详细变化过程时可以看到准确率变化波动比较大。
• 在学习率适中，迭代次数较大时变量初始化方式对最终准确率的影响不大。

## END

• 10
点赞
• 89
收藏
觉得还不错? 一键收藏
• 打赏
• 2
评论
02-12 789
06-19 31万+
04-16 2800
09-05 2万+
10-31 6705
10-17 3013
07-09 6007
02-24 1164
05-08 1万+
08-21 421
09-17 3521
07-30 2万+

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

secsilm

¥1 ¥2 ¥4 ¥6 ¥10 ¥20

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