DepthwiseConv2D深度方向的空间卷积
pointwise convolution,
SeparableConv2D深度可分离卷积

SeparableConv2D实现整个深度分离卷积过程,即深度方向的空间卷积 (分别作用于每个输入通道)+ 输出通道混合在一起的逐点卷积,

DepthwiseConv2D仅仅实现前半部分的空间卷积 (分别作用于每个输入通道)。

DepthwiseConv2D:不同channel用不同的卷积核做卷积

深度可分离 2D 卷积。

深度可分离卷积包括仅执行深度空间卷积中的第一步(其分别作用于每个输入通道)。 depth_multiplier 参数控制深度步骤中每个输入通道生成多少个输出通道。

keras.layers.DepthwiseConv2D(kernel_size, strides=(1, 1), padding='valid', depth_multiplier=1, data_format=None, activation=None, use_bias=True, depthwise_initializer='glorot_uniform', bias_initializer='zeros', depthwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, bias_constraint=None)
卷积核是作用于所有的depth方向的. depthwise conv对不同channel用不同的卷积核做卷积

pointwise convolution

depthwise卷积没有考虑到同一位置不同channel上的数据之间的关联.所以我们用一个1 x
1的卷积核对depthwise得到的[3,64,64]输出再做卷积.这里做的就是常规卷积. 得到[1,64,64].
用4个这样的1x1卷积核去做常规卷积. 得到输出[4,64,64].

SeparableConv2D

keras.layers.SeparableConv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), depth_multiplier=1, activation=None, use_bias=True, depthwise_initializer='glorot_uniform', pointwise_initializer='glorot_uniform', bias_initializer='zeros', depthwise_regularizer=None, pointwise_regularizer=None, bias_regularizer=None, activity_regularizer=None, depthwise_constraint=None, pointwise_constraint=None, bias_constraint=None)

实现深度可分离卷积网络实战代码

#!/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 kerasmy_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 StandardScalerscaler = 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))

深度学习中的depthwise convolution,pointwise convolution,SeparableConv2D深度可分离卷积相关推荐

  1. 深度学习中GPU和显存分析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 转自:机器学习AI算法工程 深度学习最吃机器,耗资源,在本文,我将 ...

  2. 科普帖:深度学习中GPU和显存分析

    深度学习最吃机器,耗资源,在本文,我将来科普一下在深度学习中: 何为"资源" 不同操作都耗费什么资源 如何充分的利用有限的资源 如何合理选择显卡 并纠正几个误区: 显存和GPU等价 ...

  3. 深度学习中GPU和显存

    GPU状态的监控 nvidia-smi: 是Nvidia显卡命令行管理套件,基于NVML库,旨在管理和监控Nvidia GPU设备.nvidia-smi命令的输出中最重要的两个指标:显存占用和GPU利 ...

  4. GPU显存 - 深度学习中 GPU 和显存分析

    深度学习中 GPU 和显存分析 原文作者陈云. 本文原载于知乎专栏--人工智障的深度瞎学之路 深度学习最吃机器,耗资源,在本文,我将来科普一下在深度学习中: 何为"资源" 不同操作 ...

  5. 干货|一文全解深度学习中的卷积

    来源:1024深度学习 概要:卷积现在可能是深度学习中最重要的概念.正是靠着卷积和卷积神经网络,深度学习才超越了几乎其他所有的机器学习手段. 译自Tim Dettmers的Understanding ...

  6. cnn 反向传播推导_深度学习中的参数梯度推导(三)下篇

    前言 在深度学习中的参数梯度推导(三)中篇里,我们总结了CNN的BP推导第一步:BP通过池化层时梯度的计算公式.本篇(下篇)则继续推导CNN相关的其他梯度计算公式. 注意:本文默认读者已具备深度学习上 ...

  7. 卷积为什么如此强大?一文全解深度学习中的卷积

    卷积为什么如此强大?一文全解深度学习中的卷积 2018年05月10日 15:52:41 七月在线实验室 阅读数:17112 作者:Tim Dettmers(Understanding Convolut ...

  8. 卷积为什么如此强大?理解深度学习中的卷积

    译自Tim Dettmers的Understanding Convolution in Deep Learning有太多的公开课.教程在反复传颂卷积神经网络的好,却都没有讲什么是"卷积&qu ...

  9. 深度 | 理解深度学习中的卷积

    译者按:本文译自 Tim Dettmers 的 Understanding Convolution in Deep Learning.有太多的公开课.教程在反复传颂卷积神经网络的好,却都没有讲什么是「 ...

最新文章

  1. 在QTP中申明XPath
  2. python--lambda和def函数
  3. 加工中心宏程序生成器_零件行外球面加工,老师傅告诉你,普通程序与宏加工哪个更方便...
  4. 2020上海学区房楼市,到底发生了什么?
  5. AJAX异步原理与实现
  6. apache建立虚拟主机[转载]
  7. 信息学奥赛一本通 1345:【例4-6】香甜的黄油 | 洛谷 P1828 [USACO3.2]香甜的黄油 Sweet Butter
  8. Java学习笔记:文件通道(FileChannel)
  9. java编程线板切割问题_坑爹的日志无法按天切割问题!
  10. 第四天:制作网页的基本操作
  11. salt一键部署jdk
  12. URlRewriter组件下载及使用说明
  13. 数据分析为周杰伦打榜的夕阳红老年团,告诉你他们真实年龄!
  14. gateway中的局部过滤器_SpringCloud系列Gateway:过滤器总结
  15. matlab画图时如何将坐标设置为中文宋体,英文新罗马字体
  16. 2022城市辅助驾驶赛道陷入“三国争霸”,数据智能助力毫末智行杀出重围?
  17. html p标签 删除线,strike html 删除线 贯穿线标签
  18. 2021年最后一天,学点Selenium玩点新鲜~新的一年,让分布式测试有更多玩法
  19. Java中 方法引用、Stream流、及方法实例 D190401
  20. 通da信股本变迁gbbq权息文件解密

热门文章

  1. 时间戳是什么?JS中时间戳的展示
  2. CHAR与TCHAR处理函数
  3. python:模块(module)
  4. 一文带你了解什么是IP地址
  5. Mxnet入门--第1篇
  6. 一夜之间ChatGPT火遍全球,程序员的饭碗保不住了吗
  7. 使用 HTML CSS 和 JavaScript 创建星级评分系统
  8. 基于SSM+mysql+mybatis+js+html+css实现电子产品在线商城系统,商品管理后台
  9. 文献科普|DNA甲基化通过CTCF和黏着蛋白复合物调节选择性聚腺苷酸化
  10. Docker - Docker详解及使用