動手學深度學習學習筆記tf2.0版(5.8 網絡中的網絡(NiN))

NiN學習筆記

github代碼地址:https://github.com/taichuai/d2l_zh_tensorflow2.0

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

import tensorflow as tf
print(tf.__version__)

for gpu in tf.config.experimental.list_physical_devices('GPU'):
    tf.config.experimental.set_memory_growth(gpu, True)

def nin_block(num_channels, kernel_size, strides, padding):
    blk = tf.keras.models.Sequential()
    blk.add(tf.keras.layers.Conv2D(num_channels, kernel_size,
                                   strides=strides, padding=padding, activation='relu')) 
    blk.add(tf.keras.layers.Conv2D(num_channels, kernel_size=1,activation='relu')) 
    blk.add(tf.keras.layers.Conv2D(num_channels, kernel_size=1,activation='relu'))    
    return blk

在這裏插入圖片描述

net = tf.keras.models.Sequential()
net.add(nin_block(96, kernel_size=11, strides=4, padding='valid'))
net.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2))
net.add(nin_block(256, kernel_size=5, strides=1, padding='same'))
net.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2))
net.add(nin_block(384, kernel_size=3, strides=1, padding='same'))
net.add(tf.keras.layers.MaxPool2D(pool_size=3, strides=2))
net.add(tf.keras.layers.Dropout(0.5))
net.add(nin_block(10, kernel_size=3, strides=1, padding='same'))
net.add(tf.keras.layers.GlobalAveragePooling2D())
net.add(tf.keras.layers.Flatten())

X = tf.random.uniform((1,224,224,1))
for blk in net.layers:
    X = blk(X)
    print(blk.name, 'output shape:\t', X.shape)

可以得到
在這裏插入圖片描述
獲取數據和訓練模型
我們依然使用Fashion-MNIST數據集來訓練模型。NiN的訓練與AlexNet和VGG的類似,注意如果使用 Adam 優化器,學習率先使用較小進行訓練,看看效果,較大了可能無法收斂(這裏取 lr=1e-6)

# 獲取數據
from tensorflow.keras.datasets import fashion_mnist
import matplotlib.pyplot as plt


(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()


# 數據預處理
def data_scale(x, y):
    x = tf.cast(x, tf.float32)
    x = x / 255.0
    x = tf.reshape(x, (x.shape[0], x.shape[1], 1))
    x = tf.image.resize_with_pad(image=x, target_height=224,target_width=224)
    
    return x, y
# 由於筆記本訓練太慢了,使用1000條數據,跑一下先,算力夠的可以直接使用全部數據更加明顯
train_db = tf.data.Dataset.from_tensor_slices((x_train[0:5000],y_train[0:5000])).shuffle(20).map(data_scale).batch(32)
test_db = tf.data.Dataset.from_tensor_slices((x_test[0:1000],y_test[0:1000])).shuffle(20).map(data_scale).batch(32)
# 定義優化器和損失函數
optimizer = tf.keras.optimizers.Adam(lr=1e-5)
loss = tf.keras.losses.sparse_categorical_crossentropy
net.compile(optimizer=optimizer, loss=loss, metrics=['accuracy'])
net.fit_generator(train_db, epochs=5, validation_data=test_db)    # 這裏就不跑太多輪了,有機器可以自己調參跑個好的結果
net.summary()
# 可以像alexnet一樣,打印中間特徵層看一下
X = next(iter(train_db))[0][0]

def show(X):
    X_ = tf.squeeze(X)
    plt.imshow(X_)
    plt.figure(figsize=(5,5))
    plt.show()


X = tf.expand_dims(X, axis=0)
# 打印前 8 層的部分特徵圖
for blk in net.layers[0:8]:
    print(blk.name,'itput shape:\t',X.shape)
    show(X[0,:,:,0])
    X = blk(X)
    print(blk.name, 'output shape:\t', X.shape)
    for i in range(3):
        show(X[0,:,:,i])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章