第一步当然是导入库啦
import tensorflow as tf
from matplotlib import pyplot as plt
加载MNIST数据集
导入MNIST数据集,可通过train_images.shape查看训练数据的形状,返回为(60000,28,28)一共60000张图片,每张图片为28x28的像素
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.fashion_mnist.load_data()
train_images = train_images / 255
test_images = test_images / 255
模型组网
使用tf.keras.Sequential组网
方式一
创建Sequential网络结构,并填入组网的顺序
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[28, 28]),
# activation这里,'relu'也可改写成tf.nn.relu
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
第一层中,tf.keras.layers.Flatten是用来将输入数据拉平(Flatten)成一维向量的层,input_shape顾名思义啦,就是指定输入数据的形状。可将二维数组(28x28)转成一维数组(28x28=784)
第二层拥有128个神经元,第三层(最后一层)拥有10个神经元,对应10个标签
activation可以选择激活函数,第二、三层分别使用了relu与softmax作为激活函数
方式二
和方式一大差不差,但感觉可读性更高了,一般推荐此方式
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=[28, 28]))
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))
方式三
和方式二大差不差,只不过是将activation(激活函数)单独作为层罢了,但是代码多了,显得更花哨了些
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape=[28, 28]))
model.add(tf.keras.layers.Dense(128))
# tf.nn.relu 可简化为 'relu'
model.add(tf.keras.layers.Activation(tf.nn.relu))
model.add(tf.keras.layers.Dense(10))
# tf.nn.softmax 可简化为 'softmax'
model.add(tf.keras.layers.Activation(tf.nn.softmax))
方式四
这种方式就显得比较新奇,多了个之前没见过的东东——tk.keras.Input,在Input中,可通过参数shape设置输入数据的形状
input_ = tf.keras.Input(shape=[28, 28])
layers_1 = tf.keras.layers.Flatten(input_shape=[28, 28])(input_)
layers_2 = tf.keras.layers.Dense(128, activation='relu')(layers_1)
output = tf.keras.layers.Dense(10, activation='softmax')(layers_2)
model = tf.keras.models.Model(inputs=[input_], outputs=[output])
使用tf.keras.Model组网
方式一
这总方式相较于tf.keras.Sequential组网,逼格就要高许多啦!
在构建复杂的模型时,通常会选择这种方式
super(Model, self).__init__()继承父类tf.keras.Model- 在
__init__中定义网络 - 在
call中定义模型的计算方式
class Model(tf.keras.Model):
def __init__(self):
super(Model, self).__init__()
self.layers_1 = tf.keras.layers.Flatten(input_shape=[28, 28])
self.layers_2 = tf.keras.layers.Dense(128, activation='relu')
self.layers_3 = tf.keras.layers.Dense(10, activation='softmax')
def call(self, x):
x = self.layers_1(x)
x = self.layers_2(x)
x = self.layers_3(x)
return x
model = Model()
编译模型
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
训练模型
model.fit(train_images, train_labels, epochs=10)
模型预测
output = model.predict(test_images[:1])
print(tf.argmax(output, axis=-1).numpy())
plt.imshow(test_images[0])
plt.show()