#通过多个 step 来完成整个训练集的一次迭代,叫做一个 Epoch。在实际训练时,通常需要对数据集迭代多个 Epoch 才能取得较好地训练效果。
for epoch in range(20):
#完成一个 Batch 的数据训练,叫做一个 Step
for step,(x,y) in enumerate(train_db): # 迭代数据集对象,带 step 参数
training...
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets
import numpy
# 每层的张量都需要被优化,故使用 Variable 类型,并使用截断的正太分布初始化权值张量
# 偏置向量初始化为 0 即可
# 第一层的参数
w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
b1 = tf.Variable(tf.zeros([256]))
# 第二层的参数
w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))
b2 = tf.Variable(tf.zeros([128]))
# 第三层的参数
w3 = tf.Variable(tf.random.truncated_normal([128, 10], stddev=0.1))
b3 = tf.Variable(tf.zeros([10]))
#如果当前数据集不在缓存中,则会自动从网络下载、解压和加载数据集;如果已经在缓存中,则自动完成加载。
(x,y),(x_test,y_test)=datasets.mnist.load_data()
#将训练部分的数据图片 x 和标签 y 都转换成Dataset 对象
train_db=tf.data.Dataset.from_tensor_slices((x,y))
# 随机打散样本,不会打乱样本与标签映射关系,Dataset.shuffle(buffer_size),buffer_size 参数指定缓冲池的大小,一般设置为一个较大的常数
train_db = train_db.shuffle(10000)
#其中 64 为 Batch Size 参数,即一次并行计算 128 个样本的数据
train_db=train_db.batch(64)
def preprocess(x,y):
#cast类型转换,/255 为了标准化到 0~1
x=tf.cast(x, dtype=tf.float32)/255.
x=tf.reshape(x, [-1,28*28])
y = tf.cast(y, dtype=tf.int32)
y=tf.one_hot(y, depth=10)
return x,y
#从 keras.datasets 中加载的数据集的格式大部分情况都不能直接满足模型的输入要求,因此需要根据用户的逻辑自行实现预处理步骤。Dataset 对象通过提供 map(func)工具函数,可以非常方便地调用用户自定义的预处理逻辑,它实现在 func 函数里。
train_db = train_db.map(preprocess)
test_db=tf.data.Dataset.from_tensor_slices((x_test,y_test))
#通过前向计算可以获得网络的预测值
for x,y in test_db:
h1=x @ w1+b1
h1=tf.nn.relu(h1)
h2 = h1 @ w2 + b2 # 第二层
h2 = tf.nn.relu(h2) # 激活函数
out = h2 @ w3 + b3 # 输出层
pred=tf.argmax(out,axis=1) # 选出概率最大值出现的索引号
y=tf.argmax(y,axis=1)# one-hot 编码逆过程
correct = tf.equal(pred, y) # 比较预测值与真实值
total_correct =total_correct+tf.reduce_sum(tf.cast(correct,dtype=tf.int32)).numpy()# 统计预测正确的样本个数
print(step, 'Evaluate Acc:', total_correct/total)
倒数第二行和第一行还要改,但是我没看出倒数第二行哪错了。。。