Inception系列深度解析:从Inception v1到Inception v3

文摘   2024-10-29 21:36   中国澳门  

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 timefrom matplotlib import pyplot as pltimport numpy as npimport cv2import osfrom keras.applications import InceptionV3from keras.applications.inception_v3 import preprocess_inputfrom keras.models import Modelfrom keras.layers import Dense, Flattenfrom keras.optimizers import Adamfrom sklearn.model_selection import train_test_splitfrom 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 = 32epochs = 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_timeprint(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_timeprint(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()


海洋遥感Dynamic和AI
海洋遥感(基于光学遥感、合成孔径雷达、卫星测高数据等的海洋现象研究),主要方法为人工智能与海洋动力学的结合,本公粽号将会进行代码、资料,文献等分享。