gpt4 book ai didi

python - 为什么经过多次在线训练后识别率会下降?

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:53 25 4
gpt4 key购买 nike

我正在使用 tensorflow 在 MNIST 数据集上进行图像识别。在每个训练 epoch 中,我选择了 10,000 张随机图像并进行批量大小为 1 的在线训练。前几个 epoch 的识别率有所提高,但是在几个 epoch 之后识别率开始大幅下降。 (在前 20 个 epoch 中,识别率上升到 ~94%。之后,识别率从 90->50->40->30->20)。这是什么原因?

此外,批量大小为 1 时,性能比使用批量大小 100 时差(最大识别率 94% 对 96%)。我浏览了几篇引用资料,但关于小批量或大批量是否能获得更好的性能似乎存在矛盾的结果。在这种情况下会发生什么情况?

编辑:我还添加了训练数据集和测试数据集识别率的数字。 Recognition rate vs. epoch

我附上了下面代码的副本。感谢您的帮助!

import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot = True)

#parameters
n_nodes_hl1 = 500
n_nodes_hl2 = 500
n_nodes_hl3 = 500
n_classes = 10
batch_size = 1
x = tf.placeholder('float', [None, 784])
y = tf.placeholder('float')

#model of neural network
def neural_network_model(data):
hidden_1_layer = {'weights':tf.Variable(tf.random_normal([784, n_nodes_hl1]) , name='l1_w'),
'biases': tf.Variable(tf.random_normal([n_nodes_hl1]) , name='l1_b')}

hidden_2_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2]) , name='l2_w'),
'biases' :tf.Variable(tf.random_normal([n_nodes_hl2]) , name='l2_b')}

hidden_3_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl2, n_nodes_hl3]) , name='l3_w'),
'biases' :tf.Variable(tf.random_normal([n_nodes_hl3]) , name='l3_b')}

output_layer = {'weights':tf.Variable(tf.random_normal([n_nodes_hl3, n_classes]) , name='lo_w'),
'biases' :tf.Variable(tf.random_normal([n_classes]) , name='lo_b')}

l1 = tf.add(tf.matmul(data,hidden_1_layer['weights']), hidden_1_layer['biases'])
l1 = tf.nn.relu(l1)
l2 = tf.add(tf.matmul(l1,hidden_2_layer['weights']), hidden_2_layer['biases'])
l2 = tf.nn.relu(l2)
l3 = tf.add(tf.matmul(l2,hidden_3_layer['weights']), hidden_3_layer['biases'])
l3 = tf.nn.relu(l3)
output = tf.matmul(l3,output_layer['weights']) + output_layer['biases']
return output

#train neural network
def train_neural_network(x):
prediction = neural_network_model(x)
cost = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits=prediction, labels=y))
optimizer = tf.train.AdamOptimizer().minimize(cost)
hm_epoches = 100
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(hm_epoches):
epoch_loss=0
for batch in range (10000):
epoch_x, epoch_y=mnist.train.next_batch(batch_size)
_,c =sess.run([optimizer, cost], feed_dict = {x:epoch_x, y:epoch_y})
epoch_loss += c
correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y,1))
accuracy = tf.reduce_mean(tf.cast(correct, 'float'))
print(epoch_loss)
print('Accuracy_test:', accuracy.eval({x:mnist.test.images, y:mnist.test.labels}))
print('Accuracy_train:', accuracy.eval({x:mnist.train.images, y:mnist.train.labels}))

train_neural_network(x)

最佳答案

下降的准确性

你过拟合了。这是当模型以重要特征为代价学习特定于训练数据中图像伪影的错误特征时。任何应用的主要实验结果之一是确定最佳训练迭代次数。

例如,训练数据中 7 的 80% 发生在靠近词干底部的右侧有一点额外倾斜,而 4 和 1 则没有。经过过多 训练后,您的模型“决定”区分 7 和另一个数字的最佳方式是从那个额外的倾斜角度,尽管有任何其他特征。结果,一些 1 和 4 现在被归类为 7。

批量大小

同样,最佳批量大小是实验结果之一。通常,批量大小为 1 太小:这使得前几张输入图像对内核或感知器训练中的早期权重影响太大。这是过度拟合的一个小案例:一个项目对模型产生了不当影响。但是,它足以将您的最佳结果改变 2%。

您需要平衡批量大小与其他超参数,以找到模型的“最佳点”,即最佳性能和最短训练时间。根据我的经验,最好增加批量大小,直到每张图像的时间下降。一旦达到相当小的批量大小,我使用最多的模型(MNIST、CIFAR-10、AlexNet、GoogleNet、ResNet、VGG 等)的准确性损失很小;从那里开始,训练速度通常取决于选择批量大小和最佳使用的可用 RAM。

关于python - 为什么经过多次在线训练后识别率会下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com