案例:航空图分类训练(使用BN层)

上接: tensorflow读取图片

概述

本文以航空图分类为案例,建立卷积神经网络模型,使用BN层

建立模型

在卷积核运算后,使用BN层,然后再执行激活函数,由于使用了BN层,拟合能力大大加强,模型大大简化了,运算速度也加快了

不用BN层的模型见:https://www.malaoshi.top/show_1EF4YgCtda54.html

model=tf.keras.Sequential()

model.add(tf.keras.layers.Conv2D(64,(3,3),input_shape=(256,256,3)))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Activation("relu"))

model.add(tf.keras.layers.GlobalAveragePooling2D())


model.add(tf.keras.layers.Dense(1,activation="sigmoid"))

model.summary()

训练

model.compile(optimizer="adam",loss="binary_crossentropy",metrics=["acc"])

steps_per_epoch=train_count//BATCH_SIZE
validation_steps=test_count//BATCH_SIZE

history=model.fit(train_data2,epochs=20,steps_per_epoch=steps_per_epoch,validation_data=test_data2,validation_steps=validation_steps)

执行结果如下:

查看

plt.plot(history.epoch,history.history.get("acc"),label="acc")
plt.plot(history.epoch,history.history.get("val_acc"),label="val_acc")
plt.plot(history.epoch,history.history.get("loss"),label="loss")
plt.plot(history.epoch,history.history.get("val_loss"),label="val_loss")

注意:防止过拟合

由于使用 BN层,所以模型拟合能力大大加强,所以 不要加 更多的卷积层,否则会发生 过拟合,训练的准确率很高,但验证的准确率一般

如下模型,两个卷积层:

# 建立模型
model=tf.keras.Sequential()

model.add(tf.keras.layers.Conv2D(64,(3,3),input_shape=(256,256,3)))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Activation("relu"))

model.add(tf.keras.layers.Conv2D(64,(3,3)))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.Activation("relu"))

model.add(tf.keras.layers.GlobalAveragePooling2D())


model.add(tf.keras.layers.Dense(1,activation="sigmoid"))

model.summary()

测试:在激活函数后面添加BN层

# 建立模型
model=tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(64,(3,3),input_shape=(256,256,3),activation="relu"))
model.add(tf.keras.layers.BatchNormalization())

model.add(tf.keras.layers.GlobalAveragePooling2D())

model.add(tf.keras.layers.Dense(1,activation="sigmoid"))

model.summary()

执行训练,观察结果


原文出处:/show_1EF4YgUEQ1HK.html