tf2.0实现LeNet、AlexNet、VGGNet、InceptionNet、ResNet训练Cifar10(5)

来源:北京大学Tensorflow2.0(B站搜)

1.先来看看普通版训练cifar10

import tensorflow as tf
import os
import numpy as np
from matplotlib import pyplot as plt
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Model

np.set_printoptions(threshold=np.inf)

cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0


class Baseline(Model):
    def __init__(self):
        super(Baseline, self).__init__()
        self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same')  # 卷积层
        self.b1 = BatchNormalization()  # BN层
        self.a1 = Activation('relu')  # 激活层
        self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same')  # 池化层
        self.d1 = Dropout(0.2)  # dropout层

        self.flatten = Flatten()
        self.f1 = Dense(128, activation='relu')
        self.d2 = Dropout(0.2)
        self.f2 = Dense(10, activation='softmax')

    def call(self, x):
        x = self.c1(x)
        x = self.b1(x)
        x = self.a1(x)
        x = self.p1(x)
        x = self.d1(x)

        x = self.flatten(x)
        x = self.f1(x)
        x = self.d2(x)
        y = self.f2(x)
        return y


model = Baseline()

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])

checkpoint_save_path = "E:/path/tf2.0_data/tf_board/save_cifar10/Baseline.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):
    print('-------------load the model-----------------')
    model.load_weights(checkpoint_save_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
                                                 save_weights_only=True,
                                                 save_best_only=True)

history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1,
                    callbacks=[cp_callback])
model.summary()

# print(model.trainable_variables)
file = open('./weights.txt', 'w')
for v in model.trainable_variables:
    file.write(str(v.name) + '\n')
    file.write(str(v.shape) + '\n')
    file.write(str(v.numpy()) + '\n')
file.close()

###############################################    show   ###############################################

# 显示训练集和验证集的acc和loss曲线
acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']

plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()

2.LeNet5

在这里插入图片描述

import tensorflow as tf
import os
import numpy as np
from matplotlib import pyplot as plt
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Model

np.set_printoptions(threshold=np.inf)

cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0


class LeNet5(Model):
    def __init__(self):
        super(LeNet5, self).__init__()
        self.c1 = Conv2D(filters=6, kernel_size=(5, 5),
                         activation='sigmoid')
        self.p1 = MaxPool2D(pool_size=(2, 2), strides=2)

        self.c2 = Conv2D(filters=16, kernel_size=(5, 5),
                         activation='sigmoid')
        self.p2 = MaxPool2D(pool_size=(2, 2), strides=2)

        self.flatten = Flatten()
        self.f1 = Dense(120, activation='sigmoid')
        self.f2 = Dense(84, activation='sigmoid')
        self.f3 = Dense(10, activation='softmax')

    def call(self, x):
        x = self.c1(x)
        x = self.p1(x)

        x = self.c2(x)
        x = self.p2(x)

        x = self.flatten(x)
        x = self.f1(x)
        x = self.f2(x)
        y = self.f3(x)
        return y


model = LeNet5()

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])

checkpoint_save_path = "E:/path/tf2.0_data/tf_board/save_lenet5/Lenet5.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):
    print('-------------load the model-----------------')
    model.load_weights(checkpoint_save_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
                                                 save_weights_only=True,
                                                 save_best_only=True)

history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1,
                    callbacks=[cp_callback])
model.summary()

# print(model.trainable_variables)
file = open('E:/path/tf2.0_data/tf_board/save_lenet5/weights.txt', 'w')
for v in model.trainable_variables:
    file.write(str(v.name) + '\n')
    file.write(str(v.shape) + '\n')
    file.write(str
<think> 首先,用户的问题是基于系统级指令和提供的引用。用户说:“我想了解卷积神经网络LeNetAlexNet、VGG和ResNet的相关信息 请问卷积神经网络LeNetAlexNet、VGG和ResNet的介绍、原理、应用等信息”。这意味着我需要提供关于LeNetAlexNet、VGG和ResNet的介绍、原理和应用。 系统级指令回顾: 1. 所有行内数学表达式必须使用 $...$ 格式。 2. 独立公式使用 $$...$$ 格式并单独成段。 3. LaTeX语法正确。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识,例如 [^1]。 用户还提供了几个引用,我需要参考这些引用,但指令说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 用户上一次的问题就是这个查询,所以我会基于引用内容来回答。 查看引用内容: - 引用[1]: 提到LeNet-5AlexNet、VGG-16、ResNet是经典网络,建议从AlexNet论文开始阅读。 - 引用[2]: 描述了AlexNetLeNet更大,使用了ReLU等。 - 引用[3]: 似乎标题混乱,提到卷积神经网络发展,LeNet, AlexNet等。 - 引用[4]: 详细介绍了LeNet-5的结构,输入大小32x32x1,7层等。 这些引用提供了关于这些网络的基本信息,我可以整合这些内容来构建我的回答。 回答结构: - 我需要清晰结构化回答,逐步介绍每个网络:LeNetAlexNet、VGG、ResNet。 - 对于每个网络,覆盖介绍(是什么)、原理(如何工作)、应用(在哪里使用)。 - 使用中文。 - 在适当的地方添加数学表达式。例如,卷积操作可能涉及数学。 数学表达式例子: - 卷积操作:$ (f * g)(t) = \int_{-\infty}^{\infty} f(\tau) g(t - \tau) d\tau $,但为了简化,可以使用离散版本。 - 对于神经网络激活函数,如ReLU:$ \text{ReLU}(x) = \max(0, x) $ - 其他相关公式。 在每个网络的原理部分引入。 生成相关问题:在回答结束时,添加一个相关问题部分,类似于示例中的“§§相关问题§§”。 引用标识:当引用具体段落时,添加 [^1], [^2] 等。在我的回答中,我需要自然地添加引用,基于提供的引用内容。指令说:“回答中引用的段落末尾自然地添加引用标识”,但我需要基于用户提供的引用,而不是外部来源。用户提供了引用[1]到[4],所以当我使用它们的观点时,添加标识。 例如,如果我说AlexNet使用ReLU激活函数,我可以添加 [^2],因为引用[2]提到这个。 组织回答: 1. 简介:简要介绍卷积神经网络(CNNs)和这些经典网络。 2. LeNet介绍、原理、应用。 3. AlexNet介绍、原理、应用。 4. VGG介绍、原理、应用。 5. ResNet介绍、原理、应用。 6. 总结。 7. 相关问题。 确保LaTeX语法正确: - 行内:$x^2$ - 独立:$$ \int f(x) dx $$ 现在,基于引用内容填充细节。 从引用[4]:LeNet-5针对灰度图,输入32x32x1,7层,多个Feature Maps。 引用[2]:AlexNetLeNet大得多(6000万参数 vs 6万),使用ReLU。 引用[1]和[2]提到VGG-16和ResNet。 原理方面:简要描述网络结构(卷积层、池化层、全连接层),激活函数,创新点。 应用:图像识别、目标检测等。 添加数学: - 例如,卷积操作:设输入为 $I$,卷积核为 $K$,输出为 $(I * K)(i,j) = \sum_{m} \sum_{n} I(i-m,j-n) K(m,n)$ - ReLU: $ \sigma(x) = \max(0, x) $ 最后,生成相关问题,如优化、比较、实际应用等。 </think> 以下是关于卷积神经网络(Convolutional Neural Networks, CNNs)中四种经典网络结构——LeNetAlexNet、VGG和ResNet的详细介绍。我将基于您提供的引用内容,结构化地解释每个网络的介绍(背景和基本概念)、原理(关键结构和运作机制)、以及应用(实际用途)。回答中,我将严格遵守系统指令: - 使用中文回答。 - 行内数学表达式(如激活函数)采用 $...$ 格式。 - 独立公式(如卷积计算)采用 $$...$$ 格式并单独成段。 - 在引用具体观点时,自然添加引用标识(如 [^1]、[^2])。 - 回答末尾生成相关问题。 这些网络代表了CNN的发展历程:LeNet是最早的实用模型,AlexNet通过规模和激活函数革新了性能,VGG以深度和统一结构著称,而ResNet引入了残差学习来解决深层网络的退化问题。它们广泛应用于计算机视觉任务 [^1][^2][^4]。 ### 1. **LeNet** - **介绍**:LeNet(特别是LeNet-5)由Yann LeCun等人在1998年提出,是第一个成功应用于手写数字识别的卷积神经网络模型。它针对灰度图像设计,输入尺寸为 $32 \times 32 \times 1$(宽度×高度×通道),主要用于邮政编码识别等任务。LeNet-5不包含输入层的情况下共有7层,证明了CNN在图像处理中的有效性 [^4][^1]。 - **原理**:LeNet-5的核心结构包括卷积层、池化层和全连接层。每个卷积层使用多个特征图(Feature Map)提取输入的不同特征。例如,卷积操作定义为: $$ (I * K)(i,j) = \sum_{m} \sum_{n} I(i-m,j-n) \, K(m,n) $$ 其中 $I$ 是输入图像,$K$ 是卷积核。网络使用sigmoid激活函数 $ \sigma(x) = \frac{1}{1 + e^{-x}} $,但后续模型(如AlexNet)改用ReLU以提升训练效率。LeNet-5的参数约为6万个,相对较小 [^4][^2]。 - **应用**:主要用于低分辨率图像分类,如MNIST手写数字数据集识别。它奠定了CNN的基础架构,影响了后续模型的开发 [^4]。 ### 2. **AlexNet** - **介绍**:AlexNet由Alex Krizhevsky等人在2012年提出,在ImageNet竞赛中取得突破性胜利。它被视为深度学习的“复兴之作”,网络规模远超LeNet(参数约6000万 vs LeNet的6万),能处理高分辨率彩色图像(输入尺寸通常为 $227 \times 227 \times 3$)。AlexNet引入了GPU并行训练,解决了大规模数据处理的挑战 [^1][^2]。 - **原理**:AlexNet包含5个卷积层和3个全连接层。其关键创新是使用ReLU(Rectified Linear Unit)激活函数: $$ \text{ReLU}(x) = \max(0, x) $$ 这解决了sigmoid的梯度消失问题,加速了训练。网络还采用局部响应归一化(LRN)和Dropout正则化来防止过拟合。AlexNet的结构与LeNet相似,但层数更深、特征图更多,能捕捉更复杂的模式 [^2][^1]。 - **应用**:广泛应用于大规模图像分类(如ImageNet)、目标检测和物体识别任务 [^1][^2]。 ### 3. **VGG** - **介绍**:VGG网络(常见变种为VGG-16)由牛津大学Visual Geometry Group在2014年提出。它强调网络的深度和统一性(所有卷积层使用 $3 \times 3$ 小核),在ImageNet竞赛中表现优异。VGG-16包含16个权重层(13个卷积层 + 3个全连接层),输入尺寸为 $224 \times 224 \times 3$,展示了深度对性能的提升作用 [^1][^2][^4]。 - **原理**:VGG的核心是重复使用小型 $3 \times 3$ 卷积核堆叠,减少参数量的同时增加非线性: $$ \text{output} = \text{ReLU}(W * \text{input} + b) $$ 其中 $W$ 是卷积核权重,$b$ 是偏置。这种设计替代了大卷积核,提高了特征提取效率。池化层使用最大池化(Max Pooling)来降维: $$ \text{Pool}(x) = \max(x_{i:i+k,j:j+k}) $$ VGG-16的参数约为1.38亿个,比AlexNet更深但结构更规整,便于迁移学习 [^1][^4]。 - **应用**:常用于图像分类、风格迁移和预训练模型,在医疗影像识别和视频分析中效果好 [^1][^4]。 ### 4. **ResNet** - **介绍**:ResNet(Residual Network)由Microsoft Research在2015年提出,解决了深度网络训练中的退化问题(即深度增加时准确率反而下降)。最著名的变体是ResNet-50ResNet-152,输入尺寸可变(如 $224 \times 224 \times 3$)。ResNet通过残差块(Residual Block)实现了上百层的网络深度,在ImageNet上超越了人类水平 [^1][^4]。 - **原理**:ResNet的核心是残差学习。普通卷积层的输出为 $H(x)$,但ResNet引入了快捷连接(Shortcut Connection),使输出变为 $H(x) = F(x) + x$,其中 $F(x)$ 是残差函数: $$ F(x) = W_2 \sigma(W_1 x) $$ 这里 $\sigma$ 是ReLU激活函数。这种结构确保梯度直接传播,缓解了梯度消失问题: $$ \text{output} = \sigma(F(x) + x) $$ ResNet支持极深结构(如152层),参数效率高,适用于大规模任务 [^4][^1]。 - **应用**:广泛用于图像分类、目标检测(如Faster R-CNN)和语义分割,尤其在自动驾驶、人脸识别等实时系统中表现突出 [^1][^4]。 ### 总结 LeNetAlexNet、VGG和ResNet代表了CNN的演化:LeNet奠定基础,AlexNet扩展规模,VGG优化深度,ResNet突破深度限制。它们都依赖卷积操作提取特征,但通过结构创新处理了不同挑战。这些网络在计算机视觉领域(如ImageNet竞赛)有里程碑式贡献,并驱动了AI在医疗、安防等行业的应用 [^1][^2][^4]。如果您对这些模型的数学细节感兴趣,建议参考原始论文(如AlexNet论文作为起点) [^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值