基于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