深度学习进阶笔记之三深入理解AlexnetWord下载.docx

上传人:b****6 文档编号:20030594 上传时间:2023-01-16 格式:DOCX 页数:16 大小:374.22KB
下载 相关 举报
深度学习进阶笔记之三深入理解AlexnetWord下载.docx_第1页
第1页 / 共16页
深度学习进阶笔记之三深入理解AlexnetWord下载.docx_第2页
第2页 / 共16页
深度学习进阶笔记之三深入理解AlexnetWord下载.docx_第3页
第3页 / 共16页
深度学习进阶笔记之三深入理解AlexnetWord下载.docx_第4页
第4页 / 共16页
深度学习进阶笔记之三深入理解AlexnetWord下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

深度学习进阶笔记之三深入理解AlexnetWord下载.docx

《深度学习进阶笔记之三深入理解AlexnetWord下载.docx》由会员分享,可在线阅读,更多相关《深度学习进阶笔记之三深入理解AlexnetWord下载.docx(16页珍藏版)》请在冰豆网上搜索。

深度学习进阶笔记之三深入理解AlexnetWord下载.docx

ReLUNonlinearity

一般来说,刚接触神经网络还没有深入了解深度学习的小伙伴们对这个都不会太熟,一般都会更了解另外两个激活函数(真正往神经网络中引入非线性关系,使神经网络能够有效拟合非线性函数)tanh(x)和(1+e^(-x))^(-1),而ReLU(RectifiedLinearUnits)f(x)=max(0,x)。

基于ReLU的深度卷积网络比基于tanh的网络训练块数倍,下图是一个基于CIFAR-10的四层卷积网络在tanh和ReLU达到25%的trainingerror的迭代次数:

实线、间断线分别代表的是ReLU、tanh的trainingerror,可见ReLU比tanh能够更快的收敛

LocalResponseNormalization

使用ReLUf(x)=max(0,x)后,你会发现激活函数之后的值没有了tanh、sigmoid函数那样有一个值域区间,所以一般在ReLU之后会做一个normalization,LRU就是稳重提出(这里不确定,应该是提出?

)一种方法,在神经科学中有个概念叫“Lateralinhibition”,讲的是活跃的神经元对它周边神经元的影响。

Dropout

Dropout也是经常挺说的一个概念,能够比较有效地防止神经网络的过拟合。

相对于一般如线性模型使用正则的方法来防止模型过拟合,而在神经网络中Dropout通过修改神经网络本身结构来实现。

对于某一层神经元,通过定义的概率来随机删除一些神经元,同时保持输入层与输出层神经元的个人不变,然后按照神经网络的学习方法进行参数更新,下一次迭代中,重新随机删除一些神经元,直至训练结束

DataAugmentation

其实,比较简单的增强模型性能,防止模型过拟合的方法是增加数据,但是其实增加数据也是有策略的,paper当中从256*256中随机提出227*227的patches(paper里面是224*224),还有就是通过PCA来扩展数据集。

这样就很有效地扩展了数据集,其实还有更多的方法视你的业务场景去使用,比如做基本的图像转换如增加减少亮度,一些滤光算法等等之类的,这是一种特别有效地手段,尤其是当数据量不够大的时候。

文章里面,我认为的基本内容就是这个了,基本的网络结构和一些防止过拟合的小的技巧方法,对自己在后面的项目有很多指示作用。

AlexNetOnTensorflow

caffe的AlexNet可以到/models/bvlc_alexnet/train_val.prototxt去看看具体的网络结构,这里我会弄点基于Tensorflow的AlexNet,代码在:

http:

//www.cs.toronto.edu/~guerzhoy/tf_alexnet/

fromnumpyimport

importos

frompylabimport

importnumpyasnp

importmatplotlib.pyplotasplt

importmatplotlib.cbookascbook

importtime

fromscipy.miscimportimread

fromscipy.miscimportimresize

importmatplotlib.imageasmpimg

fromscipy.ndimageimportfilters

importurllib

fromnumpyimportrandom

 

importtensorflowastf

fromcaffe_classesimportclass_names

train_x=zeros((1,227,227,3)).astype(float32)

train_y=zeros((1,1000))

xdim=train_x.shape[1:

]

ydim=train_y.shape[1]

net_data=load("

bvlc_alexnet.npy"

).item()

defconv(input,kernel,biases,k_h,k_w,c_o,s_h,s_w,padding="

VALID"

group=1):

'

'

From[

c_i=input.get_shape()[-1]

assertc_i%group==0

assertc_o%group==0

convolve=lambdai,k:

tf.nn.conv2d(i,k,[1,s_h,s_w,1],padding=padding)

ifgroup==1:

conv=convolve(input,kernel)

else:

input_groups=tf.split(3,group,input)

kernel_groups=tf.split(3,group,kernel)

output_groups=[convolve(i,k)fori,kinzip(input_groups,kernel_groups)]

conv=tf.concat(3,output_groups)

returntf.reshape(tf.nn.bias_add(conv,biases),conv.get_shape().as_list())

x=tf.Variable(i)

#conv1

#conv(11,11,96,4,4,padding='

VALID'

name='

conv1'

k_h=11;

k_w=11;

c_o=96;

s_h=4;

s_w=4

conv1W=tf.Variable(net_data["

conv1"

][0])

conv1b=tf.Variable(net_data["

][1])

conv1_in=conv(x,conv1W,conv1b,k_h,k_w,c_o,s_h,s_w,padding="

SAME"

group=1)

conv1=tf.nn.relu(conv1_in)

#lrn1

#lrn(2,2e-05,0.75,name='

norm1'

radius=2;

alpha=2e-05;

beta=0.75;

bias=1.0

lrn1=tf.nn.local_response_normalization(conv1,

depth_radius=radius,

alpha=alpha,

beta=beta,

bias=bias)

#maxpool1

#max_pool(3,3,2,2,padding='

pool1'

k_h=3;

k_w=3;

s_h=2;

s_w=2;

padding='

maxpool1=tf.nn.max_pool(lrn1,ksize=[1,k_h,k_w,1],strides=[1,s_h,s_w,1],padding=padding)

#conv2

#conv(5,5,256,1,1,group=2,name='

conv2'

k_h=5;

k_w=5;

c_o=256;

s_h=1;

s_w=1;

group=2

conv2W=tf.Variable(net_data["

conv2"

conv2b=tf.Variable(net_data["

conv2_in=conv(maxpool1,conv2W,conv2b,k_h,k_w,c_o,s_h,s_w,padding="

group=group)

conv2=tf.nn.relu(conv2_in)

#lrn2

norm2'

lrn2=tf.nn.local_response_normalization(conv2,

#maxpool2

pool2'

maxpool2=tf.nn.max_pool(lrn2,ksize=[1,k_h,k_w,1],strides=[1,s_h,s_w,1],padding=padding)

#conv3

#conv(3,3,384,1,1,name='

conv3'

c_o=384;

group=1

conv3W=tf.Variable(net_data["

conv3"

conv3b=tf.Variable(net_data["

conv3_in=conv(maxpool2,conv3W,conv3b,k_h,k_w,c_o,s_h,s_w,padding="

conv3=tf.nn.relu(conv3_in)

#conv4

#conv(3,3,384,1,1,group=2,name='

conv4'

conv4W=tf.Variable(net_data["

conv4"

conv4b=tf.Variable(net_data["

conv4_in=conv(conv3,conv4W,conv4b,k_h,k_w,c_o,s_h,s_w,padding="

conv4=tf.nn.relu(conv4_in)

#conv5

#conv(3,3,256,1,1,group=2,name='

conv5'

conv5W=tf.Variable(net_data["

conv5"

conv5b=tf.Variable(net_data["

conv5_in=conv(conv4,conv5W,conv5b,k_h,k_w,c_o,s_h,s_w,padding="

conv5=tf.nn.relu(conv5_in)

#maxpool5

pool5'

maxpool5=tf.nn.max_pool(conv5,ksize=[1,k_h,k_w,1],strides=[1,s_h,s_w,1],padding=padding)

#fc6

#fc(4096,name='

fc6'

fc6W=tf.Variable(net_data["

fc6"

fc6b=tf.Variable(net_data["

fc6=tf.nn.relu_layer(tf.reshape(maxpool5,[1,int(prod(maxpool5.get_shape()[1:

]))]),fc6W,fc6b)

#fc7

fc7'

fc7W=tf.Variable(net_data["

fc7"

fc7b=tf.Variable(net_data["

fc7=tf.nn.relu_layer(fc6,fc7W,fc7b)

#fc8

#fc(1000,relu=False,name='

fc8'

fc8W=tf.Variable(net_data["

fc8"

fc8b=tf.Variable(net_data["

fc8=tf.nn.xw_plus_b(fc7,fc8W,fc8b)

#prob

#softmax(name='

prob'

))

prob=tf.nn.softmax(fc8)

init=tf.initialize_all_variables()

sess=tf.Session()

sess.run(init)

output=sess.run(prob)

################################################################################

#Output:

inds=argsort(output)[0,:

foriinrange(5):

printclass_names[inds[-1-i]],output[0,inds[-1-i]]

这个是基于原生tensorflow的一版代码,好长而且看着比较麻烦一点,还load了caffe里面生成的网络模型,比较麻烦,这里找了一版稍微简单的<

【机器学习】AlexNet的tensorflow实现>

:

#输入数据

importinput_data

mnist=input_data.read_data_sets("

/tmp/data/"

one_hot=True)

importtensorflowastf

#定义网络超参数

learning_rate=0.001

training_iters=200000

batch_size=64

display_step=20

#定义网络参数

n_input=784#输入的维度

n_classes=10#标签的维度

dropout=0.8#Dropout的概率

#占位符输入

x=tf.placeholder(tf.types.float32,[None,n_input])

y=tf.placeholder(tf.types.float32,[None,n_classes])

keep_prob=tf.placeholder(tf.types.float32)

#卷积操作

defconv2d(name,l_input,w,b):

returntf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(l_input,w,strides=[1,1,1,1],padding='

SAME'

),b),name=name)

#较大下采样操作

defmax_pool(name,l_input,k):

returntf.nn.max_pool(l_input,ksize=[1,k,k,1],strides=[1,k,k,1],padding='

name=name)

#归一化操作

defnorm(name,l_input,lsize=4):

returntf.nn.lrn(l_input,lsize,bias=1.0,alpha=0.001/9.0,beta=0.75,name=name)

#定义整个网络

defalex_net(_X,_weights,_biases,_dropout):

#向量转为矩阵

_X=tf.reshape(_X,shape=[-1,28,28,1])

#卷积层

conv1=conv2d('

_X,_weights['

wc1'

],_biases['

bc1'

])

#下采样层

pool1=max_pool('

conv1,k=2)

#归一化层

norm1=norm('

pool1,lsize=4)

#Dropout

norm1=tf.nn.dropout(norm1,_dropout)

#卷积

conv2=conv2d('

norm1,_weights['

wc2'

bc2'

#下采样

pool2=max_pool('

conv2,k=2)

#归一化

norm2=norm('

pool2,lsize=4)

norm2=tf.nn.dropout(norm2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1