Python 每个历元的输出平均损耗:奇怪的结果

Python 每个历元的输出平均损耗:奇怪的结果,python,tensorflow,Python,Tensorflow,我使用Tensorflow实现了MNIST数据集的一个简单模型 模型如下: X = tf.placeholder(tf.float32, [None, 784]) Y_ = tf.placeholder(tf.float32, [None, 10]) W = tf.Variable(tf.random_normal(shape=[784, 10], stddev=0.01), name="Weigths") b = tf.Variable(tf.zeros([1,10]), name="Bia

我使用Tensorflow实现了MNIST数据集的一个简单模型

模型如下:

X = tf.placeholder(tf.float32, [None, 784])
Y_ = tf.placeholder(tf.float32, [None, 10])

W = tf.Variable(tf.random_normal(shape=[784, 10], stddev=0.01), name="Weigths")
b = tf.Variable(tf.zeros([1,10]), name="Bias")

Y = tf.nn.softmax(tf.add(tf.matmul(X,W), b))
下面是成本函数的样子:

entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y_, logits=Y)
loss = tf.reduce_mean(entropy)
后支柱:

optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss)
这是我的火车圈:

for epoch in range(n_epochs):
    avg_loss = 0;
    n_batches = int(MNIST.train.num_examples/batch_size) 
    for i in range(n_batches):
        X_batch, Y_batch = MNIST.train.next_batch(batch_size)
        _, l, summary = sess.run([optimizer, loss, merged_summary], feed_dict={X: X_batch, Y_: Y_batch})
        writer.add_summary(summary, pos)
        avg_loss = l / n_batches
    print('Epoch :', epoch, 'AvgLoss =', avg_loss)
print ("Accuracy:", acc.eval(feed_dict={X: MNIST.test.images, Y_: MNIST.test.labels}))
但我不明白我每个时代的平均成本结果:

Epoch : 0 AvgLoss = 0.0028913601962
Epoch : 1 AvgLoss = 0.00283967841755
Epoch : 2 AvgLoss = 0.0028030406345
Epoch : 3 AvgLoss = 0.002759949294
Epoch : 4 AvgLoss = 0.00283429449255
Epoch : 5 AvgLoss = 0.00276749762622
Epoch : 6 AvgLoss = 0.00276815457778
Epoch : 7 AvgLoss = 0.00279549772089
Epoch : 8 AvgLoss = 0.00277937347239
Epoch : 9 AvgLoss = 0.00274000016126
Epoch : 10 AvgLoss = 0.00275734966451
Epoch : 11 AvgLoss = 0.00278236475858
Epoch : 12 AvgLoss = 0.00275594126094
Epoch : 13 AvgLoss = 0.0027651628581
Epoch : 14 AvgLoss = 0.00275661511855
Epoch : 15 AvgLoss = 0.00275890090249
Epoch : 16 AvgLoss = 0.00273716428063
Epoch : 17 AvgLoss = 0.00273372628472
Epoch : 18 AvgLoss = 0.0027502430569
Epoch : 19 AvgLoss = 0.00279064221816
Epoch : 20 AvgLoss = 0.00273178425702
Epoch : 21 AvgLoss = 0.00277335535396
Epoch : 22 AvgLoss = 0.00276518474926
Epoch : 23 AvgLoss = 0.00276605887847
Epoch : 24 AvgLoss = 0.00275481895967
这并不是减少每个循环。。。但它给了我一个很好的准确性:

Accuracy: 0.9295
你知道为什么吗?

损失:
要查看损失减少情况,请为每个迭代(每批)或每100次迭代(而不是每个历元)打印损失。通常,它会在几个时期内达到最小值

准确度:

使用两层完全连接的NN或CNN以获得更好的精度。您可以添加ReLU层和Dropout以获得更好的性能

2层全连接NN:96-98%精度;ConvNet:99%的准确率

要查看统计信息:

另外,还可以试试他的CNN代码:

丢失:
要查看损失减少情况,请为每个迭代(每批)或每100次迭代(而不是每个历元)打印损失。通常,它会在几个时期内达到最小值

准确度:

使用两层完全连接的NN或CNN以获得更好的精度。您可以添加ReLU层和Dropout以获得更好的性能

2层全连接NN:96-98%精度;ConvNet:99%的准确率

要查看统计信息:


另外,也可以试试他的CNN代码:

在TensorFlow 2.0中,现在很容易了

History = model.fit(trainX,trainY,validation_data = (testX,testY),batch_size= 100, epochs = epochs,verbose = 1)

train_loss = History.history['loss']
val_loss   = History.history['val_loss']
acc = History.history['accuracy']
val_acc = History.history['val_accuracy']
拟合模型时,将其存储在变量中。如上所示,您可以获得每个历元的损失和精度以及验证损失和精度

你可以相应地画出这张图

损失

plt.plot(History.history['loss'])
plt.plot(History.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(['Train', 'Test'])
plt.show()
准确度

plt.plot(History.history['accuracy'])
plt.plot(History.history['val_accuracy'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend(['Train', 'Test'])
plt.show()

在TensorFlow 2.0中,现在非常简单

History = model.fit(trainX,trainY,validation_data = (testX,testY),batch_size= 100, epochs = epochs,verbose = 1)

train_loss = History.history['loss']
val_loss   = History.history['val_loss']
acc = History.history['accuracy']
val_acc = History.history['val_accuracy']
拟合模型时,将其存储在变量中。如上所示,您可以获得每个历元的损失和精度以及验证损失和精度

你可以相应地画出这张图

损失

plt.plot(History.history['loss'])
plt.plot(History.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epochs')
plt.legend(['Train', 'Test'])
plt.show()
准确度

plt.plot(History.history['accuracy'])
plt.plot(History.history['val_accuracy'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epochs')
plt.legend(['Train', 'Test'])
plt.show()

你也可以发布你的型号代码吗?@hars-edited!!要看到损失减少-每次迭代(每批)的打印损失不是历元。通常,它会在几个时期内达到最小值。@hars我是受这段代码启发的:当我运行它时,它运行得很好。它所做的是计算一个历元中每个批次的平均损失。是的,只要试着运行一个历元并打印每个批次的损失…你会看到损失下降得非常快。你能不能也发布你的模型代码?@hars edited!!要看到损失减少-每次迭代(每批)的打印损失不是历元。通常,它会在几个时期内达到最小值。@hars我是受这段代码启发的:当我运行它时,它运行得很好。它所做的是计算一个历元中每个批次的平均损失。是的,只要试着运行一个历元,然后为每个批次打印损失…你会看到损失下降得非常快。我不是问准确性,我知道我可以用两层ConvNet达到99%。我只尝试了1个历元,你是对的,它在第一次迭代中减少。然后停滞到1。5@BaptisteArnaud,抱歉提供有关准确性的信息。很高兴知道印刷迭代有帮助。我不是在问精度,我知道我可以达到99%与2层网络。我只尝试了1个历元,你是对的,它在第一次迭代中减少。然后停滞到1。5@BaptisteArnaud,抱歉提供有关准确性的信息。很高兴知道印刷迭代有帮助。