上接: tensorflow读取图片
概述
本文以航空图分类为案例,建立卷积神经网络模型,使用BN层
建立模型
在卷积核运算后,使用BN层,然后再执行激活函数,由于使用了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.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()
执行训练,观察结果
