0、BP前反馈神经网络原理详解
1、Lenet详解
2、Alexnet详解
3、VGG网络结构
4、NIN网络结构
5、Googlenet inception v1 结构详解、inception v2 和 inception v3
LENET网络是一种用于手写体字符识别的非常高效的卷积神经网络。虽然简单,但便于理解,而且涉及到卷积,池化,全连接,激活函数,softmax分类等等这些卷积网络的基本知识。
规定几个参数:
WxHxD:图片或者feature map的长宽高
FsxFd:卷积核长宽深度,Fs卷积核尺寸,Fd:卷积核深度,一般Fd=D,故大部分文章不提这个参数,也有特殊(LENET 第三层卷积层)。为了方便理解参数量的计算,把这个参数也考虑进去
S:卷积步长,P:扩充步长
卷积后网络尺寸= (W − F + 2P )/S+1
卷积是一种积分运算,用来求两个曲线重叠区域面积。可以看作加权求和,可以用来消除噪声、特征增强。下面是一个5x5x3的图片经过3x3的卷积核得到featuremap的过程
把以上过程分解一下,原图经过一个卷积核卷积的过程
下面是平均池化层的操作,利用图像局部相关性的原理,对图像进行子抽样,在保留图像有效信息的同时降低数据量
下面是全连接层
权值共享:权值即卷积核的参数值,共享权值即共享卷积核,也即一张5x5的原图使用同一个3x3的卷积核遍历。
局部连接:即featuremap中的一个元素只与原图中一个3x3的区域连接。这使得参数大大减小,也增加了网络的可设计性。
感受野:可以参见连接https://www.jianshu.com/p/9305d31962d8,,解释的很清楚。也就是当前featuremap在原图中的作用域。
分类函数softmax:https://www.zhihu.com/question/23765351/answer/139826397,,一是将全连接输出转换成类概率结果,二是便于求导计算
激活函数:赋予神经网络很强的非线性表达能力。见下图没激活函数和有激活函数的输出对比:
五keras实现lenet
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 3 19:49:36 2019
@author: fanzy
"""
from utils import loaddata
from utils import loss_history
from utils import plot_loss
import os
import cv2
import numpy as np
from keras.models import Sequential
from keras.layers import Dense,Conv2D,MaxPooling2D,Flatten
from keras.optimizers import SGD
from keras.utils import np_utils
from keras.utils.vis_utils import plot_model
path='..../data/catdog/train/'
size=28
x_train,x_test,y_train,y_test=loaddata.catdogimg(path,size,0.3)
model=Sequential()
model.add(Conv2D(filters=6,kernel_size=(5,5),padding='valid',
input_shape=(size,size,3),activation='tanh'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(filters=16,kernel_size=(5,5),padding='valid',activation='tanh'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(120,activation='tanh'))
model.add(Dense(84,activation='tanh'))
model.add(Dense(2,activation='softmax'))
sgd=SGD(lr=0.05,decay=1e-6,momentum=0.9,nesterov=True)
model.compile(optimizer=sgd,loss='categorical_crossentropy',metrics=['accuracy'])
history=loss_history.LossHistory()
model.fit(x_train,y_train,batch_size=200,epochs=20,
validation_data=(x_test, y_test),
verbose=1,shuffle=True,callbacks=[history])
#plot_model(model,to_file='lenet.png',show_shapes=True,show_layer_names=False)
score=model.evaluate(x_test,y_test)
plot_loss.plot(history.losses,history.accuracy,
history.val_losses,history.val_accuracy)