项目场景:
由于网上对TensorFlow2.3.1的相关操作介绍的很少,即使有大部分都是有错误的,于是我就通过自己的摸索,对此作以总结。
问题描述:
首先是通过tensorflow对MNIST数据集进行下载,网上对此具体的操作是使用以下方法进行下载:
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data',one_hot = True)
原因分析:
因为TensorFlow2.0往后的版本已经更新了很多函数库,比如examples库中没有tutorials函数,如果非要使用可以对此进行下载。我觉得没必要,因为TensorFlow2.3.1中给我们提供了keras库,该库中给我们专门提供了对相关数据集的下载,具体的操作在下方的完整代码中。
解决方案:
首先是对MNIST数据集的可视化显示完整代码:
接下来是对MNIST数据集做的相关训练完整代码:
import tensorflow as tf
#定义超参数
batch_size = 256 #一次训练的样本数量
learning_rate = 0.001 #学习率
iteration_num = 20#迭代次数
#优化器
optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
#模型
model = tf.keras.Sequential([
tf.keras.layers.Dense(256,activation=tf.nn.relu),
tf.keras.layers.Dense(128,activation=tf.nn.relu),
tf.keras.layers.Dense(64,activation=tf.nn.relu),
tf.keras.layers.Dense(32,activation=tf.nn.relu),
tf.keras.layers.Dense(10)
])
#调试输出summary
model.build(input_shape=[None,28*28])
print(model.summary())
#数据预处理
def pre_processing(x,y):
"""
:param x:特征值
:param y: 目标值
:return: 返回处理好的x,y
"""
#转换x
x = tf.cast(x,tf.float32)/255
x = tf.reshape(x,[-1,784])
#转换y
y = tf.cast(y,dtype=tf.int32)
y = tf.one_hot(y,depth=10)
return x,y
#获取数据
def get_data():
"""
:return:返回分批玩的训练集和测试集
"""
#获取数据
(X_train,y_train),(X_test,y_test) = tf.keras.datasets.mnist.load_data()
#分割数据集
train_db = tf.data.Dataset.from_tensor_slices((X_train,y_train)).shuffle(60000, seed=0)
train_db = train_db.batch(batch_size).map(pre_processing)
#分割测试集
test_db = tf.data.Dataset.from_tensor_slices((X_test,y_test)).shuffle(10000, seed=0)
test_db = test_db.batch(batch_size).map(pre_processing)
#返回
return train_db,test_db
#训练数据
def train(train_db):
"""
训练数据
:param train_db:分批的数据集
:return: 无返回值
"""
for step,(x,y) in enumerate(train_db):
with tf.GradientTape() as tape:
logits = model(x)#获取模型输出结果
MSE = tf.reduce_mean(tf.losses.MSE(y,logits))#计算MSE
Cross_Entropy = tf.losses.categorical_crossentropy(y,logits,from_logits=True)#计算交叉熵
Cross_Entropy = tf.reduce_sum(Cross_Entropy)
#计算梯度
grads = tape.gradient(Cross_Entropy,model.trainable_variables)
#更新参数
optimizer.apply_gradients(zip(grads,model.trainable_variables))
#每100批调试输出一次误差
if step%100 == 0:
print("step:",step,"Cross_Entropy:",float(Cross_Entropy),"MSE:",float(MSE))
#测试模型
def test(epoch,test_db):
"""
测试模型
:param epoch:轮数
:param test_db: 分批的测试集
:return: 无返回值
"""
total_correct = 0#正确数
total_num =0 #总数
for x,y in test_db:
#获取模型输出结果
logits = model(x)
#预测结果
pred = tf.argmax(logits,axis=1)
#从one_hot编码变回来
y = tf.argmax(y,axis=1)
#计算准确数
correct = tf.equal(pred,y)
correct = tf.reduce_sum(tf.cast(correct,dtype=tf.int32))
#添加正确数和总数
total_correct += int(correct)
total_num += x.shape[0]
#计算准确率
accuracy = total_correct/total_num
#调试输出
print("epoch:",epoch,"Accuracy:",accuracy*100,"%")
def main():
"""
主函数
:return:无返回值
"""
#获取数据
train_db,test_db = get_data()
#轮期
for epoch in range(1,iteration_num):
train(train_db)
test(epoch, test_db)
if __name__ == '__main__':
main()
相关结果如下: