卷积神经网络(CNN)是深度学习的一个子集,与基本的神经网络类似。CNN是一种神经网络模型,允许处理图像和视频。CNN接收图像的原始像素数据,训练模型,然后自动提取特征以实现更好的分类。
在构建卷积模型之前,需要导入一些重要的库和模块。Conv2D层是创建卷积核的关键,该卷积核与层输入进行卷积以产生输出张量。以下是导入所需库的代码示例:
import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D
使用的是fashion MNIST数据集,包含60,000个训练样本和10,000个测试样本。每个样本是一个28×28的灰度图像,与10个类别中的一个标签相关联。如果不想从Kaggle下载数据集,可以使用Keras库中内置的数据集模块,其中也包含了fashion_MNIST数据集。以下是如何加载数据集的代码示例:
df = tf.keras.datasets.fashion_mnist
(train_df, train_labl), (test_df, test_labl) = df.load_data()
图像是灰度图像,需要将它们缩放到0到1之间,以便于构建模型。以下是如何缩放训练和测试数据的代码示例:
train_df = train_df / 255.0
test_df = test_df / 255.0
缩放完成后,需要重塑训练和测试数据,因为图像的值需要被组织得更好。以下是如何重塑图像的代码示例:
train_df = train_df.reshape(len(train_df), 28, 28, 1)
test_df = test_df.reshape(len(test_df), 28, 28, 1)
现在来到主要步骤,需要创建一个函数来使用多个层和参数对模型进行超参数调优。以下是如何创建这个函数的代码示例:
def build_model(hp):
model = keras.Sequential([
keras.layers.Conv2D(
filters=hp.Int('conv_1_filter', min_value=32, max_value=128, step=16),
kernel_size=hp.Choice('conv_1_kernel', values=[3, 5]),
activation='relu',
input_shape=(28, 28, 1)
),
keras.layers.Conv2D(
filters=hp.Int('conv_2_filter', min_value=32, max_value=64, step=16),
kernel_size=hp.Choice('conv_2_kernel', values=[3, 5]),
activation='relu'
),
keras.layers.Flatten(),
keras.layers.Dense(
units=hp.Int('dense_1_units', min_value=32, max_value=128, step=16),
activation='relu'
),
keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-3])),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
现在将使用Keras模块的RandomSearch来优化超参数,并使用search()方法搜索最佳参数。以下是如何进行模型优化的代码示例:
from kerastuner import RandomSearch
tuner = RandomSearch(build_model, objective='val_accuracy', max_trials=5)
tuner.search(train_df, train_labl, epochs=3, validation_data=(train_df, train_labl))
在完成超参数调优后,将测试数据与从模型调优中获得的值进行拟合。以下是如何拟合测试数据的代码示例:
model.fit(test_df, test_labl, epochs=10, validation_split=0.1, initial_epoch=3)
file_name = 'CNN'
model.save(file_name)