CNN模型 | 1 LeNet

前言最近幾天閒得慌,然後突發奇想,決定整理最常用卷積神經網絡,廢話不多說,進入正題。

LeNet網絡

LeNet的設計思想

LeNet是在1998年由LeCun提出,3層神經網絡,具備卷積層、Pooling層、FC網絡、Sigmod層等,是現在各大變種卷積神經網絡的基礎,對標傳統神經網絡。
主要設計貢獻:

  • 局部感受野(local receptive fields),局部連接
  • 權值共享(參數共享)
  • 下采樣(sub-sampling),pooling層

LeNet網絡的核心結構

在這裏插入圖片描述

傳統網絡的全連接FC

  • 通過全連接將上下層的神經網絡神經元進行互連,上一層的所有神經元節點x會和下一層的每一個節點y進行互連,全連接實現線性變換y = w*x-all +b
  • 神經元之間連接比較稠密,參數過多,網絡過於臃腫
  • 全連接層對於特徵的偏差比較敏感,這樣會使得模型加深過擬合
  • 全連接層的壞處就在於其會破壞圖像的空間結構
  • 全連接相當於1*1的卷積核
  • 對平移、形變不具有不變性,對局部信息不敏感,完全忽略了圖像的局部結構,因爲考慮到了所有點。

keras實現LeNet網絡

import numpy as np
import keras
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation, Conv2D, MaxPooling2D, Flatten
from keras.optimizers import Adam

model = Sequential()
model.add(Conv2D(input_shape=(32, 32, 1), kernel_size=(5, 5), filters=20, activation='sigmod'))
model.add(MaxPooling2D(pool_size=(2,2), strides=2, padding='same'))

model.add(Conv2D(kernel_size=(5, 5), filters=50,  activation='sigmod', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2), strides=2, padding='same'))

model.add(Flatten())
model.add(Dense(500, activation='sigmod'))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

PyTorch實現LeNet網絡

import torch.nn as nn

# torch.nn.Conv2d(in_channels, out_channels, kernel_size,
# stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
model = nn.Sequential(
    nn.Conv2d(in_channels= 1,out_channels = 6,kernel_size=5,stride=1,padding=2),
    nn.Sigmoid(),
    nn.MaxPool2d(kernel_size=2,stride=2,padding='same'),

    nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5,padding='same'),
    nn.Sigmoid(),
    nn.MaxPool2d(kernel_size=2,stride=2,padding='same'),

    nn.Linear(16*5*5,120),
    nn.Sigmoid(),
    nn.Linear(120,84),
    nn.Sigmoid(),
    nn.Linear(84,10)
                )
print(model)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章