Inception v1:开启深度学习的新时代
Inception v1,也被称为GoogLeNet,是Inception系列的开山之作。它的核心贡献在于提出了一种新的网络结构,通过改善计算资源的利用,实现了在保持计算成本不变的情况下增加网络的深度和宽度。Inception v1的主要特点包括:
1. Inception模块:这是Inception v1的核心,它通过并行的卷积和池化操作,捕获不同尺度的特征。
2. 1x1卷积:用于降维,减少计算瓶颈,同时增加网络的深度。
3. 辅助分类器:在网络中间层添加辅助分类器,帮助梯度回流,增强模型的判别能力。
Inception v2:引入Batch Normalization
Inception v2在v1的基础上引入了Batch Normalization(BN),这是一种用于改善训练过程的技术,通过规范化层的输入来加速训练并提高模型的泛化能力。Inception v2的主要改进包括:
1. Batch Normalization:在每个卷积层后应用BN,以减少内部协变量偏移。
2. 分解卷积:将7x7卷积分解为两个3x3卷积,减少参数数量并提高非线性表达能力。
Inception v3:进一步的优化与正则化
Inception v3在v2的基础上进一步优化了网络结构,并引入了更多的正则化技术。Inception v3的主要特点和改进包括:
1. 设计原则:Inception v3的设计遵循了几个核心原则,包括避免早期的表达瓶颈、高维特征的局部处理更容易、空间聚合可以在低维嵌入中完成,以及平衡网络的宽度和深度。
2. 分解大卷积核:Inception v3进一步分解了大卷积核,例如将7x7卷积分解为1x7和7x1卷积的组合,以减少计算量。
3. 辅助分类器:Inception v3使用了带有BN的辅助分类器,这不仅帮助梯度回流,还提供了额外的正则化。
4. 标签平滑:Inception v3引入了标签平滑技术,这是一种正则化手段,可以提高模型的泛化能力。
Inception v3的这些改进使得它在ILSVRC 2012分类基准测试中取得了优异的性能,同时保持了相对较低的计算成本。Inception系列模型的发展,不仅推动了深度学习在图像识别领域的进步,也为后续的模型设计提供了宝贵的经验和启示。
import time
from matplotlib import pyplot as plt
import numpy as np
import cv2
import os
from keras.applications import InceptionV3
from keras.applications.inception_v3 import preprocess_input
from keras.models import Model
from keras.layers import Dense, Flatten
from keras.optimizers import Adam
from sklearn.model_selection import train_test_split
from tqdm import tqdm
# 读取数据(仅加载前1000个样本)
def load_data(txt_file, img_size, max_samples=1000):
images = []
labels = []
count = 0 # 计数器
with open(txt_file, 'r') as file:
for line in tqdm(file.readlines(), ncols=150, colour='red'):
if count >= max_samples: # 只加载前 max_samples 个数据
break
img_path, label = line.strip().split()
img = cv2.imread(img_path)
img = cv2.resize(img, (img_size, img_size)) # 调整图像大小
img = preprocess_input(img) # 预处理
images.append(img)
labels.append(int(label))
count += 1
return np.array(images), np.array(labels)
# 记录训练开始时间
start_time = time.time()
# 加载训练数据集
img_size = 299 # InceptionV3 输入尺寸
train_txt_file = r"data\datapath\training_set.txt" # 训练集 txt 文件路径
X_train, y_train = load_data(train_txt_file, img_size, max_samples=20000)
# 加载测试数据集
test_txt_file = r"data\datapath\testing_set.txt" # 测试集 txt 文件路径
X_test, y_test = load_data(test_txt_file, img_size, max_samples=1000)
# 使用 InceptionV3 模型
base_model = InceptionV3(weights='imagenet', include_top=False, input_shape=(img_size, img_size, 3))
# 取消 InceptionV3 的卷积层冻结,使模型可训练
for layer in base_model.layers:
layer.trainable = True
# 添加自定义的全连接层
x = Flatten()(base_model.output)
x = Dense(128, activation='relu')(x)
x = Dense(64, activation='relu')(x)
output = Dense(1, activation='sigmoid')(x) # 二分类问题
# 创建模型
model = Model(inputs=base_model.input, outputs=output)
# 编译模型
model.compile(optimizer=Adam(lr=0.0001), loss='binary_crossentropy', metrics=['acc'])
# 训练模型
batch_size = 32
epochs = 10
history = model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(X_test, y_test))
# 记录训练结束时间并计算训练时间
train_time = time.time() - start_time
print(f"Total Training Time: {train_time:.2f} seconds")
# 打印训练精度
train_acc = history.history['acc'][-1]
print(f"Final Training Accuracy: {train_acc * 100:.2f}%")
# 记录测试开始时间
start_test_time = time.time()
# 评估模型
test_loss, test_acc = model.evaluate(X_test, y_test)
# 记录测试结束时间并计算测试时间
test_time = time.time() - start_test_time
print(f"Total Testing Time: {test_time:.2f} seconds")
print(f"Test Accuracy: {test_acc * 100:.2f}%")
# 绘制损失曲线
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['acc'], label='Training accuracy')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()