基于AlexNet模型的图像分类

本文介绍了基于AlexNet模型的图像分类。AlexNet框架包含输入层、5个卷积层、3个全连接层和输出层,使用Relu激活函数和局部响应归一化提升性能。通过重叠池化缓解过拟合,并采用丢弃层减少过拟合。实验使用了400张左右训练图片,未来可通过增加数据量和参数调整提高准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:基于AlexNet模型的图像分类

AlexNet 框架包含了输入层、5个卷积层、3个全连接层以及输出层。其中有3个卷积层进行了最大池化。

AlexNet框架的特点:1、使用了Relu激活函数,相比于sigmoid或tanh函数,它是一种非饱和函数,运行速度更快;并且Relu激活函数利用分片线性结构实现了非线性的表达方式,更适合于层数较深的网络。

2、局部响应归一化:为了改善网络的性能,在部分卷积层中使用了归一化处理。

3、重叠池化:传统的池化没有重叠,不同窗口的池化过程独立计算。AlexNet使用了重叠池化,与不重叠窗口相比,有助于缓解过拟合现象。

4、同时,AlexNet网络采用丢失输出操作减少过拟合现象。

具体实现:

inputdata.py:定义了数据集的情况,数据集中一共有两类图片,分别是sun.jpg,另一类是cac.jpg.对这两类图片进行读取。

inputdata.py
import tensorflow as tf
import os
import numpy as np
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

def get_files(file_dir):
    sun = []
    label_sun = []
    cac = []
    label_cac = []
    for file in os.listdir(file_dir):
        name = file.split(sep='.')
        if 'sun' in name[0]:
            sun.append(file_dir + file)
            label_sun.append(0)
        else:
            if 'cac' in name[0]:
                cac.append(file_dir + file)
                label_cac.append(1)
        image_list = np.hstack((sun, cac))
        label_list = np.hstack((label_sun, label_cac))

    # 把标签和图片都放倒一个 temp 中 然后打乱顺序,然后取出来
    temp = np.array([image_list, label_list])
    temp = temp.transpose()
    # 打乱顺序
    np.random.shuffle(temp)

    # 取出第一个元素作为 image 第二个元素作为 label
    image_list = list(temp[:, 0])
    label_list = list(temp[:, 1])
    label_list = [int(i) for i in label_list]
    return image_list, label_list


# image_W ,image_H 指定图片大小,batch_size 每批读取的个数 ,capacity队列中 最多容纳元素的个数
def get_batch(image, label, image_W, image_H, batch_size, capacity):
    # 转换数据为 ts 能识别的格式
    image = tf.cast(image, tf.string)
    label = tf.cast(label, tf.int32)

    # 将image 和 label 放倒队列里
    input_queue = tf.train.slice_input_producer([image, label])
    label = input_queue[1]
    # 读取图片的全部信息
    image_contents = tf.read_file(input_queue[0])
    # 把图片解码,channels =3 为彩色图片, r,g ,b  黑白图片为 1 ,也可以理解为图片的厚度
    image = tf.image.decode_png(image_contents, channels=3)
    # 将图片以图片中心进行裁剪或者扩充为 指定的image_W,image_H
    image = tf.image.resize_image_with_crop_or_pad(image, image_W, image_H)
    # 对数据进行标准化,标准化,就是减去它的均值,除以他的方差
    image = tf.image.per_image_standardization(image)

    # 生成批次  num_threads 有多少个线程根据电脑配置设置  capacity 队列中 最多容纳图片的个数  tf.train.shuffle_batch 打乱顺序,
    image_batch, label_batch = tf.train.batch([image, label], batch_size=batch_size, num_threads=4, capacity=capacity)

    # 重新定义下 label_batch 的形状
    label_batch = tf.reshape(label_batch, [batch_size])
    # 转化图片
    image_batch = tf.cast(image_batch, tf.float32)
    return image_batch, label_ba
### 使用 PaddlePaddle 实现基于 AlexNet图像分类 #### 背景介绍 AlexNet 是一种经典的卷积神经网络 (CNN),由 Hinton 和他的学生在 2012 年提出,并赢得了当年的 ImageNet 图像识别竞赛冠军。它通过引入 ReLU 激活函数、Dropout 正则化技术以及数据增强等手段显著提高了模型性能[^1]。 尽管原始 AlexNet 设计用于 GPU 计算并依赖于特定硬件配置,现代深度学习框架如 PaddlePaddle 提供了灵活的支持,使得我们可以轻松实现该模型并应用于各种图像分类任务。 --- #### AlexNet 结构概述 AlexNet 主要由以下几部分组成: 1. **输入层**:通常接受固定大小的 RGB 图片作为输入(例如 \(227 \times 227\) 像素)。 2. **卷积层**:包含多个卷积操作,使用较大的滤波器尺寸(如 \(11 \times 11\), \(5 \times 5\)),并通过步幅控制特征图的空间维度减少。 3. **激活函数**:ReLU 函数被广泛采用以加速收敛过程。 4. **池化层**:局部响应归一化 (LRN) 或最大池化层进一步降低计算复杂度。 5. **全连接层**:最后几个全连接层负责提取高层语义特征并将它们映射到类别标签上。 6. **Softmax 输出层**:最终输出概率分布表示预测结果所属类别的可能性。 这些组件共同构成了一个强大的架构,在许多实际应用场景下表现出优异的表现能力。 --- #### 如何用 PaddlePaddle 构建 AlexNet? 以下是利用 PaddlePaddle 定义和训练 AlexNet 进行图像分类的具体代码示例: ```python import paddle from paddle.nn import Conv2D, MaxPool2D, Linear, Dropout, BatchNorm2D, AdaptiveAvgPool2D import numpy as np class AlexNet(paddle.nn.Layer): def __init__(self, num_classes=1000): # 默认设置为ImageNet中的1000个类别 super(AlexNet, self).__init__() self.conv1 = Conv2D(in_channels=3, out_channels=96, kernel_size=11, stride=4, padding=0) self.bn1 = BatchNorm2D(96) self.pool1 = MaxPool2D(kernel_size=3, stride=2) self.conv2 = Conv2D(in_channels=96, out_channels=256, kernel_size=5, stride=1, padding=2) self.bn2 = BatchNorm2D(256) self.pool2 = MaxPool2D(kernel_size=3, stride=2) self.conv3 = Conv2D(in_channels=256, out_channels=384, kernel_size=3, stride=1, padding=1) self.conv4 = Conv2D(in_channels=384, out_channels=384, kernel_size=3, stride=1, padding=1) self.conv5 = Conv2D(in_channels=384, out_channels=256, kernel_size=3, stride=1, padding=1) self.pool3 = MaxPool2D(kernel_size=3, stride=2) self.avgpool = AdaptiveAvgPool2D((6, 6)) self.dropout = Dropout(p=0.5) self.fc1 = Linear(in_features=256 * 6 * 6, out_features=4096) self.fc2 = Linear(in_features=4096, out_features=4096) self.fc3 = Linear(in_features=4096, out_features=num_classes) def forward(self, x): x = self.pool1(F.relu(self.bn1(self.conv1(x)))) x = self.pool2(F.relu(self.bn2(self.conv2(x)))) x = F.relu(self.conv3(x)) x = F.relu(self.conv4(x)) x = self.pool3(F.relu(self.conv5(x))) x = self.avgpool(x) x = paddle.flatten(x, start_axis=1) x = self.dropout(F.relu(self.fc1(x))) x = self.dropout(F.relu(self.fc2(x))) x = self.fc3(x) return x # 初始化模型实例 model = AlexNet(num_classes=2) # 假设二分类问题,比如猫狗分类 # 打印模型结构概览 print(model) # 配置优化器与损失函数 optimizer = paddle.optimizer.Adam(parameters=model.parameters(), learning_rate=0.001) loss_fn = paddle.nn.CrossEntropyLoss() # 数据加载器定义省略... ``` 上述代码片段展示了如何创建自定义版本的 AlexNet 网络,并将其适配至目标分类数目 `num_classes` 上。注意这里假设了一个简单的二元分类场景(即区分两类对象)。如果需要扩展到更多种类,则只需调整参数即可[^3]。 --- #### 关键点解析 - **Batch Normalization 层的应用**:虽然原版 AlexNet 中并未涉及批量标准化处理,但在实践中加入 BN 可有效提升泛化能力和稳定性[^2]。 - **Adaptive Pooling 替代传统 Fixed Size Pooling**:为了兼容不同分辨率图片输入,可以考虑替换掉固定的 max pooling 设置成 adaptive 形式。 - **正则项的选择**:除了 dropout 外还可以尝试 L2 weight decay 来防止过拟合现象发生。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值