概述
本文用tf.data api重新实现fashion图像识别
加载数据
# 加载数据
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
(train_image,train_label),(test_image,test_label)=tf.keras.datasets.fashion_mnist.load_data()
图像数据 归一化
# 归一化
train_image=train_image/255
test_image=test_image/255
将训练集转成dataset对象
ds_train=tf.data.Dataset.from_tensor_slices((train_image,train_label))
ds_train
注意: 传入的是元祖
执行结果如下:
<TensorSliceDataset shapes: ((28, 28), ()), types: (tf.float64, tf.uint8)>
由于做了归一化,所以图像类型是float64
label是无符号整型
对训练集进行处理
打乱顺序
ds_train=ds_train.shuffle(10000)
将10000个数据进行打乱顺序
无限重复
ds_train=ds_train.repeat()
无限次
批量读取
ds_train=ds_train.batch(64)
每次输入64张图像和label
将测试集转成Dataset对象
ds_test=tf.data.Dataset.from_tensor_slices((test_image,test_label))
ds_test
执行结果如下:
<RepeatDataset shapes: ((None, 28, 28), (None,)), types: (tf.float64, tf.uint8)>
对测试集进行处理
无限重复
ds_test=ds_test.repeat()
批量读取
ds_test=ds_test.batch(64)
建立模型
# 建立模型
model=tf.keras.Sequential()
# 线性回归中是一维数据,而图像数据是二维数据,需要将二维数据转换成一维数据
model.add(tf.keras.layers.Flatten(input_shape=(28,28)))
# 数量不能太少,会欠拟合,也不能太多,会过拟合
model.add(tf.keras.layers.Dense(128,activation='relu'))
# 10个分类,softmax的作用就是将10个输出值变成概率值,这些概率值之和为1
model.add(tf.keras.layers.Dense(10,activation='softmax'))
model.summary()
配置训练模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['acc'])
计算训练集执行多少次算一个循环
由于上面的数据是无限循环,所以要告知执行多少次是一次循环
图像形状的第一个是图像数量,除以每次读入的64个图像,就是执行的次数
num=train_image.shape[0]//64
num
计算测试集执行多少次算一个循环
num_vld_stps=test_image.shape[0]//64
num_vld_stps
开始训练
model.fit(ds_train,epochs=5,steps_per_epoch=num,validation_data=ds_test,validation_steps=num_vld_stps)
执行结果:
Epoch 1/5
937/937 [==============================] - 6s 6ms/step - loss: 0.3785 - accuracy: 0.8656 - val_loss: 0.4190 - val_accuracy: 0.8502
Epoch 2/5
937/937 [==============================] - 5s 6ms/step - loss: 0.3761 - accuracy: 0.8670 - val_loss: 0.4172 - val_accuracy: 0.8499
Epoch 3/5
937/937 [==============================] - 5s 5ms/step - loss: 0.3731 - accuracy: 0.8672 - val_loss: 0.4160 - val_accuracy: 0.8521
Epoch 4/5
937/937 [==============================] - 5s 5ms/step - loss: 0.3712 - accuracy: 0.8693 - val_loss: 0.4130 - val_accuracy: 0.8545
Epoch 5/5
937/937 [==============================] - 5s 5ms/step - loss: 0.3684 - accuracy: 0.8698 - val_loss: 0.4111 - val_accuracy: 0.8534
<tensorflow.python.keras.callbacks.History at 0xd5021d8fd0>
后续代码
后续代码与之前例子完全一样