基于CNN的服装识别
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Conv2D
from tensorflow.keras import Model
import time,datetime
import matplotlib.pyplot as plt
import numpy as np
# 将数据保存到本地文件
#fashion_mnist=tf.keras.datasets.fashion_mnist
#(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
#np.savez_compressed('data/ch12DL/fashion_mnist.npz', x_train=x_train, y_train=y_train, x_test=x_test, y_test=y_test)
#上面的代码将 数据集下载并保存为一个名为的压缩文件。在这个文件中,你将包含训练集和测试集的输入数据 (x_train, x_test) 以及相应的标签数据 (y_train, y_test)。
#当你需要加载这些本地数据时,可以使用以下代码:
data = np.load('fashion_mnist.npz',allow_pickle=True)
x_train, y_train, x_test, y_test = data['x_train'], data['y_train'], data['x_test'], data['y_test']
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
plt.figure(figsize=(10,10))
for i in range(15):
plt.subplot(3,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(x_train[i+100], cmap=plt.cm.binary)
plt.xlabel(class_names[y_train[i+100]])
plt.show()
#数据集预处理
x_train, x_test = x_train / 255.0, x_test / 255.0
print(x_train.shape,x_test.shape)
x_train = x_train[..., tf.newaxis]
x_test = x_test[..., tf.newaxis]
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train)).shuffle(10000).batch(32)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)
#train_ds,test_ds
#网络模型类的构造和实例化
class CNN_Model(Model):
def __init__(self):
super(CNN_Model, self).__init__()
####参考教材内容,补全关键代码,重新运行#####
self.conv1=Conv2D(32,3,activation='relu')
self.flatten=Flatten()
self.d1=Dense(128,activation='relu')
self.d2=Dense(10)
def call(self, x):
x = self.conv1(x)
x = self.flatten(x)
x = self.d1(x)
return self.d2(x)
model = CNN_Model()
#选择优化器和损失函数
####参考教材内容,补全关键代码,重新运行#####
loss_object=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
optimizer=tf.keras.optimizers.Adam()
#选择度量标准
train_loss = tf.keras.metrics.Mean(name='train_loss')
train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')
test_loss = tf.keras.metrics.Mean(name='test_loss')
test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')
#模型训练函数的定义
def train_step(images, labels):
####参考教材内容,补全关键代码,重新运行#####
with tf.GradientTape() as tape:
predictions=model(images,training=True)
loss=loss_object(labels,predictions)
gradients=tape.gradient(loss,model.trainable_variables)
optimizer.apply_gradients(zip(gradients,model.trainable_variables))
train_loss(loss)
train_accuracy(labels,predictions)
#模型测试函数的定义
def test_step(images, labels):
predictions = model(images, training=False)
t_loss = loss_object(labels, predictions)
test_loss(t_loss)
test_accuracy(labels, predictions)
#模型训练和测试
EPOCHS =4
d1 = datetime.datetime.now()
for epoch in range(EPOCHS):
train_loss.reset_states()
train_accuracy.reset_states()
test_loss.reset_states()
test_accuracy.reset_states()
for images, labels in train_ds:
train_step(images, labels)
for test_images, test_labels in test_ds:
test_step(test_images, test_labels)
template = 'Epoch {}, Loss: {}, Accuracy: {}, Test Loss: {}, Test Accuracy: {}'
print(template.format(epoch + 1,
train_loss.result(),
train_accuracy.result() * 100,
test_loss.result(),
test_accuracy.result() * 100))
d2 = datetime.datetime.now()
d = d2-d1
d.seconds