From Inception to Xception

部署运行你感兴趣的模型镜像

首先介绍1x1卷积核的作用,其次分别引出Inception及Xception的思想

1x1卷积核的作用

1.实现跨通道信息的整合或拆分

首先看一下2x2的卷积核

输入:4x4x3 卷积核:2x2x3x1 输出:3x3x1
2X2的卷积核将图中的12个输入节点组合映射到1个输出节点上。
3_in_1_out

接着看1x1的卷积核

输入:4x4x3 卷积核:1x1x3x2 输出:4x4x2
1x1的卷积核将下面左图中的3个输入节点组合映射到2个输出节点上。
这里写图片描述

输入:4x4x3 卷积核:1x1x3x4 输出:4x4x4
1x1的卷积核将上面右图中的3个输入节点组合映射到4个输出节点上。

因此,1*1的卷积就是对每个像素点,将多个channels的feature maps线性组合(实现跨通道信息的整合或拆分),当输出channels小于输入channels,即实现了降维(信息整合)。反之则是升维(信息拆分)。

2.大大减少参数数量

Inception
上图为Inception模型中,采用1x1卷积核前后的网络结构。
假设输入的feature map是28×28×192,1×1卷积通道为64,3×3卷积通道为128,5×5卷积通道为32。
对左图,卷积核参数个数为:
1×1×192×64+3×3×192×128+5×5×192×32
而右图对3×3和5×5卷积层前分别加入了通道数为96和16的1×1卷积层,这样卷积核参数个数就变成了:
1×1×192×64+(1×1×192×96+3×3×96×128)+(1×1×192×16+5×5×16×32)
参数大约减少到原来的三分之一。
同时在并行pooling层后面加入1×1卷积层后也可以降低输出的feature map数量,左图pooling后feature map是不变的(192),再加卷积层得到的feature map(64+128+32),会使输出的feature map扩大到192+64+128+32=416,如果每个模块都这样,网络的输出会越来越大。而右图在pooling后面加了通道为32的1×1卷积,使得输出的feature map数降到了64+128+32+32=256。

再来看一个ResNet中利用1x1卷积核减少参数数量的例子

这里写图片描述

在训练浅层网络时,我们选用前面这种结构,而如果网络较深(大于50层)时,会考虑使用后面这种(bottleneck),原因主要在减少网络参数。

对于ImageNet而言,进入到第一个residual block的input为 (56,56,64)
采用左侧的两个 3x3的卷积层:
参数量为 :3x3x64x64 + 3x3x64x64 = 73728

采用右侧的bottleneck:
参数量为: 1x1x64x64 + 3x3x64x64 +1x1x256x64 = 57344

Inception

对每个像素点,提取多个 channels的信息并将其压缩到更低的维度。不考虑像素与像素之间的信息整合。

Xception

Xception认为:跨通道的相关性和空间相关性是完全可分离的,最好不要联合映射它们。
它首先对多个feature maps在各自的通道上进行空间上的信息整合,然后采用1x1的卷积核对每个像素点进行跨通道的信息整合。

Xception

借此分离了跨通道的相关性和空间相关性。

在 ImageNet 数据集上,Xception 的表现稍稍优于 Inception v3,而且在一个有 17000 类的更大规模的图像分类数据集上的表现更是好得多。最重要的是,它的模型参数的数量和 Inception 一样多,说明它的计算效率也更高。

参考网址:
https://zhuanlan.zhihu.com/p/27642620
http://www.caffecn.cn/?/question/136

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

### 代码功能分析 #### 1. 设置TensorFlow日志级别 以下三段代码均与设置TensorFlow日志级别相关: ```python import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '1' import tensorflow as tf ``` 此代码将TensorFlow的日志输出等级设置为INFO级别。`os.environ['TF_CPP_MIN_LOG_LEVEL']` 是一个环境变量,`'1'` 代表显示INFO、WARNING和ERROR级别的日志信息,在导入 `tensorflow` 之前设置该环境变量,可控制后续TensorFlow运行时的日志输出[^1]。 ```python import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf ``` 这段代码将日志输出等级设置为WARNING级别,即屏蔽通知信息,只显示WARNING和ERROR级别的日志信息,同样要在导入 `tensorflow` 之前设置该环境变量,以去除错误之外的部分日志信息[^2]。 ```python import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' import tensorflow as tf logger = tf.get_logger() logger.setLevel('ERROR') ``` 此代码将日志输出等级设置为ERROR级别,`os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'` 屏蔽所有通知、警告信息,仅显示ERROR级别的日志,同时使用 `tf.get_logger()` 获取日志记录器并将其级别设置为 `'ERROR'`,进一步确保日志输出符合要求,让输出面板更加干净清晰[^3]。 #### 2. 简单的TensorFlow计算示例 ```python # 定义TensorFlow计算图 a = tf.constant(10) b = tf.constant(20) c = tf.add(a, b) # 创建TensorFlow会话,打印计算结果 with tf.Session() as sess: print("计算结果为:", sess.run(c)) ``` 此代码定义了一个简单的TensorFlow计算图,创建了两个常量张量 `a` 和 `b`,并使用 `tf.add` 函数将它们相加得到 `c`。然后通过 `tf.Session()` 创建会话,使用 `sess.run(c)` 运行计算图并打印计算结果[^1]。 #### 3. 通过PB文件重新载入模型 ```python import tensorflow as tf import os pb_file_path = os.getcwd() # 获取当前工作目录 sess = tf.Session() # 导入图的具体操作 with tf.gfile.FastGFile(pb_file_path + '\model.pb', 'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) tf.import_graph_def(graph_def, name='') # 初始化所有的变量 sess.run(tf.global_variables_initializer()) # 获取输入的tensor也可以认为获取输入的op input_x = sess.graph.get_tensor_by_name('x:0') input_y = sess.graph.get_tensor_by_name('y:0') # 导入变量 op = sess.graph.get_tensor_by_name('op_to_store:0') print(sess.run(op, feed_dict={input_x: 5, input_y: 6})) ``` 这段代码的功能是从一个PB文件中重新载入TensorFlow模型。首先获取当前工作目录,然后使用 `tf.gfile.FastGFile` 以二进制只读模式打开PB文件,将文件内容解析为 `GraphDef` 对象,再使用 `tf.import_graph_def` 将图导入到当前会话中。接着初始化所有变量,通过 `sess.graph.get_tensor_by_name` 获取输入张量和操作张量,最后使用 `sess.run` 运行指定操作并传入输入数据,打印计算结果[^4]。 ### 优化建议 #### 1. 日志级别设置 - **统一设置**:如果在一个项目中多处需要设置日志级别,可将设置日志级别的代码封装成一个函数,提高代码的复用性。 ```python import os def set_tf_log_level(level): os.environ['TF_CPP_MIN_LOG_LEVEL'] = str(level) import tensorflow as tf if level == 3: logger = tf.get_logger() logger.setLevel('ERROR') return tf # 使用示例 tf = set_tf_log_level(2) ``` #### 2. 简单计算示例 - **使用 `tf.compat.v1` 兼容新老版本**:在TensorFlow 2.x中,`tf.Session()` 已被弃用,可使用 `tf.compat.v1.Session()` 来兼容旧代码。 ```python import tensorflow.compat.v1 as tf tf.disable_v2_behavior() a = tf.constant(10) b = tf.constant(20) c = tf.add(a, b) with tf.Session() as sess: print("计算结果为:", sess.run(c)) ``` #### 3. 通过PB文件重新载入模型 - **错误处理**:在打开PB文件和解析图时,添加错误处理机制,增强代码的健壮性。 ```python import tensorflow.compat.v1 as tf import os pb_file_path = os.getcwd() try: sess = tf.Session() with tf.gfile.FastGFile(pb_file_path + '\model.pb', 'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) tf.import_graph_def(graph_def, name='') sess.run(tf.global_variables_initializer()) input_x = sess.graph.get_tensor_by_name('x:0') input_y = sess.graph.get_tensor_by_name('y:0') op = sess.graph.get_tensor_by_name('op_to_store:0') print(sess.run(op, feed_dict={input_x: 5, input_y: 6})) except Exception as e: print(f"加载模型时出现错误: {e}") finally: sess.close() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值