TensorFlow组网

296 阅读2分钟

第一步当然是导入库啦

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可以选择激活函数,第二、三层分别使用了relusoftmax作为激活函数

方式二

和方式一大差不差,但感觉可读性更高了,一般推荐此方式

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组网,逼格就要高许多啦!

在构建复杂的模型时,通常会选择这种方式

  1. super(Model, self).__init__()继承父类tf.keras.Model
  2. __init__中定义网络
  3. 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()