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