学习记录,方便查看
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:通过梯度更新权值