本文首发于微信公众号“计算机视觉cv”

# Title文章标题

ImageNet classification with deep revolutional Neural Networks(也就是经典的Alexnet网络)

# Summary

作者使用ImageNet更大的数据集来训练神经网络。

1、激活函数

与传统论文使用的tanh和sigmoid激活函数不同,本论文使用的是非线性函数Relu(Rectified Linear Units)函数。

论文中称ReLU会使训练误差下降的更快。如下图所示

2、在多GPU中运行

论文中使用了两块GTX580训练,两个GPU会在特定的层进行通信。双GPU会使得提高1.7%的top-1和1.2%的top-5准确度。并且会加快训练速度。

3、局部响应归一化

ReLU本不需要对输入进行标准化,但是作者发现进行局部相应归一化能够提升性能。归一化公式如下:

4、 重叠池化

在传统方法中,相邻池化单元之间互不重叠,但是实验表示使用带交叠的Pooling的效果比的传统要好,在top-1和top-5上分别提高了0.4%和0.3%,在训练阶段有避免过拟合的作用。

5、神经网络结构

该网络包含了八层权重:前五个是卷积层,其余三个为全连接层。最后的全连接层的输出被送到1000维的softmax函数,其产生1000个类的预测。我们的网络最大化多项逻辑回归目标,这相当于在预测的分布下最大化训练样本中正确标签对数概率的平均值。第二,第四和第五个卷积层的内核仅与上一层存放在同一GPU上的内核映射相连。第三个卷积层的内核连接到第二层中的所有内核映射。全连接层中的神经元连接到前一层中的所有神经元。响应归一化层紧接着第一个和第二个卷积层,后面连接响应归一化层以及第五个卷积层。将ReLU应用于每个卷积层和全连接层的输出。

6、减少过拟合

减少过拟合有两种方法:一种是数据增强,一种是Dropout。

①数据增强:对图片进行水平映射、垂直映射、旋转等等变换。由于是对图片进行较小的计算,所以增强后的图片不用保存到硬盘里。

②Dropout:在训练期间,只需要消耗1/2的参数。它会以50%的概率将隐含层的神经元输出置为0。以这种方法被置0的神经元不参与网络的前馈和反向传播。因此,每次给网络提供了输入后,神经网络都会采用一个不同的结构,但是这些结构都共享权重。这种技术减少了神经元的复杂适应性,因为神经元无法依赖于其他特定的神经元而存在。因此,它被迫学习更强大更鲁棒的功能,使得这些神经元可以与其他神经元的许多不同的随机子集结合使用。

7、训练细节

论文中使用随机梯度下降,权重衰减为0.005,momentum为0.9,batch_size=128。

使用标准差=0.01,均值为0的高斯分布来初始化权重。在第二、四、五还有全连接层使用偏差为1来加速前期的训练,在其余层使用偏差为0。对每个层使用相同的学习率,learning_rate=0.01,训练过程进行3次的手动调整。

# Evaluation

去掉任一层都会使得结果降低,说明深度很重要。

没有使用无监督方法去预训练数据。对视频序列效果不明显,因为时间结构往往在静态图像中丢失了。

# Code

import pandas as pd
import numpy as np
from keras.callbacks import EarlyStopping, ModelCheckpoint
from matplotlib import pyplot as plt
from skimage.io import imread, imshow
from skimage import transform
import warnings
from tqdm import tqdm
from keras.layers import Input, Lambda, Conv2D, MaxPool2D, BatchNormalization, Dense, Flatten, Dropout
from keras.models import Model
from keras.utils import to_categoricalwarnings.filterwarnings('ignore')image_path = 'F:\\Keras_cnn\\images\\'  #文件路径这样写才正确,刚开始以为是'/'一直显示找不到该文件
IMG_HEIGHT = 400
IMG_WIDTH = 500
IMG_CHANNELS = 1
'''处理label
'''
train_csv = pd.read_csv('train.csv')
train_label_string = train_csv['species'].values
train_id = train_csv['id'].valueslaber_number_dict = {}
train_label_number = []
number = 0
for i in train_label_string:if i in laber_number_dict:train_label_number.append(laber_number_dict[i])else:laber_number_dict.update({i: number})train_label_number.append(number)number += 1id_label_dict = dict(zip(train_id, train_label_number))test_csv = pd.read_csv('test.csv')
test_id = test_csv['id'].valuestrain_data = np.zeros((len(train_id), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)
train_label = np.zeros((len(train_id), 1), dtype=np.uint8)
test_data = np.zeros((len(test_id), IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS), dtype=np.uint8)for n, i in tqdm(enumerate(train_id), total=len(train_data)):image_data = imread(image_path + str(i) + '.jpg')image_data = transform.resize(image_data, (IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))train_data[n] = image_datatrain_label[n] = id_label_dict[i]train_label = to_categorical(train_label, 99)for n, i in tqdm(enumerate(test_id), total=len(test_id)):image_data = imread(image_path + str(i) + '.jpg')image_data = transform.resize(image_data, (IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS))test_data[n] = image_datarandom_number = np.random.randint(len(train_id))
show_train_data = train_data[random_number].reshape(IMG_HEIGHT, IMG_WIDTH)
imshow(show_train_data)
plt.show()'''开始搭建 AlexNet
'''inputs = Input((IMG_HEIGHT, IMG_WIDTH, 1))
c1 = Conv2D(48, (11, 11), strides=4, activation='relu', kernel_initializer='uniform', padding='valid')(inputs)
c2 = BatchNormalization()(c1)
c3 = MaxPool2D((3, 3), strides=2, padding='valid')(c2)c4 = Conv2D(128, (5, 5), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c3)
c5 = BatchNormalization()(c4)
c6 = MaxPool2D((3, 3), strides=2, padding='valid')(c5)c7 = Conv2D(192, (3, 3), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c6)
c8 = Conv2D(192, (3, 3), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c7)
c9 = Conv2D(128, (3, 3), strides=1, padding='same', activation='relu', kernel_initializer='uniform')(c8)
c10 = MaxPool2D((3, 3), strides=2, padding='valid')(c9)c11 = Flatten()(c10)
c12 = Dense(256, activation='relu')(c11)  # 论文中是2048
c13 = Dropout(0.5)(c12)c14 = Dense(256, activation='relu')(c13)  # 论文中是2048
c15 = Dropout(0.5)(c14)
outputs = Dense(99, activation='softmax')(c15)  # 论文中是1000model = Model(inputs=[inputs], outputs=[outputs])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()earlystopper = EarlyStopping(patience=5, verbose=1)
checkpointer = ModelCheckpoint('model-1.h5', verbose=1, save_best_only=True)
model.fit(train_data, train_label, validation_split=0.1, batch_size=256, epochs=256,callbacks=[earlystopper, checkpointer])

Alexnet论文解读及代码实现相关推荐

  1. AlexNet论文解读与代码实现

    文章目录 1. 论文解读 1.1 泛读 1.1.1 标题与作者 1.1.2 摘要 1.1.3 结论(讨论) 1.1.4 重要图 1.1.5 重要表 1.2 精读 1.2.1 文章精解 1.2.1.1 ...

  2. 单目标跟踪算法:Siamese RPN论文解读和代码解析

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:周威 | 来源:知乎 https://zhuanlan.zhihu.com/p/16198364 ...

  3. AlexNet论文解读以Pytorch实现(含论文训练细节)

    AlexNet论文解读以Pytorch实现 一.AlexNet背景 1.ILSVRC 2.GPU 二.AlexNet研究成果及意义 1.研究成果 2.研究意义 三.AlexNet网络结构 1.网络结构 ...

  4. CVPR 2020 Oral 文章汇总,包括论文解读与代码实现

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要10分钟 Follow小博主,每天更新前沿干货 [导读]本文为大家整理了10篇CVPR2020上被评为Oral的论文解读和代码汇总. 1.Ra ...

  5. 【Cylinder3D论文解读及代码略解】

    Cylinder3D论文解读及代码略解 论文解读 Abstract Introduction Related work 室内点云分割 室外点云分割 3D体素划分 Methodology(本文方法) C ...

  6. FPN论文解读 和 代码详解

    FPN论文解读 和 代码详解 论文地址:[Feature Pyramid Networks for Object Detection](1612.03144v2.pdf (arxiv.org)) 代码 ...

  7. AlexNet论文解读

    AlexNet论文翻译及解读 摘要 1.网络结构 卷积层:5个(其中一些后面跟着最大池化层) 全连接层:3个(连接着一个最终是1000路的softmax) 2.tips 非饱和神经元,使用GPU实现 ...

  8. 【AI】《ResNet》论文解读、代码实现与调试找错

    前言 残差网络Resnet,被誉为撑起计算机视觉半边天的文章,重要性不言而喻.另外,文章作者何凯明,在2022年AI 2000人工智能最具影响力学者排行里排名第一: 为什么这篇文章影响力这么大呢? 通 ...

  9. U2Net论文解读及代码测试

    论文名称: U2-Net: Going Deeper with Nested U-Structure for Salient Object Detection 论文地址: https://arxiv. ...

最新文章

  1. 网络模型--Squeeze-and-Excitation Networks
  2. 垃圾要分类!我们的大脑如何处理垃圾呢?
  3. 设CPU中各部件及其相互连接关系如下图所示。图中W是写控制标志,R是读控制标志,R 1 和R 2 是暂存器
  4. 一个高级的makefile文件
  5. TextKit简单示例
  6. 大道至简第四章阅读笔记
  7. cf1557 C. Moamen and XOR
  8. 兼容所有浏览器的网页制作方法
  9. CVPR 2020丨基于范例的精细可控图像翻译CoCosNet,一键生成你心目中的图像
  10. 第八届蓝桥杯第一题购物单
  11. 大数据系列2-liunx基础-2基本操作
  12. 马斯洛需求的五个层次_运用马斯洛需求层次理论分析《吞噬星空》爽点之第九章...
  13. 华为 “OSPF” 认证配置
  14. SQL查看存储过程相关信息
  15. codevs4919 线段树练习4
  16. 第十五周项目3-在OJ上玩指针
  17. FluentValidation:一个非常受欢迎的,用于构建强类型验证规则的.NET 库
  18. 笔记本显示未连接录音服务器,电脑显示未安装音频设备怎么办?
  19. 给第一次参加数学建模竞赛的小白的建议
  20. 机器学习之层次聚类(hierarchical clustering)

热门文章

  1. 基于git命令的代码统计方法
  2. Centos-检查文件系统并尝试修复-fsck
  3. sklearn—特征工程
  4. LeetCode Min Stack 最小值栈
  5. UVa 1640 (计数) The Counting Problem
  6. vs2008 编译libtorrent
  7. [转]ubuntu network is unreachable 解决记
  8. python运行错误总结(按字母序)
  9. 在微型计算机系统中 下列叙述正确的是,全国2011年10月高等教育自学考试计算机应用基础试题及答案...
  10. 多态——面向接口编程