Exercise 2
In the course you learned how to do classificaiton using Fashion MNIST, a data set containing items of clothing. There’s another, similar dataset called MNIST which has items of handwriting – the digits 0 through 9.
Write an MNIST classifier that trains to 99% accuracy or above, and does it without a fixed number of epochs – i.e. you should stop training once you reach that level of accuracy.
Some notes:
I’ve started the code for you below – how would you finish it?
1.全连接手写识别
import tensorflow as tf
from os import path, getcwd, chdir
# DO NOT CHANGE THE LINE BELOW. If you are developing in a local
# environment, then grab mnist.npz from the Coursera Jupyter Notebook
# and place it inside a local folder and edit the path to that location
path = f"{getcwd()}/../tmp2/mnist.npz"
# GRADED FUNCTION: train_mnist
def train_mnist():
# Please write your code only where you are indicated.
# please do not remove # model fitting inline comments.
# YOUR CODE SHOULD START HERE
**class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self,epoch,logs={}):
if(logs.get("acc")>0.6):
print("\nReached 60% accuracy so cancelling training!")
self.model.stop_training=True**
# YOUR CODE SHOULD END HERE
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data(path=path)
# YOUR CODE SHOULD START HERE
**callbacks=myCallback()**
# YOUR CODE SHOULD END HERE
model = tf.keras.models.Sequential([
# YOUR CODE SHOULD START HERE
**tf.keras.layers.Flatten(input_shape=(28,28)),
tf.keras.layers.Dense(512,activation='relu'),
tf.keras.layers.Dense(10,activation='softmax')**
# YOUR CODE SHOULD END HERE
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# model fitting
history = model.fit(# YOUR CODE SHOULD START HERE
**x_train,y_train,epochs=10,callbacks=[callbacks]**
# YOUR CODE SHOULD END HERE
)
# model fitting
return history.epoch, history.history['acc'][-1]
train_mnist()
2.卷积手写识别
改几处地方就行了
首先 卷积要求图片是3维
mnist = tf.keras.datasets.mnist
(x_train, y_train),(x_test, y_test) = mnist.load_data(path=path)
x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], x_train.shape[2], 1)
x_test = x_test.reshape(x_test.shape[0], x_test.shape[1], x_test.shape[2], 1)
改模型层 改为卷积
model = tf.keras.models.Sequential([
# YOUR CODE SHOULD START HERE
# tf.keras.layers.Flatten(input_shape=(28,28)),
# tf.keras.layers.Dense(512,activation='relu'),
# tf.keras.layers.Dense(10,activation='softmax')
tf.keras.layers.Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64,(3,3),activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(10,activation='softmax')
# YOUR CODE SHOULD END HERE
])
训练的时候加入测试集作为验证
history = model.fit(# YOUR CODE SHOULD START HERE
x_train,y_train,epochs=10,callbacks=[callbacks],
# YOUR CODE SHOULD END HERE
validation_data=(x_test, y_test)
)
如果上面没有validation_data=(x_test, y_test),在 model.fit 外面加上
**test_loss = model.evaluate(x_test, y_test)**
也是可以验证的
损失函数说明
如果你的 targets 是 one-hot 编码,用 categorical_crossentropy
one-hot 编码:[0, 0, 1], [1, 0, 0], [0, 1, 0]
如果你的 tagets 是 数字编码 ,用 sparse_categorical_crossentropy
数字编码:2, 0, 1