深度学习入门笔记7 手写数字识别 续

简介: 深度学习入门笔记7 手写数字识别 续

手写数字识别2

这次,我们使用CNN来实现手写数字识别。

CNN主要的层次:

  • 输入层
  • 卷积层
  • 激励层
  • 池化层
  • 全连接层

CNN(Convolutional neural network),即卷积神经网络。卷积为理解为一个信号与另外一个信号进行叠加,产生新的信号的过程。

在卷积神经网络中,可认为具有固定权重的滑动窗口与原窗口的数据进行对位相乘再相加的过程。

卷积的过程:http://cs231n.github.io/assets/conv-demo/index.html

# 说明:如果使用summary记录数据的话,会极大拖慢运行速度,视计算机能力而定。
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
if __name__ == '__main__':
    # 读入数据。
    mnist = input_data.read_data_sets("data/", one_hot=True)
    with tf.name_scope("input"):
        # 训练图像的占位符。
        x = tf.placeholder(tf.float32, [None, 784])
        # 训练图像对应分类(标签)的占位符。
        y = tf.placeholder(tf.float32, [None, 10])
        # 因为卷积要求输入的是4维数据,因此对形状进行转换。
        # NHWC(默认)   NCHW
        # N number样本的数量
        # H height图像的高度
        # W width图像的宽度
        # C channel图像的通道数
        x_image = tf.reshape(x, [-1, 28, 28, 1])
    # 卷积层1。
    with tf.name_scope("conv_layer1"):
        # 定义权重。(w就是滑动窗口)
        # 5, 5, 1, 32  =>  滑动窗口的高度,滑动窗口的宽度,输入通道数,输出通道数。
        w = tf.Variable(tf.truncated_normal([5, 5, 1, 32], stddev=0.1), name="w")
        # 定义偏置。
        b = tf.Variable(tf.constant(0.0, shape=[32]), name="b")
        # 进行卷积计算。
        # strides=[1, 1, 1, 1] 步幅。针对输入的NHWC定义的增量。
        # padding: SAME 与VALID。SAME,只要滑动窗口不全移除输入区域就可以。
        # VALID,滑动窗口必须完全在输入区域之内。
        conv = tf.nn.bias_add(tf.nn.conv2d(x_image, w, strides=[1, 1, 1, 1], padding='SAME'), b, name="conv")
        # 使用激活函数进行激活。
        activation = tf.nn.relu(conv)
        # 池化操作。
        # ksize:池化的窗口。
        pool = tf.nn.max_pool(activation, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    # 卷积层2。
    with tf.name_scope("conv_layer2"):
        w = tf.Variable(tf.truncated_normal([5, 5, 32, 64], stddev=0.1), name="w")
        b = tf.Variable(tf.constant(0.0, shape=[64]), name="b")
        conv = tf.nn.bias_add(tf.nn.conv2d(pool, w, strides=[1, 1, 1, 1], padding='SAME'), b, name="conv")
        activation = tf.nn.relu(conv)
        pool = tf.nn.max_pool(activation, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    # 全连接层1。
    with tf.name_scope("full_layer1"):
        # 7 * 7 * 64
        # 原始图像是28 * 28,经过卷积与激励后,没有改变,经过2 * 2池化后,变成 14 * 14。
        # 第一层卷积之后结果为14 * 14,经过第二层卷积与激励后,没有改变,经过2 * 2池化后,变成 7 * 7。
        # 第二层卷积之后,我们图像的形状为  NHWC  =>  [N, 7, 7, 64]
        # 4维变成2二维,将后面三维拉伸成为1维。  =》  [N, 7 * 7 * 64]
        w = tf.Variable(tf.truncated_normal([7 * 7 * 64, 1024], stddev=0.1), name="w")
        b = tf.Variable(tf.constant(0.0, shape=[1024]), name="b")
        # 将第二层卷积之后的结果转换成二维结构。
        pool = tf.reshape(pool, [-1, 7 * 7 * 64])
        activation = tf.nn.relu(tf.matmul(pool, w) + b)
        # 执行dropout(随机丢弃)
        keep_prob = tf.placeholder(tf.float32)
        # 进行随机丢弃,keep_prob指定神经元的保留率。
        drop = tf.nn.dropout(activation, keep_prob)
    # 全连接层2。
    with tf.name_scope("full_layer2"):
        w = tf.Variable(tf.truncated_normal([1024, 10], stddev=0.1), name="w")
        b = tf.Variable(tf.constant(0.0, shape=[10]), name="b")
        logits = tf.matmul(drop, w) + b
    # 损失值与准确率计算层。
    with tf.name_scope("compute"):                   
        # 计算损失值。
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits))
        # 将损失值加入到tensorboard中。
#         tf.summary.scalar('loss',loss)
        train_step = tf.train.AdamOptimizer(1e-4).minimize(loss)
        # 计算准确率
        correct = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
        accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))
#         tf.summary.scalar('accuracy',accuracy)
    #合并所有的summary
#     merged = tf.summary.merge_all()
    # 创建Session。
    with tf.Session() as sess:
        # 对全局变量进行初始化。
        sess.run(tf.global_variables_initializer())
#         train_writer = tf.summary.FileWriter('logs/train',sess.graph)
#         test_writer = tf.summary.FileWriter('logs/test',sess.graph)
        # 可以尝试更大的次数,可以将准确率提升到99%以上。
        for i in range(1, 3001):
            batch = mnist.train.next_batch(64)
            # 每100步报告一次在验证集上的准确度
            if i % 100 == 0:
                train_accuracy = accuracy.eval(
                    feed_dict={x: batch[0], y: batch[1], keep_prob: 1.0})
                test_accuracy = accuracy.eval(
                    feed_dict={x: mnist.test.images[:5000], y: mnist.test.labels[:5000], keep_prob: 1.0})
                print(f"step {i}, training accuracy {train_accuracy * 100:.2f}%")
                print(f"step {i}, test accuracy {test_accuracy * 100:.2f}%")
            train_step.run(feed_dict={x: batch[0], y: batch[1], keep_prob: 0.5})
            # 计算并写入训练集计算的结果。
#             summary = sess.run(merged,feed_dict={x:batch[0], y:batch[1] ,keep_prob:1.0})
#             train_writer.add_summary(summary, i)
            # 计算并写入测试集计算的结果。
#             summary = sess.run(merged,feed_dict={x:mnist.test.images, y:mnist.test.labels, keep_prob:1.0})
#             test_writer.add_summary(summary,i)


相关文章
|
1月前
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习的最佳入门路线
深度学习的最佳入门路线
|
7天前
|
机器学习/深度学习 算法 异构计算
为什么说深度学习入门难?
深度学习对于初学者可能会有一定的学习曲线,但并不是不可战胜的难题。深度学习难不难学?通过合适的学习资源、坚持不懈的努力和实际项目的实践,你可以逐渐掌握深度学习的技能。深度学习的重要性和广泛应用性使得克服学习难度是非常值得的。
15 3
|
20天前
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch深度学习框架入门与应用
PyTorch 提供了丰富的工具和 GPU 加速功能,便于构建和训练神经网络。基础包括:1) 张量,类似 NumPy,支持 GPU 计算;2) 自动微分,方便计算梯度;3) 内置神经网络模块 `nn`。PyTorch 还支持数据并行、自定义层、模型保存加载、模型可视化和剪枝量化等进阶用法。通过不断学习,你将能掌握更多高级功能。【6月更文挑战第6天】
30 8
|
20天前
|
机器学习/深度学习 API TensorFlow
Keras深度学习框架入门与实践
**Keras**是Python的高级神经网络API,支持TensorFlow、Theano和CNTK后端。因其用户友好、模块化和可扩展性受到深度学习开发者欢迎。本文概述了Keras的基础,包括**模型构建**(Sequential和Functional API)、**编译与训练**(选择优化器、损失函数和评估指标)以及**评估与预测**。还提供了一个**代码示例**,展示如何使用Keras构建和训练简单的卷积神经网络(CNN)进行MNIST手写数字分类。最后,强调Keras简化了复杂神经网络的构建和训练过程。【6月更文挑战第7天】
21 7
|
1月前
|
机器学习/深度学习 数据可视化 TensorFlow
使用TensorFlow进行深度学习入门
【5月更文挑战第18天】本文介绍了TensorFlow深度学习入门,包括TensorFlow的概述和一个简单的CNN手写数字识别例子。TensorFlow是由谷歌开发的开源机器学习框架,以其灵活性、可扩展性和高效性著称。文中展示了如何安装TensorFlow,加载MNIST数据集,构建并编译CNN模型,以及训练和评估模型。此外,还提供了预测及可视化结果的代码示例。
|
15小时前
|
机器学习/深度学习 自然语言处理 数据可视化
深度学习在自然语言处理中的应用与挑战
随着人工智能技术的飞速发展,深度学习已成为自然语言处理(NLP)领域的核心驱动力。本文将深入探讨深度学习在NLP中的广泛应用,包括语音识别、机器翻译、情感分析等方面,并分析其面临的挑战,如数据稀缺性、模型可解释性等问题。通过引用权威研究数据和案例,揭示深度学习技术在推动NLP进步的同时,如何应对这些挑战,以实现更高效、准确的语言处理能力。
7 1
|
2天前
|
机器学习/深度学习 监控 自动驾驶
深度学习在图像识别中的应用及挑战
【6月更文挑战第25天】本文将深入探讨深度学习在图像识别领域的应用及其面临的主要挑战。首先,我们将介绍深度学习技术的基本原理和其在图像识别中的关键作用。随后,文章将展示通过深度学习模型实现的先进图像处理技术,并分析这些技术如何推动自动驾驶、医疗诊断和安防监控等领域的发展。最后,本文将探讨深度学习在处理大规模数据集、提高模型泛化能力以及确保数据隐私方面的挑战,并提出可能的解决策略。
|
2天前
|
机器学习/深度学习 人工智能 监控
深度学习在图像识别中的应用与挑战
【6月更文挑战第25天】 本文深入探讨了深度学习技术,尤其是卷积神经网络(CNN)在图像识别领域的应用及其面临的挑战。通过分析深度学习模型在处理复杂图像数据时的强大能力,以及在实际部署中遇到的困难,如过拟合、数据集偏差和计算资源限制,本文旨在为读者提供一个关于如何优化模型性能和克服技术难题的全面视角。
|
13小时前
|
机器学习/深度学习 自动驾驶 算法
深度学习在图像识别中的应用与挑战
本文深入探讨了深度学习技术在图像识别领域的应用及其面临的主要挑战。通过分析近期的科研数据和实验结果,我们揭示了深度学习模型在提高图像识别准确率方面的潜力以及存在的局限性。同时,文章还讨论了如何通过技术创新克服这些挑战,以实现更高效、更准确的图像识别。
|
20小时前
|
机器学习/深度学习 搜索推荐 算法
深度学习在医学影像诊断中的应用与前景
本文探讨了深度学习技术在医学影像诊断中的关键应用及其未来发展前景。通过分析当前的技术趋势和应用案例,揭示了深度学习在提高医学影像诊断准确性、效率和普及性方面的潜力。深度学习不仅仅是一种技术革新,更是医疗行业迈向智能化和个性化诊疗的重要一步。
7 0