【TensorFlow】MNIST(使用CNN)

官方文档 —— MNIST进阶
代码已上传至 Github —— mnist_cnn.py

下载MNIST数据集


以下有两种下载方式,如果链接失效可以搜索网上的资源

下载之后将其放在 mnist/data/ 文件夹下,目录结构如下

mnist/
    mnist_cnn.py
    data/
        train-images-idx3-ubyte.gz
        train-labels-idx1-ubyte.gz
        t10k-images-idx3-ubyte.gz
        t10k-labels-idx1-ubyte.gz

mnist_cnn.py中用以下代码导入,注意要使用别名input_data,官网中漏了

import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist = input_data.read_data_sets("data/", one_hot=True)

这时候运行mnist_cnn.py,代码的输出结果如下

$ python mnist_cnn.py

Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz

完整代码


初始化变量跟文档不一样,原因是官网的版本较落后。应该用global_variables_initializer()代替initialize_all_variables()

文档最后训练和评估模型一部分代码中accuracy.eval()train_step.run()有问题,解决方法如下

  • 将代码放在with sess.as_default():
  • 显式传递Session,比如run(session=sess)
  • 使用sess.run(accuracy,feed_dict=...)

需要解释的地方都在代码的注释中说明了

import tensorflow.examples.tutorials.mnist.input_data as input_data
import tensorflow as tf

# 导入数据集
mnist = input_data.read_data_sets("data/", one_hot=True)


# 权重初始化:使用标准差为0.1的正态分布
def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)


# 偏置初始化:使用常量0.1
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)


# 卷积:使用1步长,0边距的模板,保证输出和输入是同一个大小
def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding="SAME")


# 池化:用简单传统的2x2大小的模板
def max_pool_2x2(x):
    return tf.nn.max_pool(
        x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")


# 第一层卷积
x = tf.placeholder(tf.float32, [None, 784])  # 使用占位符,用于指定任意数量的图片
W_conv1 = weight_variable([5, 5, 1,
                           32])  # 第1,2维是patch的大小,第3维是输入的通道数目,第4维是输出的通道数目
b_conv1 = bias_variable([32])  # 每一个输出通道都有一个对应的偏置量

x_image = tf.reshape(
    x, [-1, 28, 28, 1])  # 把x变成一个4d向量,第2、第3维对应图片的宽、高,第4维代表图片的颜色通道数

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(
    h_conv1)  # 把x_image和权值向量进行卷积,加上偏置项,然后应用ReLU激活函数,最后进行max pooling

# 第二层卷积
W_conv2 = weight_variable([5, 5, 32, 64])  # 每个5x5的patch会得到64个特征
b_conv2 = bias_variable([64])

h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)

# 密集连接层
W_fc1 = weight_variable([7 * 7 * 64,
                         1024])  # 图片尺寸减小到7x7,加入一个有1024个神经元的全连接层,用于处理整个图片
b_fc1 = bias_variable([1024])

h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])  # 把池化层输出的张量reshape成一些向量
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

# Dropout
keep_prob = tf.placeholder("float")  # 用placeholder来代表一个神经元的输出在dropout中保持不变的概率
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

# 输出层
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])

y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)  # 添加一个softmax层

# 最小化交叉熵
y_ = tf.placeholder("float", [None, 10])  # 正确值
cross_entropy = -tf.reduce_sum(y_ * tf.log(y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(
    cross_entropy)  # 用ADAM优化器来做梯度最速下降

# 初始化变量
init = tf.global_variables_initializer()

# 启动图
sess = tf.Session()
sess.run(init)

# 训练和评估模型
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

for step in range(1000):
    batch = mnist.train.next_batch(50)
    if step % 100 == 0:  # 每100次迭代输出一次日志
        train_accuracy = sess.run(
            accuracy, feed_dict={
                x: batch[0],
                y_: batch[1],
                keep_prob: 1.0
            })
        print("步骤 %d,训练准确度 %g" % (step, train_accuracy))
    sess.run(train_step, feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

print("测试准确度 %g" % (sess.run(
    accuracy,
    feed_dict={
        x: mnist.test.images,
        y_: mnist.test.labels,
        keep_prob: 1.0
    })))

运行结果如下

$ python mnist_cnn.py

Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz

步骤 0,训练准确度 0.08
步骤 100,训练准确度 0.82
步骤 200,训练准确度 0.86
步骤 300,训练准确度 0.9
步骤 400,训练准确度 0.9
步骤 500,训练准确度 0.88
步骤 600,训练准确度 0.94
步骤 700,训练准确度 0.88
步骤 800,训练准确度 0.94
步骤 900,训练准确度 0.96

测试准确度 0.9624
### 回答1: 使用TensorFlow来训练并测试手写数字识别的MNIST数据集十分简单。首先,我们需要导入TensorFlowMNIST数据集: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data 接下来,我们可以使用input_data.read_data_sets()函数加载MNIST数据集,其中参数为下载数据集的路径。我们可以将数据集分为训练集、验证集和测试集。这里我们将验证集作为模型的参数调整过程,测试集用于最终模型评估。 mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 接下来,我们可以使用TensorFlow创建一个简单的深度学习模型。首先,我们创建一个输入占位符,用于输入样本和标签。由于MNIST数据集是28x28的图像,我们将其展平为一个784维的向量。 x = tf.placeholder(tf.float32, [None, 784]) y = tf.placeholder(tf.float32, [None, 10]) 接下来,我们可以定义一个简单的全连接神经网络,包含一个隐藏层和一个输出层。我们使用ReLU激活函数,并使用交叉熵作为损失函数。 hidden_layer = tf.layers.dense(x, 128, activation=tf.nn.relu) output_layer = tf.layers.dense(hidden_layer, 10, activation=None, name="output") cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=output_layer, labels=y)) 然后,我们可以使用梯度下降优化器来最小化损失函数,并定义正确预测的准确率。这样就完成了模型的构建。 train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) correct_prediction = tf.equal(tf.argmax(output_layer, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 接下来,我们可以在一个会话中运行模型。在每次迭代中,我们从训练集中随机选择一批样本进行训练。在验证集上进行模型的参数调整过程,最后在测试集上评估模型的准确率。 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(1000): batch_x, batch_y = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_x, y: batch_y}) val_accuracy = sess.run(accuracy, feed_dict={x: mnist.validation.images, y: mnist.validation.labels}) print("Validation Accuracy:", val_accuracy) test_accuracy = sess.run(accuracy, feed_dict={x: mnist.test.images, y: mnist.test.labels}) print("Test Accuracy:", test_accuracy) 通过这个简单的代码,我们可以使用TensorFlow训练并测试MNIST数据集,并得到测试集上的准确率。 ### 回答2: gan tensorflow mnist是指使用TensorFlow框架训练生成对抗网络(GAN)来生成手写数字图像的任务。 首先,手写数字数据集是一个非常常见且经典的机器学习数据集MNIST数据集包含了由0到9之间的手写数字的图像样本。在gan tensorflow mnist任务中,我们的目标是使用GAN来生成与这些手写数字样本类似的新图像。 GAN是一种由生成器和判别器组成的模型。生成器任务是生成看起来真实的图像,而判别器任务是判断给定图像是真实的(来自训练数据集)还是生成的(来自生成器)。这两个模型通过对抗训练来相互竞争和提高性能。 在gan tensorflow mnist任务中,我们首先需要准备和加载MNIST数据集。利用TensorFlow的函数和工具,我们可以轻松地加载和处理这些图像。 接下来,我们定义生成器和判别器模型。生成器模型通常由一系列的卷积、反卷积和激活函数层组成,以逐渐生成高质量的图像。判别器模型则类似于一个二分类器,它接收图像作为输入并输出真实或生成的预测结果。 我们使用TensorFlow的优化器和损失函数定义GAN模型的训练过程。生成器的目标是误导判别器,使其将生成的图像误认为是真实图像,从而最大限度地降低判别器的损失函数。判别器的目标是准确地区分真实和生成的图像,从而最大限度地降低自身的损失函数。 最后,我们使用训练数据集来训练GAN模型。通过多次迭代,生成器和判别器的性能会随着时间的推移而得到改善。一旦训练完成,我们可以使用生成器模型来生成新的手写数字图像。 总结来说,gan tensorflow mnist是指使用TensorFlow框架训练生成对抗网络来生成手写数字图像的任务。通过定义生成器和判别器模型,使用优化器和损失函数进行训练,我们可以生成类似于MNIST数据集手写数字的新图像。 ### 回答3: 用TensorFlow训练MNIST数据集可以实现手写数字的分类任务。首先我们需要导入相关库和模块,如tensorflow、keras以及MNIST数据集。接着,我们定义模型的网络结构,可以选择卷积神经网络(CNN)或者全连接神经网络(DNN)。对于MNIST数据集,我们可以选择使用CNN,因为它能更好地处理图像数据。 通过调用Keras中的Sequential模型来定义网络结构,可以添加多个层(如卷积层、池化层、全连接层等),用来提取特征和做出分类。其中,输入层的大小与MNIST图片的大小相对应,输出层的大小等于类别的数量(即0~9的数字)。同时,我们可以选择优化器(如Adam)、损失函数(如交叉熵)和评估指标(如准确率)。 接下来,我们用模型编译来配置模型的学习过程。在编译时,我们可以设置优化器、损失函数和评估指标。然后,我们用训练数据对模型进行拟合,通过迭代优化来调整模型的权重和偏置。迭代次数可以根据需要进行调整,以达到训练效果的需求。 训练结束后,我们可以使用测试数据对模型进行评估,获得模型在测试集上的准确率。最后,我们可以使用模型对新的未知数据进行预测,得到相应的分类结果。 综上所述,使用TensorFlow训练MNIST数据集可以实现手写数字的分类任务,通过定义模型结构、编译模型、拟合模型、评估模型和预测来完成整个过程。这个过程需要一定的编程知识和理解深度学习的原理,但TensorFlow提供了方便的api和文档,使我们能够相对容易地实现这个任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值