前言

这是一个可以真正跑下来的全连接神经网络识别手写数字问题的代码哟,又不懂的语句或者逻辑,欢迎评论区留言

代码

import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers,optimizers,datasets

#数据预处理
(x,y),(x_val,y_val) = datasets.mnist.load_data()
x = tf.convert_to_tensor(x,dtype=tf.float32)/255.
y = tf.convert_to_tensor(y,dtype=tf.int32)
y = tf.one_hot(y,depth=10)
print(x.shape,y.shape)
train_dateset = tf.data.Dataset.from_tensor_slices((x,y))
train_dateset = train_dateset.batch(200)


#建立神经网络模型
model = keras.Sequential(
    [
        layers.Dense(512,activation='relu'),
        layers.Dense(256,activation='relu'),
        layers.Dense(128,activation='relu'),
        layers.Dense(64,activation='relu'),
        layers.Dense(10)
    ]
)

optimizers = optimizers.SGD(learning_rate=0.001)

#定义训练流程
def train_epoch(epoch):

    for step,(x,y) in enumerate(train_dateset):

        with tf.GradientTape() as tape:

            x = tf.reshape(x,(-1,28*28))

            out = model(x)

            loss = tf.reduce_sum(tf.square(out-y))/x.shape[0]

        grads = tape.gradient(loss,model.trainable_variables)

        optimizers.apply_gradients(zip(grads,model.trainable_variables))

        if step%100 == 0:
            print(epoch,step,'loss',loss.numpy())

    #运行
def train():
        for epoch in range(30):
            train_epoch(epoch)

if __name__ == '__main__':
    train()