本文將介紹:
- 什么是深度可分離卷積網路
- 實作深度可分離卷積網路實戰代碼
一,什么是深度可分離卷積網路
1,常規的卷及操作

常規的卷及操作如上圖所示:引數量共計3 x 3 x 3 x 4 = 108.
2,深度可分離卷積
- depthwise convolution
- pointwise convolution
1)depthwise convolution
常規卷積,卷積核是作用于所有的depth方向的. depthwise conv對不同channel用不同的卷積核做卷積

引數量共計引數共計3 x 3 x 3 = 27.
2)pointwise convolution
depthwise卷積沒有考慮到同一位置不同channel上的資料之間的關聯.所以我們用一個1 x
1的卷積核對depthwise得到的[3,64,64]輸出再做卷積.這里做的就是常規卷積. 得到[1,64,64].
用4個這樣的1x1卷積核去做常規卷積. 得到輸出[4,64,64].

這一步引數量為3 x 1 x 1 x 4 = 12.
深度可分離卷積一共耗費引數量:27 + 12 = 39個.
所以可以看出同樣是得到[4,64,64]的feature map. 相比普通卷積的108個引數量,深度可分離卷積的方式大大減少了引數量.
3,總結
- 現在深度方向對不同channel用不同卷積核做卷積.
- 對第一步得到的輸出用1x1的卷積核去做常規卷積.達到使用不同channel的資料的目的. 用1x1的卷積核的數量控制深度.
二,實作深度可分離卷積網路實戰代碼
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras
my_seed = 666
np.random.seed(my_seed)
import random
random.seed(my_seed)
import tensorflow as tf
tf.random.set_seed(my_seed)
# 1,實作tensorflow動態按需分配GPU
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)
# 列印使用的python庫的版本資訊
print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
print(module.__name__, module.__version__)
# 2,從tf.keras.datasets中取資料
fashion_mnist = keras.datasets.fashion_mnist
(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()
x_valid, x_train = x_train_all[:5000], x_train_all[5000:]
y_valid, y_train = y_train_all[:5000], y_train_all[5000:]
print(x_valid.shape, y_valid.shape)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
# 3,將資料整合為標準化資料
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
# 整合資料為1通道資料
x_train_scaled = scaler.fit_transform(
x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)
x_valid_scaled = scaler.transform(
x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)
x_test_scaled = scaler.transform(
x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)
# 4,構建CNN模型
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(filters=32, kernel_size=3,
padding='same',
activation='selu',
input_shape=(28, 28, 1)))
model.add(keras.layers.SeparableConv2D(filters=32, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.SeparableConv2D(filters=64, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.SeparableConv2D(filters=64, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.SeparableConv2D(filters=128, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.SeparableConv2D(filters=128, kernel_size=3,
padding='same',
activation='selu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation='selu'))
model.add(keras.layers.Dense(10, activation="softmax"))
model.compile(loss="sparse_categorical_crossentropy",
optimizer = "sgd",
metrics = ["accuracy"])
# 5,查看模型層級和引數
model.summary()
# 6,定義callback 并 訓練模型
logdir = './separable-cnn-selu-callbacks'
if not os.path.exists(logdir):
os.mkdir(logdir)
output_model_file = os.path.join(logdir,
"fashion_mnist_model.h5")
callbacks = [
keras.callbacks.TensorBoard(logdir),
keras.callbacks.ModelCheckpoint(output_model_file,
save_best_only = True),
keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3),
]
history = model.fit(x_train_scaled, y_train, epochs=30,
validation_data=(x_valid_scaled, y_valid),
callbacks = callbacks)
# 7,列印訓練曲線
def plot_learning_curves(history):
pd.DataFrame(history.history).plot(figsize=(8, 5))
plt.grid(True)
plt.gca().set_ylim(0, 3)
plt.show()
plot_learning_curves(history)
# 8,列印估計器結果
print(model.evaluate(x_test_scaled, y_test, verbose = 0))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263821.html
標籤:python
上一篇:Opencv實作圖片的油畫特效
