Fashion MNIST简介
• 70k images
• 10 categories
• Images are 28×28
• Can train a neural net
• 60k作为训练数据,10k作为测试数据
• Fashion MNIST在Tensorflow里作为一个有API的数据集存在
加载数据集
fashion_mnist = keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
数据样本展示
import matplotlib.pyplot as plt
plt.imshow(train_images[0])
print(train_labels[0])
print(train_images[0])
输出的标签是9
图片的输出是以矩阵形式(矩阵太大了就不展示了)
图片展示
图片是灰度的???
模型编译、训练、测试
model.compile(optimizer = 'Adam',
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5)
教程里用的以下代码,在Tensorflow2.0里用不了,会报错AttributeError: module ‘tensorflow_core._api.v2.train’ has no attribute ‘AdamOptimizer’
optimizer = tf.train.AdamOptimizer()
然后看了一些网帖,改用以下代码
optimizer = 'Adam'
改完之后,代码能运行了,但是用于训练的图片只有1875张(正常情况下应该是6000张),可以看到损失很高,精确率很低
后面增加epoch(教程代码用的5个epoch),也没有改善
测试
model.evaluate(test_images, test_labels)
自动结束训练
训练循环支持回调,每次迭代可以回调一个代码函数,根据指标选择是否取消训练
利用python编写一个单独的类
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self,epoch,logs={}):
if(logs.get('loss')<0.4):
print("\nLoss is low so cancelling training!")
self.model.stop_training = True
总体的代码
import tensorflow as tf
from tensorflow import keras
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self,epoch,logs={}):
if(logs.get('loss')<0.4):
print("\nLoss is low so cancelling training!")
self.model.stop_training = True
callbacks = myCallback() #实例化创建的类
fashion_mnist = keras.datasets.fashion_mnist #在Keras数据库加载
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()
#声明一个类型为MNIST的对象,然后调用load_data方法
#会返回四个列表:训练数据,训练标签;测试数据,测试标签
train_images = train_images / 255.0
test_images = test_images / 255.0
#神经网络在标准化数据工作更好,所以进行标准化
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28,28)),
keras.layers.Dense(128,activation=tf.nn.relu),
keras.layers.Dense(10,activation=tf.nn.softmax)
])
#一共三层,最后一层有10个神经元(对应10个类别),第一层的输入是28×28(图片大小是28×28),隐藏层有128个神经元
model.compile(optimizer = 'adam',
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
#编译模型
model.fit(train_images, train_labels, epochs=5,callbacks=[callbacks])
#使用了回调参数,并传递它的类实例
model.evaluate(test_images, test_labels)