基于tensorflow2的手写数字识别

实现思路

  1. 导入所需要的包
  2. 下载/加载数据集(此处用的是Mnist)
  3. 数据集预处理(转化为张量,one-hot编码,分配batch大小,)
  4. 设置网络结构(层数,激活函数,层与层之间的连接方法)
  5. 采用随机梯度下降优化参数
  6. 最小化(梯度下降)损失函数(MSE),并将更新的参数代替原来的参数
  7. 进行多次训练

代码

# 避免tf打印过多东西
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# 导入手写数字识别所选要的库(layers层连接,optimizers优化器优化参数,datasets加载/下载数据集)
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, optimizers, datasets

# 控制GPU占有度
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu,True)

# 加载(下载)mnist数据集(手写数字的图片库)
(x, y), (x_val, y_val) = datasets.mnist.load_data()  # (x,y)是训练集(x_val,y_val)是测试集
# 将x转换为浮点型张量(使tf内部函数可处理)
x = tf.convert_to_tensor(x, dtype=tf.float32) / 255.  # 除以255目的是归一化,因为x为灰度值(范围0~256)
y = tf.convert_to_tensor(y, dtype=tf.int32)  # 将y转换为浮点型张量(使tf内部函数可处理)
y = tf.one_hot(y, depth=10)  # 将y进行one-hot编码,码长为10位(因为输出为10种情况,所以码长为10)
print(x.shape, y.shape)
# 接收tensor,对tensor的第一个维度进行切分,返回一个表示该tensor的切片数据集,如tf.data.Dataset.from_tensor_slices(x)返回一个含有60K的切片的数据集,每个切片为28*28的图像
train_dataset = tf.data.Dataset.from_tensor_slices((x, y))
train_dataset = train_dataset.batch(200)  # 一次处理200张图片

# 设置连接层层数和激活函数类型,此处激活函数选择Relu,第一层层数和最后一层层数需要根据数据集设置,如此数据集为28x28(784)的图片
# 所以输入层数为784个节点,输出为10个节点(10个数字),所以第一层隐层需要比784低,最后一层(输出层)层数固定为10
model = keras.Sequential([
    layers.Dense(512, activation='relu'),
    layers.Dense(256, activation='relu'),
    layers.Dense(10)
])
optimizers = optimizers.SGD(learning_rate=0.001)  # 采用随机梯度下降(SGD),设置学习率为0.001

# enumerate函数将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标
def train(epoch):
    for step, (x, y) in enumerate(train_dataset):
        # tf.GradientTape()自动微分
        with tf.GradientTape() as tape:
            x = tf.reshape(x, (-1, 28*28))  # -1代表归一化
            out = model(x)
            # 采用MSE作为损失函数 ,tf.reduce_sum为求和函数,x.shape[0]代表x的第一维的长度,在此为分段处理的图片数目
            loss = tf.reduce_sum(tf.square(out - y)) / x.shape[0]
        grades = tape.gradient(loss, model.trainable_variables)
        optimizers.apply_gradients(zip(grades, model.trainable_variables))
        # 每运行100次(20000张图片),输出一次loss的值
        if step % 100 == 0:
            print(epoch, step, 'loss is', loss.numpy())


def main():
    # 训练30次
    for epoch in range(30):
        train(epoch)


main()

参考链接

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值