minist数据集分析--tensorflow2.0--mnist--详细注释

学习记录,方便查看

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提醒屏蔽

# 加载数据集:加载过了的是numpy数据类型,要想使用GPU加速,需要转换为tensor类型,再转换为Dataset类型,是为了实现batch_size 实现并行
(xs, ys),(xs_val, ys_val) = datasets.mnist.load_data()
print('datasets:', xs.shape, ys.shape)

# 将数据转化为张量。 除以255归一到0-1
xs = tf.convert_to_tensor(xs, dtype=tf.float32) / 255.
# y转化为int32类型,并且做one_hot 处理
ys = tf.convert_to_tensor(ys, dtype=tf.int32)
ys = tf.one_hot(ys, depth=10)

print(xs.shape, ys.shape)
# 构造数据集 转换为Dataset类型,batch为200
train_dataset = tf.data.Dataset.from_tensor_slices((xs, ys)).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    loop:圈、循环
    for step, (x, y) in enumerate(train_dataset): # 一次循环取200张图片,共有6000张,循环300次取完。
        with tf.GradientTape() as tape:
            # [b, 28, 28] => [b, 784]
            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 updata[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()


训练流程的4个步骤:
步骤1:计算输出
步骤2:计算损失函数
步骤3:通过损失函数计算梯度
步骤4:通过梯度更新权值

你可能感兴趣的:(学习总结)