Lenet详解以及keras+tensorflow实现

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

一、网络结构

Lenet详解以及keras+tensorflow实现_第1张图片

二、卷积过程

卷积是一种积分运算,用来求两个曲线重叠区域面积。可以看作加权求和,可以用来消除噪声、特征增强。下面是一个5x5x3的图片经过3x3的卷积核得到featuremap的过程

Lenet详解以及keras+tensorflow实现_第2张图片

把以上过程分解一下,原图经过一个卷积核卷积的过程

Lenet详解以及keras+tensorflow实现_第3张图片

三、平均池化和全连接

下面是平均池化层的操作,利用图像局部相关性的原理对图像进行子抽样,在保留图像有效信息的同时降低数据量

Lenet详解以及keras+tensorflow实现_第4张图片

下面是全连接层

Lenet详解以及keras+tensorflow实现_第5张图片

四、一些名词解释

权值共享:权值即卷积核的参数值,共享权值即共享卷积核,也即一张5x5的原图使用同一个3x3的卷积核遍历。

局部连接:即featuremap中的一个元素只与原图中一个3x3的区域连接。这使得参数大大减小,也增加了网络的可设计性

感受野:可以参见连接https://www.jianshu.com/p/9305d31962d8,,解释的很清楚。也就是当前featuremap在原图中的作用域。

分类函数softmax:https://www.zhihu.com/question/23765351/answer/139826397,,一是将全连接输出转换成类概率结果,二是便于求导计算

激活函数:赋予神经网络很强的非线性表达能力。见下图没激活函数和有激活函数的输出对比:

Lenet详解以及keras+tensorflow实现_第6张图片

五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)


 

你可能感兴趣的:(神经网络,算法)