TensorFlow2.0笔记3:手写数字(MNIST)识别问题初体验!

手写数字(MNIST)识别问题初体验!

文章目录

    • 一. 整体思路解读
        • 1.1. mnist数据集分析
        • 1.2. 准备网络结构和优化器
        • 1.3. 计算输出值和损失值
    • 二、附录:代码实现
        • 2.1、python代码
        • 2.2. 运行结果
    • 三. 需要全套课程视频+PPT+代码资源可以私聊我!

一. 整体思路解读

1.1. mnist数据集分析

TensorFlow2.0笔记3:手写数字(MNIST)识别问题初体验!_第1张图片
  • 注意Dataset类型有一个好处:比如一次给一个样本[1,784],这个样本对于GPU来说是非常快的。所以我们可以一次来完成多个样本,有个b的概念在里面。即是:一次完成多个图片的计算,高度的并行化。默认的是一次抽取一张图片。看下面的运行结果。
TensorFlow2.0笔记3:手写数字(MNIST)识别问题初体验!_第2张图片

注意:从上面的运行结果可以看出来,输出的标签值并不是 o n e − h o t one-hot onehot 编码;是一个60000*1维度的。

  • 如何返回一个 b a t c h batch batch 呢?后面添加一个.batch(张数);即是:
  • 运行结果如下:
TensorFlow2.0笔记3:手写数字(MNIST)识别问题初体验!_第3张图片

1.2. 准备网络结构和优化器

TensorFlow2.0笔记3:手写数字(MNIST)识别问题初体验!_第4张图片

1.3. 计算输出值和损失值

TensorFlow2.0笔记3:手写数字(MNIST)识别问题初体验!_第5张图片

二、附录:代码实现

2.1、python代码

import os
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets, layers, optimizers

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'                             #把warning提醒信息屏蔽。

(xs, ys), (xs_val, ys_val) = datasets.mnist.load_data()              #这里返回是numpy格式,如果使用GPU加速,要转化为tensor格式
print('datasets:', xs.shape, ys.shape, xs.min(), xs.max())

xs = tf.convert_to_tensor(xs, dtype=tf.float32) / 255.               # 除以255归一到0-1
ys = tf.convert_to_tensor(ys, dtype=tf.int32)
ys=tf.one_hot(ys,depth=10)
print(xs.shape, ys.shape)
train_dataset=tf.data.Dataset.from_tensor_slices((xs,ys)).batch(200) #转换为Dataset类型,batch为200


#准备网络结构和优化器。
model = keras.Sequential([layers.Dense(784, activation='relu'),
                          layers.Dense(256, activation='relu'),
                          layers.Dense(10)])
optimizer=optimizers.SGD(learning_rate=0.001)

#对数据集开始迭代。
def train_epoch(epoch): #对数据集进行一次训练,我们叫做epoch,艾不科
    #Step4.loop;对一个batch训练叫做一个step.
    for step, (x, y) in enumerate(train_dataset): #一次循环取200张图片,共有60000张,循环300次取完。
        with tf.GradientTape() as tape:
            # [b,28,28]=>[b,784]  daping
            x = tf.reshape(x, (-1, 28 * 28))

            #步骤1:计算输出。
            # Step1, computer output;
            # [b,784]=>[b,10]
            out = model(x)  # h1->h2->output

            #步骤2:计算损失值。
            # Step2. computer loss;
            loss = tf.reduce_sum(tf.square(out - y)) / x.shape[0]

        #步骤3:通过损失来计算梯度。
        # step3. optimizer and update[w1,w2,w3,b1,b2,b3];通过损失来计算梯度。
        grad = tape.gradient(loss, model.trainable_variables)

        #步骤4:通过梯度更新权值
        # w'=w-lr*grad;
        optimizer.apply_gradients(zip(grad, model.trainable_variables))
        if step % 100 == 0:
            print("数据集迭代第 %s 次, 训练step为 %s, loss函数为:%s"%(epoch,step,loss.numpy()))

def train():
    for epoch in range(30): #对数据集合迭代30次。
        train_epoch(epoch)

if __name__=='__main__':
    train()

2.2. 运行结果

  • 部分截图
TensorFlow2.0笔记3:手写数字(MNIST)识别问题初体验!_第6张图片
  • 注意:debugger模式查看数据集的xs。
TensorFlow2.0笔记3:手写数字(MNIST)识别问题初体验!_第7张图片

三. 需要全套课程视频+PPT+代码资源可以私聊我!

你可能感兴趣的:(Tensorflow,Deep,Learning)