当前位置: 首页 > 知识库问答 >
问题:

python - 基于tensorflow对MNIST中的手写数字进行分类,但是对训练集与测试集的像素归一化后,训练时打印显示训练集的准确地极其低!这是为什么?

司易安
2023-05-05

我想基于tensorflow对MNIST中的手写数字进行分类,但是对训练集与测试集的像素归一化后,训练时打印显示训练集的准确地极其低!请大家帮我分析下原因,代码如下:

# 导入各种包
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
import os
import pickle

# 超参数设置
numClasses = 10
inputSize = 784
batch_size = 64
learning_rate = 0.05

# 下载数据集
mnist = input_data.read_data_sets('original_data/', one_hot=True)

train_img = mnist.train.images
train_label = mnist.train.labels
test_img = mnist.test.images
test_label = mnist.test.labels
train_img /= 255.0
test_img /= 255.0


X = tf.compat.v1.placeholder(tf.float32, shape=[None, inputSize])
y = tf.compat.v1.placeholder(tf.float32, shape=[None, numClasses])
W = tf.Variable(tf.random_normal([inputSize, numClasses], stddev=0.1))
B = tf.Variable(tf.constant(0.1), [numClasses])
y_pred = tf.nn.softmax(tf.matmul(X, W) + B)

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_pred)) + 0.01 * tf.nn.l2_loss(W)
opt = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_pred, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

saver = tf.train.Saver()
multiclass_parameters = {}
# 运行
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    # 开始训练 外循环控制轮数,内循环训练
    for epoch in range(20):
        total_batch = int(len(train_img) / batch_size)  # 总批次=训练的样本总数/批次大小

        for batch in range(total_batch):  # 一个批次的训练
            # 从训练集获取到一个批次的数据
            batch_input = train_img[batch * batch_size: (batch + 1) * batch_size]
            batch_label = train_label[batch * batch_size: (batch + 1) * batch_size]

            _, trainingLoss = sess.run([opt, loss], feed_dict={X: batch_input, y: batch_label})

        train_acc = sess.run(accuracy, feed_dict={X: train_img, y: train_label})
        print("Epoch %d Training Accuracy %g" % (epoch + 1, train_acc))

打印结果如下图所示:
image.png
显示准确率非常的低,请各位大佬帮忙分析下原因,感谢!

共有1个答案

督宏旷
2023-05-05
# 这行代码改一下:
# y_pred = tf.nn.softmax(tf.matmul(X, W) + B)
# 改为
y_pred = tf.matmul(X, W) + B

# 其他代码保持不变

这些修改看看:

# ...(导入包和设置超参数的代码部分保持不变)

# 下载数据集
mnist = input_data.read_data_sets('original_data/', one_hot=True)

train_img = mnist.train.images
train_label = mnist.train.labels
test_img = mnist.test.images
test_label = mnist.test.labels
train_img /= 255.0
test_img /= 255.0

X = tf.compat.v1.placeholder(tf.float32, shape=[None, inputSize])
y = tf.compat.v1.placeholder(tf.float32, shape=[None, numClasses])
W = tf.Variable(tf.random_normal([inputSize, numClasses], stddev=0.1))
B = tf.Variable(tf.constant(0.1), [numClasses])
y_pred = tf.matmul(X, W) + B

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=y_pred)) + 0.01 * tf.nn.l2_loss(W)
opt = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(tf.nn.softmax(y_pred), 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

saver = tf.train.Saver()
multiclass_parameters = {}

# ...(运行代码部分保持不变)
 类似资料:
  • 本文向大家介绍Python分割训练集和测试集的方法示例,包括了Python分割训练集和测试集的方法示例的使用技巧和注意事项,需要的朋友参考一下 数据集介绍 使用数据集Wine,来自UCI  。包括178条样本,13个特征。 分割训练集和测试集 随机分割 分为训练集和测试集 方法:使用scikit-learn中model_selection子模块的train_test_split函数 以上就是本文的

  • 本文向大家介绍python 划分数据集为训练集和测试集的方法,包括了python 划分数据集为训练集和测试集的方法的使用技巧和注意事项,需要的朋友参考一下 sklearn的cross_validation包中含有将数据集按照一定的比例,随机划分为训练集和测试集的函数train_test_split 得到的x_train,y_train(x_test,y_test)的index对应的是x,y中被抽取

  • 我有一堆gps坐标。这些坐标来自一个我知道精确gps坐标的特定位置。 在neuroph中,我使用多层感知器,使用2输入2输出。而在训练数据中,我使用我收集的数据中的坐标作为输入,输出层是精确坐标的gps数据。当我开始训练的时候,它不会知道为什么?我只需要知道如何将它们作为输入和输出输入到训练数据中。

  • 本文向大家介绍检测20类物体,多少张训练集,怎么训练相关面试题,主要包含被问及检测20类物体,多少张训练集,怎么训练时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 多分类问题,保证各类别的样例比,提取特征,用libsvm等做多分类。

  • 本文向大家介绍Tensorflow如何用于准备IMDB数据集以在Python中进行训练?,包括了Tensorflow如何用于准备IMDB数据集以在Python中进行训练?的使用技巧和注意事项,需要的朋友参考一下 Tensorflow是Google提供的一种机器学习框架。它是一个开放源代码框架,与Python结合使用以实现算法,深度学习应用程序等等。它用于研究和生产目的。它具有优化技术,可帮助快速执

  • 利用 Polar 应用程式、Polar Flow 应用程式以及 Polar Flow 网络服务获得有关您的训练的即时分析,深入了解您的训练。 M600 上的训练总结 在每次训练后,您将在您的手表上收到您的即时训练总结。 总结中显示的信息取决于运动内容。可提供的细节包括: 时间长度:训练时长 距离(如适用于您的运动):指训练中已完成的距离。 平均心率:指训练期间您的平均心率。 最大心率:指训练期间您