Yin Guoqing Postgraduate of NJUPT

AlexNet

2018-04-14

AlexNet原论文作者是大神Alex Krizhevsky,属于多伦多大学Hinton组,获得 了2012ImageNet大赛冠军,为cifar-1000数据集分类。

结构简介

这幅图摘自原论文,但是输入尺寸应该是227227,原文中的224224也对,输入的大小取决于对tensorflow源码中padding=‘SAME‘ or ‘VALID’,其实就是用0填充成227*227,关于padding可以参考这篇博客,如下图所示:

AlexNet使用Relu,在当时是较新颖,现在满地开花;AlexNet在2块GPU上训练了5-6天;5个卷积层中只有第二个卷积层是全连接, 其余卷积层的特征映射的输入仅所在GPU上层特征输出。

LRN

local-response-normalization,类似于人类神经中的侧面抑制原理,若当前神经元兴奋度最高,会抑制周围的神经元。论文中 说top1 error降低1.4%,top5 error降低1.2%。现在关于LRN的有效性存在争论,2014的VGG论文中作者进行对比,发现LRN作用不大。

数据增强

Alexnet中参数一共60万个,会造成过拟合,为了防止过拟合,原论文中使用了dropout(现在也很普遍)和数据增强。

两种数据增强方法:

  • 原图像256256,选取224224(相连的),一幅图可以衍生有3333种;图像水平反转,一幅图衍生2中;总共3333*2=2178,论文中说是2048
  • 改变原图像RGB值,用到了PCA,在添加一个噪声系数,具体的没搞懂,有需要时再看。

PCA Jittering

参考,由于我的图片是RGBA,所以改了一行代码,代码按照论文中的代码 实现,对比效果图只是颜色的改变。

import numpy as np
import os
from PIL import Image, ImageOps
import argparse
import random
from scipy import misc


def PCA_Jittering(path):
    img_list = os.listdir(path)
    img_num = len(img_list)

    for i in range(img_num):
        img_path = os.path.join(path, img_list[i])
        img = Image.open(img_path)

        img = np.asanyarray(img, dtype='float32')[:,:,0:3]

        img = img / 255.0
        img_size = img.size / 3
        img1 = img.reshape(int(img_size), 3)
        img1 = np.transpose(img1)
        img_cov = np.cov([img1[0], img1[1], img1[2]])
        lamda, p = np.linalg.eig(img_cov)

        p = np.transpose(p)

        alpha1 = random.normalvariate(0, 3)
        alpha2 = random.normalvariate(0, 3)
        alpha3 = random.normalvariate(0, 3)

        v = np.transpose((alpha1 * lamda[0], alpha2 * lamda[1], alpha3 * lamda[2]))
        add_num = np.dot(p, v)

        img2 = np.array([img[:, :, 0] + add_num[0], img[:, :, 1] + add_num[1], img[:, :, 2] + add_num[2]])

        img2 = np.swapaxes(img2, 0, 2)
        img2 = np.swapaxes(img2, 0, 1)
        save_name = 'pre' + str(i) + '.png'
        save_path = os.path.join(path, save_name)
        misc.imsave(save_path, img2)

下一篇 NIN

Comments

Content