2021-01-23MNIST 测试实战

 

#通过多个 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)

倒数第二行和第一行还要改,但是我没看出倒数第二行哪错了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值