动手学深度学习学习笔记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])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值