import numpy as np
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers
import tensorflow.keras.optimizers as optimizers
import tensorflow.keras.metrics as metrics
import tensorflow.keras.datasets as datasets
from tensorflow.keras import Sequential
import matplotlib.pyplot as plt
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd
#单张图片预处理
def preprocess(x,y):
#修改特征为float32数据类型并归一化
x=tf.cast(x,tf.float32)
#修改特征形状为[28*28]
x=tf.reshape(x,[28*28])
#修改标签为int32数据类型
y=tf.cast(y,tf.int32)
#对标签进行one_hot编码
y=tf.one_hot(y,depth=10)
#返回x,y
return x,y
#加载mnist数据集-tensorflow.keras.datasets.mnist.load_data() 接收训练数据(特征+标签)和测试(验证)数据(特征+标签)
(x,y),(x_val,y_val)=datasets.mnist.load_data()
#查看返回数据的信息-训练集
print('x.shape:',x.shape)
print('x_val.shape:',x_val.shape)
#构建数据集对象-tf.data.Dataset.from_tensor_slice((特征,标签))
db=tf.data.Dataset.from_tensor_slices((x,y))
db_val=tf.data.Dataset.from_tensor_slices((x_val,y_val))
#从训练集中划分0.2的验证集
#预处理数据集对象(训练集和验证集合)-图片预处理+随机打散+分批训练
db=db.map(preprocess).shuffle(100).batch(128)
#验证数据集不需要打散
db_val=db_val.map(preprocess).batch(128)
#从训练集中取出一个batch的数据
sample=next(iter(db))
#构建网络模型-用Sequential实现-5层全连接
network=Sequential([
layers.Dense(256,activation='relu'),
layers.Dense(128,activation='relu'),
layers.Dense(64,activation='relu'),
layers.Dense(32,activation='relu'),
layers.Dense(10)
])
#为模型装配工具-优化器+损失函数+测量指标
network.compile(optimizer=optimizers.Adam(0.01),loss=keras.losses.CategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
#训练模型
network.fit(db,epochs=3,validation_data=db_val,validation_freq=2)
# #验证模型
network.evaluate(db_val)
#从验证集中取出一个batch的数据
sample=next(iter(db_val))
# print('sample...',sample)
#构建真实特征值-取迭代对象sample的第一个张量(是特征)
x=sample[0]
#构建真实标签值-取迭代对象sample的第二个张量(是标签)
y=sample[1]
#从真实标签值的One_hot编码中恢复类别
y=tf.argmax(y,axis=1)
#预测
pred=network.predict(x)
#从输出概率分布中输出类别
pred=tf.argmax(pred,axis=1)
#手动计算准确率
num=tf.where(y==pred)
num=len(num)
acc=num/128.0
print('预测值:',pred)
print('真实值:',y)
print('acc:',acc)
控制台输出结果:
Epoch 1/3
1/469 [..............................] - ETA: 8:00 - loss: 46.0076 - accuracy: 0.09382023-07-09 19:42:49.720281: I tensorflow/stream_executor/cuda/cuda_blas.cc:1760] TensorFloat-32 will be used for the matrix multiplication. This will only be logged once.
469/469 [==============================] - 2s 3ms/step - loss: 3.5548 - accuracy: 0.8044
Epoch 2/3
469/469 [==============================] - 2s 3ms/step - loss: 0.2856 - accuracy: 0.9236 - val_loss: 0.2627 - val_accuracy: 0.9266
Epoch 3/3
469/469 [==============================] - 1s 3ms/step - loss: 0.2176 - accuracy: 0.9392
79/79 [==============================] - 0s 2ms/step - loss: 0.2149 - accuracy: 0.9415
预测值: tf.Tensor(
[7 2 1 0 4 1 4 9 8 9 0 6 9 0 1 5 9 7 3 4 9 6 6 5 4 0 7 4 0 1 3 1 3 4 7 2 7
1 3 1 1 7 4 2 3 5 1 2 4 4 6 3 5 5 6 0 4 1 9 5 7 8 9 3 7 4 0 4 3 0 7 0 2 8
1 7 3 2 8 7 7 6 2 7 8 4 7 3 6 1 3 6 9 3 1 4 1 7 6 9 6 0 5 4 9 9 2 1 9 4 8
7 3 9 7 4 4 4 9 2 5 4 7 6 4 9 0 5], shape=(128,), dtype=int64)
真实值: tf.Tensor(
[7 2 1 0 4 1 4 9 5 9 0 6 9 0 1 5 9 7 3 4 9 6 6 5 4 0 7 4 0 1 3 1 3 4 7 2 7
1 2 1 1 7 4 2 3 5 1 2 4 4 6 3 5 5 6 0 4 1 9 5 7 8 9 3 7 4 6 4 3 0 7 0 2 9
1 7 3 2 9 7 7 6 2 7 8 4 7 3 6 1 3 6 9 3 1 4 1 7 6 9 6 0 5 4 9 9 2 1 9 4 8
7 3 9 7 4 4 4 9 2 5 4 7 6 7 9 0 5], shape=(128,), dtype=int64)
acc: 0.953125