LeNet-5 出自論文 Gradient-Based Learning Applied to Document Recognition,LeCun大佬非常早期的作品,用于手寫字母識(shí)別,在Mnist數(shù)據(jù)集上能夠達(dá)到 98% 以上的準(zhǔn)確率。
LeNet-5

LeNet-5 Structure
Implement in Keras
基于 Keras 實(shí)現(xiàn) LeNet-5,損失函數(shù)使用交叉熵,優(yōu)化器選擇Adam。
def lenet_v5(in_shape):
in_x = Input(in_shape)
conv1 = Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation='tanh')(in_x)
map1 = MaxPooling2D((2, 2))(conv1)
conv2 = Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation='tanh')(map1)
map2 = MaxPooling2D((2, 2))(conv2)
mac = Flatten()(map2)
fc1 = Dense(120)(mac)
fc2 = Dense(84)(fc1)
prob = Dense(10, activation='softmax')(fc2)
lenet = Model(inputs=[in_x], outputs=prob)
lenet.compile(loss='categorical_crossentropy', optimizer=Adam(), metrics=['accuracy'])
# lenet.summary()
return lenet
模型評(píng)估
數(shù)據(jù)讀取的部分,定義在之前的博客 data_loader
from data_loader import get_test, get_train
from model_defination import lenet_v5
from mnist_utils import train_scheduler
def model_evaluate(model, data_list):
train_img, train_lbl, test_img, test_lbl = data_list
model.fit(train_img, train_lbl, epochs=16, verbose=1)
loss, acc = model.evaluate(test_img, test_lbl)
print('test loss-%.2f, test accuracy-%.2f%%' % (loss, 100*acc))
if __name__ == "__main__":
train_img, train_lbl = get_train()
test_img, test_lbl = get_test()
datas = (train_img, train_lbl, test_img, test_lbl)
train_num, *img_shape = train_img.shape
model = lenet_v5(img_shape)
model_evaluate(model, datas)
運(yùn)行結(jié)果:
test loss-0.07, test accuracy-98.07
特征可視化
對(duì)于訓(xùn)練集的每一個(gè)樣本,提取最后一層的特征,并且進(jìn)行以下處理
- 將每個(gè)樣本的特征向量標(biāo)準(zhǔn)化成單位向量,將他們映射到以原點(diǎn)為中心的單位圓上
- 使用 PCA方法將其降低到3維,便于畫圖
- 根據(jù)類別描點(diǎn),不同類別賦予不同顏色

feat cluster--2d
可以看出,對(duì)于特征的分布均勻,相同類別的特征比較好的聚集在一起。