практика классификации изображений tensorflow2.0 --- классификация набора данных fashion-mnist

TensorFlow

предисловие

Фактически, идея написания этого блога в основном состоит в том, чтобы записать использование некоторых распространенных API-интерфейсов tf2.0 и то, как использовать tf.keras для простого и быстрого построения нейронной сети.

1. Первый разговор о tf.keras

С его помощью мы можем легко построить сетевую модель, которую мы хотим построить, точно так же, как при сборке строительных блоков, сети слой за слоем накладываются друг на друга. Однако будут проблемы, такие как исчезновение градиента в глубокой сети, поэтому можно построить только сетевую модель, и для оптимизации эффекта модели необходимы некоторые другие методы знаний.Для ознакомления с набором данных fashion-mnist см. ссылку ниже. Внедрение fashion-mnist на Github

2. Давайте поговорим о методах оптимизации, обычно используемых для задач классификации изображений.

  • 1. Нормализация (нормализация) данных изображения: Ускорить конвергенцию сети.Конкретный принцип можно представить, что концентрические круги достигают центра круга по градиенту быстрее всего, а нерегулярная графика будет очень извилиста по градиенту, чтобы достичь центр

在这里插入图片描述

  • 2. Улучшение функции данных:Ссылка на сайт
  • 3. Поиск гиперпараметров сети: получение лучших параметров модели, в основном поиск по сетке, случайный поиск, генетический алгоритм, эвристический поиск.
  • 4. Применение отсева, ранней остановки, регуляризации и других методов: предотвращение переобучения модели путем добавления слоя забывания, регуляризации и ранней остановки.

3. Код реализации и результирующая часть

#先导入一些常用库,后续用到再增加
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras
import sklearn
import os
import sys

#看一下版本,确认是2.0
print(tf.__version__)

在这里插入图片描述

#使用keras自带的模块导入数据,并且切分训练集、验证集、测试集,对训练数据进行标准化处理
fashion_mnist=keras.datasets.fashion_mnist
(x_train_all,y_train_all),(x_test,y_test)=fashion_mnist.load_data()
print(x_train_all.shape)
print(y_train_all.shape)
print(x_test.shape)
print(y_test.shape)

#切分训练集和验证集
x_train,x_valid=x_train_all[5000:],x_train_all[:5000]
y_train,y_valid=y_train_all[5000:],y_train_all[:5000]

print(x_train.shape)
print(y_train.shape)
print(x_valid.shape)
print(y_valid.shape)


#标准化
from sklearn.preprocessing import StandardScaler

scaler=StandardScaler()
x_train_scaled=scaler.fit_transform(x_train.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
x_valid_scaled=scaler.fit_transform(x_valid.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
x_test_scaled=scaler.fit_transform(x_test.astype(np.float32).reshape(-1,1)).reshape(-1,28,28)
#可视化一下图片以及对应的标签
#展示多张图片
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*2,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(5,5,x_train,y_train,class_names)

在这里插入图片描述

#搭建网络模型

model=keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28,28]))
model.add(keras.layers.Dense(300,activation="relu"))
model.add(keras.layers.Dense(100,activation="relu"))
model.add(keras.layers.Dense(10,activation="softmax"))
model.compile(loss="sparse_categorical_crossentropy",optimizer="adam",metrics=["acc"])
model.summary()

在这里插入图片描述Откуда берутся цифры в параметрах в информации о сети? у=шx+b Тогда согласно правилу умножения матриц матрица в середине от (Нет, 784) до (Нет, 300) равна (784, 300), а размер члена смещения b равен 300, поэтому 784300+300=235500, это маленькая деталь, о которой стоит немного упомянуть.

#训练,并且保存最好的模型、训练的记录以及使用早停防止过拟合
import datetime
current_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
logdir = os.path.join('logs', current_time)
output_model=os.path.join(logdir,"fashionmnist_model.h5")
callbacks=[
    keras.callbacks.TensorBoard(log_dir=logdir),
    keras.callbacks.ModelCheckpoint(output_model,save_best_only=True),
    keras.callbacks.EarlyStopping(patience=5,min_delta=1e-3)
          ]


history=model.fit(x_train_scaled,y_train,epochs=30,validation_data=(x_valid_scaled,y_valid),callbacks=callbacks)

在这里插入图片描述Я использовал TensorBoard и ModelCheckpoint для работы с папкой, которую я назвал ранее, и столкнулся с ошибкой.Я искал ошибку в Windows, вышеприведенное решение, а затем открыл tensorboard, чтобы посмотреть.在这里插入图片描述 在这里插入图片描述Лучшие модели также сохраняются в виде файлов h5 для быстрого вызова.

def plot_learning_curves(history):
    pd.DataFrame(history.history).plot(figsize=(8,5))
    plt.grid()
    plt.gca().set_ylim(0,1)
    plt.show()

plot_learning_curves(history)

Это для того, чтобы нарисовать изменения каждой тренировки самостоятельно, что аналогично приведенному выше.在这里插入图片描述

#最后在测试集上的准确率
loss,acc=model.evaluate(x_test_scaled,y_test,verbose=0)
print("在测试集上的损失为:",loss)
print("在测试集上的准确率为:",acc)

在这里插入图片描述

#得到测试集上的预测标签,可视化和真实标签的区别
y_pred=model.predict(x_test_scaled)
predict = np.argmax(y_pred,axis=1) 

show_imgs(3,5,x_test,predict,class_names)
show_imgs(3,5,x_test,y_test,class_names)

прогнозируемый результат在这里插入图片描述реальные результаты在这里插入图片描述

4. Резюме:

Глядя на приведенный выше пример, способ использования tf.keras для построения модели

model=keras.models.Sequential()
model.add(...)
model.add(...)
...
model.compile(...)
model.fit(...)

#当然也可以写成
model=keras.models.Sequential([
	...
	...
	...
])
#这两者差别不大


#还有函数式的写法
inputs=...
hidden1=...(inputs)
....
#子类的写法
class ...:
	...

Однако для параметров модели, таких как выбор функции потерь ("sparse_categorical_crossentropy" и "categorical_crossentropy" Или "binary_crossentropy"), когда вам нужно использовать, какая функция потерь наиболее подходит, выбор функции активации в каждом слое сети, выбор оптимизатора... все нужно понимать смысл, чтобы использовать его в соответствующем случае, здесь у меня нет Приведенный пример использования поиска гиперпараметров для получения оптимальных параметров модели, я должен написать пример о поиске гиперпараметров в следующий раз.