【深度学习框架TensorFlow】使用TensorFlow框架构建全连接的神经网络,手写数字识别
515 打赏
【深度学习框架TensorFlow】使用TensorFlow框架构建全连接的神经网络,手写数字识别 上进小菜猪 2023-03-22 11:50:45

一.TensorFlow

使用深度学习框架TensorFlow。
目标:

1.了解TensorFlow的基本用法;
2.学习使用TensorFlow构建全连接的神经网络,实现手写数字识别,
3.学习使用TensorFlow构建CNN网络,实现手写数字识别程序,
4.比较两种网络结构的识别精度,以进一步了解深度学习和TensorFlow。

1.1 内容介绍

TensorFlow是一个开源软件库,使用数据流图进行数值计算。

(Operation)表示图中的数学的运算,而图中的边表示节点之间互连的多维数据数组,即张量。
Tensorflow作为最流行的深度学习框架之一,具有非常好的性能和强大的功能。它广泛应用于各个领域。

自2015年TensorFlow诞生以来,已有三个主要版本。
TensorFlow更适合大规模部署,特别是跨平台和嵌入式部署

二.开始实验

1.为了消除 numpy 版本过高造成的输出中有太多WARING 警告日志,此处先降低 numpy 版本

  1. !pip install -U numpy==1.15.0

运行结果如下:

2.版本检查,看一下刚刚降低 numpy 版本的版本号。

  1. import numpy as np
  2. print(np.__version__)

2.1TensorFlow的基本使用

1.打印出 Hello tensorflow

  1. import tensorflow as tf
  2. hello = tf.constant('Hello, TensorFlow!')
  3. sess = tf.Session() # 建立一个session
  4. print (sess.run(hello)) # 通过session里面的run来运行结果
  5. sess.close()

运行结果如下:

2.基本运算

  1. a = tf.constant(3) # 定义常量3
  2. b = tf.constant(4) # 定义常量4
  3. with tf.Session() as sess: # 建立session
  4. print ("相加: %i" % sess.run(a+b)) # 计算输出两个变量相加的值
  5. print( "相乘: %i" % sess.run(a*b)) # 计算输出两个变量相乘的值

运行结果如下:

3.定义变量

  1. var1 = tf.Variable(10.0 , name="varname")
  2. var2 = tf.Variable(11.0 , name="varname")
  3. var3 = tf.Variable(12.0 )
  4. var4 = tf.Variable(13.0 )
  5. with tf.variable_scope("test1" ):
  6. var5 = tf.get_variable("varname",shape=[2],dtype=tf.float32)
  7. with tf.variable_scope("test2"):
  8. var6 = tf.get_variable("varname",shape=[2],dtype=tf.float32)
  9. print("var1:",var1.name)
  10. print("var2:",var2.name)
  11. print("var3:",var3.name)
  12. print("var4:",var4.name)
  13. print("var5:",var5.name)
  14. print("var6:",var6.name)

2.2基于全连接神经网络的手写数字识别

1.从OBS公共桶中下载MNIST数据集

  1. import os
  2. import moxing as mox
  3. if not os.path.isdir("./MNIST_data"):
  4. mox.file.copy_parallel("obs://modelarts-labs-bj4/course/hwc_edu/python_module_framework/datasets/tensorflow_data/MNIST_data/","./MNIST_data")

2.导入数据集,使用TensorFlow可以直接进行本地数据加载

设置tensorflow日志级别 过滤WARNING

  1. import tensorflow as tf
  2. tf.logging.set_verbosity(tf.logging.ERROR)
  3. from tensorflow.examples.tutorials.mnist import input_data

下载到本地的文件夹

  1. data_folder="./MNIST_data"

导入已经下载好的数据集,如果数据集不存在,会自动在线下载,可能比较耗时。

  1. mnist = input_data.read_data_sets(data_folder, one_hot = True)

运行结果如下:

3.查看数据集的相关信息

  1. # 训练数据集
  2. print(mnist.train.images.shape, mnist.train.labels.shape)
  3. # 测试数据集
  4. print(mnist.test.images.shape, mnist.test.labels.shape)
  5. # 验证数据集
  6. print(mnist.validation.images.shape, mnist.validation.labels.shape)

运行结果如下:

4.展示部分加载后的数据

  1. import matplotlib.pyplot as plt
  2. %matplotlib inline
  3. plt.figure()
  4. for i in range(9):
  5. plt.subplot(3,3,i+1)
  6. plt.imshow(mnist.train.images[i].reshape((28,28)))
  7. plt.show()

运行结果如下:

5.下载测试图片

  1. if not os.path.exists("./num.png"):
  2. mox.file.copy("obs://modelarts-labs-bj4/course/hwc_edu/python_module_framework/datasets/tensorflow_data/num.png", "./num.png")

6.处理测试图片为网络支持的输入格式

  1. import numpy as np
  2. import cv2
  3. def make_label(label_num):
  4. label = np.zeros((1,10),dtype='float32')
  5. label[:,label_num] = 1.0
  6. return label
  7. label_test = make_label(3)
  8. img_path = "./num.png" # 图片路径
  9. img_file=cv2.imread(img_path,0)
  10. img_file=cv2.resize(img_file,(28,28))
  11. plt.imshow(img_file,'gray')
  12. plt.show()
  13. data_test = img_file
  14. data_test = np.float32(data_test.reshape(1, 28*28))
  15. print(data_test.shape)

运行结果如下:

7.设置网络中会用到的超参数。

  1. # 参数
  2. learning_rate = 0.1
  3. num_steps = 600
  4. batch_size = 128
  5. display_step = 100
  6. # 神经网络的参数
  7. n_hidden_1 = 256 # 第1层神经元数
  8. n_hidden_2 = 256 # 第2层神经元数
  9. num_input = 784 # MNIST数据输入(img形状:28 * 28)
  10. num_classes = 10 # MNIST总类(0-9位)

8.全连接网络

  1. # 计算图的input
  2. X = tf.placeholder("float", [None, num_input])
  3. Y = tf.placeholder("float", [None, num_classes])
  4. # 隐藏层1
  5. W1 = tf.Variable(tf.truncated_normal([num_input, n_hidden_1],stddev=0.1))
  6. B1 = tf.Variable(tf.zeros([n_hidden_1]))
  7. hidden1 = tf.nn.relu(tf.matmul(X,W1) + B1)
  8. # 隐藏层2
  9. W2 = tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2],stddev=0.1))
  10. B2 = tf.Variable(tf.zeros([n_hidden_2]))
  11. hidden2 = tf.nn.relu(tf.matmul(hidden1,W2) + B2)
  12. #输出层
  13. W3 = tf.Variable(tf.zeros([n_hidden_2,num_classes]))
  14. B3 = tf.Variable(tf.zeros([num_classes]))
  15. logits = tf.matmul(hidden2, W3) + B3
  16. #softmax
  17. y = tf.nn.softmax(logits)

9.优化器和损失函数

损失函数

  1. loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=Y))

优化器:Adam

  1. train_op = tf.train.AdagradOptimizer(learning_rate).minimize(loss_op)

模型评估指标和初始化变量

  1. correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(Y, 1))
  2. accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
  3. init = tf.global_variables_initializer()

10.训练并验证

  1. with tf.Session() as sess:
  2. sess.run(init)
  3. for step in range(1, num_steps+1):
  4. batch_x, batch_y = mnist.train.next_batch(batch_size)
  5. # 运行优化器,反向传播
  6. sess.run(train_op, feed_dict={X: batch_x, Y: batch_y})
  7. if step % display_step == 0 or step == 1:
  8. # 计算loss和acc
  9. loss, acc = sess.run([loss_op, accuracy], feed_dict={X: batch_x, Y: batch_y})
  10. print("Step " + str(step) + ", Minibatch Loss= " + \
  11. "{:.4f}".format(loss) + ", Training Accuracy= " + \
  12. "{:.3f}".format(acc))
  13. print("Optimization Finished!")
  14. # 在MNIST test images上验证效果
  15. print("Testing Accuracy:", \
  16. sess.run(accuracy, feed_dict={X: mnist.test.images,
  17. Y: mnist.test.labels}))
  18. # 对自己手写的数字进行识别
  19. test_acc,test_value = sess.run([accuracy,y], feed_dict={X:data_test, Y:label_test})
  20. # 设置numpy矩阵显示3位小数
  21. np.set_printoptions(formatter={'float': '{: 0.3f}'.format})
  22. print(test_value)
  23. print("AI判断的数字是{}".format(list(test_value[0]).index(test_value[0].max())))

运行结果如下:

2.3 结论

可以看到模型在测试集的精度为96%,并在我们给的手写数字上识别正确。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
评论
0个
时间排序
内容存在敏感词
    0 条记录 第 0 /
    相关专栏
    打赏作者
    易百纳技术社区
    上进小菜猪
    您的支持将鼓励我继续创作!
    打赏金额:
    ¥1 易百纳技术社区
    ¥5 易百纳技术社区
    ¥10 易百纳技术社区
    ¥50 易百纳技术社区
    ¥100 易百纳技术社区
    支付方式:
    微信支付
    支付宝支付
    易百纳技术社区 微信支付
    易百纳技术社区
    打赏成功!

    感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

    举报反馈

    举报类型

    • 内容涉黄/赌/毒
    • 内容侵权/抄袭
    • 政治相关
    • 涉嫌广告
    • 侮辱谩骂
    • 其他

    详细说明

    审核成功

    发布时间设置
    发布时间:
    是否关联周任务-专栏模块

    审核失败

    失败原因
    备注
    Loading...
    易百纳技术社区
    确定要删除此文章、专栏、评论吗?
    确定
    取消
    易百纳技术社区
    易百纳技术社区
    在专栏模块发布专栏,可获得其他E友的打赏
    易百纳技术社区
    回答悬赏问答,被题主采纳后即可获得悬赏金
    易百纳技术社区
    在上传资料时,有价值的资料可设置为付费资源
    易百纳技术社区
    达到一定金额,收益即可提现~
    收益也可用来充值ebc,下载资料、兑换礼品更容易
    易百纳技术社区
    活动规则
    • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
    • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准,专栏需为原创文章且首次在社区发布
    • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
    易百纳技术社区
    升级提醒
    升级

    恭喜您的社区称号由 升级为 “社区游民”

    同时为了感谢您对社区的支持,我们将送出xxx礼品一份, 记得领取哦~

    升级提醒
    易百纳技术社区