LeNet-5以及tensorflow2.1實現


LeNet-5

LeNet-5網絡結構


其中池化層均采用最大池化,每一層卷積層后使用的激活函數是sigmoid函數。
這里補充一下padding的兩種方式,一個是SAME(全0填充),另一個是VALID(不填充)。在LeNet-5中,卷積層一致采用padding='SAME'的方式進行填充,在池化層中采用padding='VALID'的方式填充。
填充的方式不同,那么輸出的圖片的邊長也是不同的。

padding方式 輸出圖片邊長
SAME \(\frac{輸入長}{步長}\)(向上取整)
VALID \(\frac{輸入長-核長+1}{步長}\)(向上取整)

tensorflow實現LeNet-5

接下來,我們用tensorflow(2.1版本)來搭建LeNet-5,實現fashion_mnist的圖片分類。

import tensorflow as tf
from tensorflow import keras

# 搭建LeNet網絡
net = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(filters=6,kernel_size=5,activation='sigmoid',input_shape=(28,28,1)),
    tf.keras.layers.MaxPool2D(pool_size=2,strides=2),
    tf.keras.layers.Conv2D(filters=16,kernel_size=5,activation='sigmoid'),
    tf.keras.layers.MaxPool2D(pool_size=2,strides=2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(120,activation='sigmoid'),
    tf.keras.layers.Dense(84,activation='sigmoid'),
    tf.keras.layers.Dense(10,activation='sigmoid')
])

獲取fashion_mnist的數據集

fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images,train_labels),(test_images,test_labels) = fashion_mnist.load_data()

train_images = tf.reshape(train_images,(train_images.shape[0],train_images.shape[1],train_images.shape[2],1))
print(train_images.shape)
test_images = tf.reshape(test_images,(test_images.shape[0],test_images.shape[1],test_images.shape[2],1))
# 輸出(60000,28,28,1)

損失函數和訓練算法采用交叉熵損失函數(cross entropy)和小批量隨機梯度下降(SGD)

optimizer = tf.keras.optimizers.SGD(learning_rate=0.9,momentum=0.0,nesterov=False)
net.compile(optimizer=optimizer,
           loss='sparse_categorical_crossentropy',
           metrics=['accuracy'])

net.fit(train_images,train_labels,epochs=5,validation_split=0.1)

輸出:

net.evaluate(test_images,test_labels,verbose=2)

輸出:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM