import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
from tensorflow import keras
import sklearn
import os
print(tf.__version__)
2.4.1
1、基本模型构建
本文只介绍了最基本,也是最常用的API,除此以外可以使用函数式API和子类API构建模型,详见《机器学习实战》第10章。
1.1 准备数据集
在这里我们使用了fashion_mnist数据集,里面是70000张28*28的图片,图片分为衣服、鞋子等10类。
fashion_mnist = keras.datasets.fashion_mnist
(x_train_all,y_train_all),(x_test,y_test) = fashion_mnist.load_data()
x_valid,x_train = x_train_all[:5000],x_train_all[5000:]
y_valid,y_train = y_train_all[:5000],y_train_all[5000:]
print(x_train.shape,y_train.shape)
print(x_valid.shape,y_valid.shape)
print(x_test.shape,y_test.shape)
(55000, 28, 28) (55000,)
(5000, 28, 28) (5000,)
(10000, 28, 28) (10000,)
我们看一下图片是什么样子的:
def show_single_image(img_arr):
plt.imshow(img_arr, cmap='binary')
plt.show()
show_single_image(x_train[0])
def show_imgs(n_rows, n_cols, x_data, y_data, class_names):
assert len(x_data) == len(y_data)
assert n_rows * n_cols < len(x_data)
plt.figure(figsize = (n_cols * 1.4, n_rows * 1.6))
for row in range(n_rows):
for col in range(n_cols):
index = n_cols * row + col
plt.subplot(n_rows, n_cols, index+1)
plt.imshow(x_data[index], cmap="binary",
interpolation = 'nearest')
plt.axis('off')
plt.title(class_names[y_data[index]])
plt.show()
class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress',
'Coat', 'Sandal', 'Shirt', 'Sneaker',
'Bag', 'Ankle boot']
show_imgs(3, 5, x_train, y_train, class_names)
1.2 构建模型
构建模型主要分成2部分:
(1)指定模型的各层节点数及其连接
(2)编译模型,指定损失函数、优化方法、metrics等
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28])) #将输入的二维数组展开成一维向量
model.add(keras.layers.Dense(300,activation='sigmoid'))
model.add(keras.layers.Dense(100,activation='sigmoid'))
model.add(keras.layers.Dense(10,activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
如果sigmoid改成relu的话,精度就会降低非常的多。因为使用relu需要将数据归一化处理,而sigmoid则不需要。
编译模型主要指定损失函数、优化器和衡量指标,完整列表可见:
https://keras.io/api/losses/ https://keras.io/api/optimizers https://keras.io/api/metrics
我们使用sparse_categorical_crossentropy损失,因为我们具有稀疏标签,(即对于每个实例,只有一个目标类索引,在这种情况下为0到9),并且这些类是互斥的。相反,如果每个实例的每个类都有一个目标概率(例如独热向量,[0.,0.,0.,1.,0.,0.,0.,0.,0.,0]代表类3),则我们需要使用"categorical_crossentropy"损失。如果我们正在执行二进制分类(带有一个或多个二进制标签),则在输出层中使用"sigmoid"(即逻辑)激活函数,而不是"softmax"激活函数,并且使用"binary_crossentropy"损失。
如果要将稀疏标签(即类索引)转换为独热向量标签,使用keras.utils.to_categorical()函数。反之则使用np.argmax()函数和axis=1。
关于优化器,"sgd"表示我们使用简单的随机梯度下降来训练模型。换句话说,Keras将执行先前所述的反向传播算法(即反向模式自动微分加梯度下降)。我们将在第11章中讨论更有效的优化器(它们改进梯度下降部分,而不是自动微分)。
这样我们的模型就构建完成了,我们看一下模型长什么样子的:
model.layers
[<tensorflow.python.keras.layers.core.Flatten at 0x7f83fa791d00>,
<tensorflow.python.keras.layers.core.Dense at 0x7f83fa791d30>,
<tensorflow.python.keras.layers.core.Dense at 0x7f83fa80f5b0>,
<tensorflow.python.keras.layers.core.Dense at 0x7f83fa68d220>]
model