- import tensorflow as tf
- import tensorflow_datasets as tfds
- import numpy as np
- import matplotlib.pyplot as plt
- import math
- import tqdm
- import tqdm.auto
- tqdm.tqdm = tqdm.auto.tqdm
- print(tf.__version__)
- #导入库
- dataset,metadata = tfds.load('fashion_mnist',as_supervised=True,with_info=True)
- train_dataset,test_dataset = dataset['train'],dataset['test']
- #导入数据集
- class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
- 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
- #映射标签
- num_train_examples = metadata.splits['train'].num_examples
- num_test_examples = metadata.splits['test'].num_examples
- print("训练样本个数: {}".format(num_train_examples))
- print("测试样本个数:{}".format(num_test_examples))
- def normalize(images,labels): #定义标准化函数
- images = tf.cast(images,tf.float32)
- images /= 255
- return images,labels
- train_dataset = train_dataset.map(normalize)#标准化
- test_dataset = test_dataset.map(normalize) #标准化
-
- #绘制一个图像
- for image, label in test_dataset.take(1):
- break
- image = image.numpy().reshape((28,28))
- plt.figure()
- plt.imshow(image, cmap=plt.cm.binary)
- plt.colorbar()
- plt.grid(False)
- plt.show()
- #显示前25幅图像。训练集并在每个图像下面显示类名
- plt.figure(figsize=(10,10))
- i = 0
- for (image, label) in test_dataset.take(25):
- image = image.numpy().reshape((28,28))
- plt.subplot(5,5,i+1)
- plt.xticks([])
- plt.yticks([])
- plt.grid(False)
- plt.imshow(image, cmap=plt.cm.binary)
- plt.xlabel(class_names[label])
- i += 1
- plt.show()
- #建立模型
- model = tf.keras.Sequential([
- tf.keras.layers.Flatten(input_shape=(28,28,1)), #输入层
- tf.keras.layers.Dense(256,activation=tf.nn.relu),#隐藏层1
- tf.keras.layers.Dense(128,activation=tf.nn.relu),#隐藏层2
- tf.keras.layers.Dense(10,activation=tf.nn.softmax)#输出层
- ])
- #定义优化器和损失函数
- model.compile(optimizer='adam',
- loss='sparse_categorical_crossentropy',
- metrics=['accuracy'])
- #设置训练参数
- BATCH_SIZE = 32
- train_dataset = train_dataset.repeat().shuffle(num_train_examples).batch(BATCH_SIZE)
- test_dataset = test_dataset.batch(BATCH_SIZE)
- #训练模型
- model.fit(train_dataset, epochs=5, steps_per_epoch=math.ceil(num_train_examples/BATCH_SIZE))
- test_loss, test_accuracy = model.evaluate(test_dataset, steps=math.ceil(num_test_examples/32))
- print('Accuracy on test dataset:', test_accuracy)
- for test_images, test_labels in test_dataset.take(1):
- test_images = test_images.numpy()
- test_labels = test_labels.numpy()
- predictions = model.predict(test_images)
- predictions.shape
- predictions[0]
- np.argmax(predictions[0])
- test_labels[0]
- def plot_image(i, predictions_array, true_labels, images):
- predictions_array, true_label, img = predictions_array[i], true_labels[i], images[i]
- plt.grid(False)
- plt.xticks([])
- plt.yticks([])
-
- plt.imshow(img[...,0], cmap=plt.cm.binary)
- predicted_label = np.argmax(predictions_array)
- if predicted_label == true_label:
- color = 'blue'
- else:
- color = 'red'
-
- plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
- 100*np.max(predictions_array),
- class_names[true_label]),
- color=color)
- def plot_value_array(i, predictions_array, true_label):
- predictions_array, true_label = predictions_array[i], true_label[i]
- plt.grid(False)
- plt.xticks([])
- plt.yticks([])
- thisplot = plt.bar(range(10), predictions_array, color="#777777")
- plt.ylim([0, 1])
- predicted_label = np.argmax(predictions_array)
-
- thisplot[predicted_label].set_color('red')
- thisplot[true_label].set_color('blue')
- i = 0
- plt.figure(figsize=(6,3))
- plt.subplot(1,2,1)
- plot_image(i, predictions, test_labels, test_images)
- plt.subplot(1,2,2)
- plot_value_array(i, predictions, test_labels)
- i = 12
- plt.figure(figsize=(6,3))
- plt.subplot(1,2,1)
- plot_image(i, predictions, test_labels, test_images)
- plt.subplot(1,2,2)
- plot_value_array(i, predictions, test_labels)
- num_rows = 5
- num_cols = 3
- num_images = num_rows*num_cols
- plt.figure(figsize=(2*2*num_cols, 2*num_rows))
- for i in range(num_images):
- plt.subplot(num_rows, 2*num_cols, 2*i+1)
- plot_image(i, predictions, test_labels, test_images)
- plt.subplot(num_rows, 2*num_cols, 2*i+2)
- plot_value_array(i, predictions, test_labels)
- img = test_images[0]
- print(img.shape)
- img = np.array([img])
- print(img.shape)
- predictions_single = model.predict(img)
- print(predictions_single)
- plot_value_array(0, predictions_single, test_labels)
- _ = plt.xticks(range(10), class_names, rotation=45)
- np.argmax(predictions_single[0])