Tensorflow配置文件为Conv2D输出2 FLOPS而不是1

中国

我想知道是否有人知道为什么Conv2d操作的FLOP数是2而不是1。在下面的示例中,输入是1x1具有1通道图像,批处理大小是1。卷积中的特征数是也1无偏见。理想情况下,乘法次数应该为1。但是TF profiler的输出显示FLOP为2。FLOP是否包含除乘法之外的内容?谢谢。

这是示例:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'  # assuming you have a gpu0
import tensorflow as tf
from keras import backend as K

​
def load_pb(pb):
    with tf.gfile.GFile(pb, "rb") as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
    with tf.Graph().as_default() as graph:
        tf.import_graph_def(graph_def, name='')
        return graph
​
​
def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True):
    from tensorflow.python.framework.graph_util import convert_variables_to_constants
    graph = session.graph
    with graph.as_default():
        freeze_var_names = list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or []))
        output_names = output_names or []
        output_names += [v.op.name for v in tf.global_variables()]
        input_graph_def = graph.as_graph_def()
        if clear_devices:
            for node in input_graph_def.node:
                node.device = ""
        frozen_graph = convert_variables_to_constants(session, input_graph_def,output_names, freeze_var_names)
        return frozen_graph
​
​
# define the model
inp = tf.keras.layers.Input(batch_shape=(1, 1, 1, 1), name='input')
x = tf.keras.layers.Conv2D(1, kernel_size=(1, 1), strides=(1, 1), padding='same', name='conv', use_bias=False)(inp)
out = tf.keras.layers.Flatten(name='output')(x)
model = tf.keras.models.Model(inputs=inp, outputs=out)
model.summary()

# freeze the model
output_graph_def = freeze_session(K.get_session(), output_names=[out.op.name for out in model.outputs])
with tf.gfile.GFile('graph.pb', "wb") as f:
    f.write(output_graph_def.SerializeToString())
​
# load the protobuf and perform tf profiling
g2 = load_pb('./graph.pb')
with g2.as_default():
    opts = tf.profiler.ProfileOptionBuilder.float_operation()
    flops = tf.profiler.profile(g2, run_meta=tf.RunMetadata(), cmd='scope', options=opts)
    print('FLOP', flops.total_float_ops)

输出为:

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
input (InputLayer)           (1, 1, 1, 1)              0                                                                                                                                                
_________________________________________________________________                                                                                                                                          
conv (Conv2D)                (1, 1, 1, 1)              1                                                                                                                                                 
_________________________________________________________________          
output (Flatten)             (1, 1)                    0
=================================================================
Total params: 1
Trainable params: 1
Non-trainable params: 0
_________________________________________________________________
Converted 1 variables to const ops.
Parsing Inputs...
=========================Options=============================
-max_depth                  10000
-min_bytes                  0
-min_peak_bytes             0
-min_residual_bytes         0
-min_output_bytes           0
-min_micros                 0
-min_accelerator_micros     0
-min_cpu_micros             0
-min_params                 0
-min_float_ops              1
-min_occurrence             0
-step                       -1
-order_by                   float_ops
-account_type_regexes       .*
-start_name_regexes         .*
-trim_name_regexes          
-show_name_regexes          .*
-hide_name_regexes          
-account_displayed_op_only  true
-select                     float_ops
-output                     stdout:
==================Model Analysis Report======================
Doc:
scope: The nodes in the model graph are organized by their names, which is hierarchical like filesystem.
flops: Number of float operations. Note: Please read the implementation for the math behind it.
Profile:
node name | # float_ops
_TFProfRoot (--/2 flops)
  conv/Conv2D (2/2 flops)
======================End of Report==========================
FLOP 2
内塔内尔山姆

考虑与您几乎相同的设置,但是卷积有n个通道。然后您将有n个乘法,然后您将对所有乘法的结果进行累加。现在可以说,您可以通过第一个乘法的结果来初始化总和,然后对其余的(n-1)个乘法求和。但这对于第一个乘法将是一种特殊的处理方式,相反,将和初始化为0,然后将其与所有n个乘法累加起来更为有意义。特别是当n = 1时,您会遇到一个荒谬的情况,

sum = 0
mult = w1 * a1
sum = sum + mult

这将导致2个FLOP或1个MAC(乘法累加)操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在keras中将Conv1D的输出与Conv2D的输出合并

来自分类Dev

输入形状为 [?,1,1,5], [1,6,5,5] 的 'conv1d_2/convolution/Conv2D'(操作:'Conv2D')从 1 中减去 6 导致的负尺寸大小

来自分类Dev

tensorflow中conv2d的顺序输出是什么?

来自分类Dev

输入形状为[?,1,10000,80],[3,3,80,16]的'conv2d_1 / convolution'(op:'Conv2D')从1中减去3引起的负尺寸大小

来自分类Dev

什么时候以及为什么使用Conv2D时kernel_size可能是1或2暗?

来自分类Dev

对于Codeforce,输出返回2而不是1

来自分类Dev

在TensorFlow中编写类似Conv2D的操作

来自分类Dev

Tensorflow Keras Conv2D多个过滤器

来自分类Dev

tensorflow conv2d参数数量

来自分类Dev

在 Tensorflow 中查找 conv2d 层的权重

来自分类Dev

脚本的计数是2而不是1

来自分类Dev

如何要求Terraform CLI使用AWS Shared Credentials而不是其主机的AWS EC2实例配置文件

来自分类Dev

为什么cout << setprecision(2)<< 0.999的输出是1而不是1.0?

来自分类Dev

Keras:过度拟合的Conv2D

来自分类Dev

针对列表运行conv2d

来自分类Dev

pytorch conv2d配重

来自分类Dev

在Keras中是否可以看到Conv2D层之后的输出

来自分类Dev

PyTorch Conv2D返回零输入张量的非零输出?

来自分类Dev

Keras:为什么Conv2D图层的输出大小与要素图的预期形状不匹配?

来自分类Dev

conv2d 函数后输出大小错误

来自分类Dev

设置TensorFlow Conv2d操作的权重和偏置张量

来自分类Dev

具有padding ='SAME'的Tensorflow / Keras Conv2D层的行为异常

来自分类Dev

Conv2d Tensorflow结果错误-精度= 0.0000e + 00

来自分类Dev

在 tensorflow Keras 中将图像拟合到 Conv2D 层时出错

来自分类Dev

为什么Promise的输出不是“ 1 2 3”而是“ 1 3 2”?

来自分类Dev

为什么Promise的输出不是“ 1 2 3”而是“ 1 3 2”?

来自分类Dev

JSON计数仅返回1而不是2

来自分类Dev

等待 2 个方法而不是 1 个

来自分类Dev

为什么我需要将输入数据重塑为Conv2D的附加尺寸?

Related 相关文章

  1. 1

    如何在keras中将Conv1D的输出与Conv2D的输出合并

  2. 2

    输入形状为 [?,1,1,5], [1,6,5,5] 的 'conv1d_2/convolution/Conv2D'(操作:'Conv2D')从 1 中减去 6 导致的负尺寸大小

  3. 3

    tensorflow中conv2d的顺序输出是什么?

  4. 4

    输入形状为[?,1,10000,80],[3,3,80,16]的'conv2d_1 / convolution'(op:'Conv2D')从1中减去3引起的负尺寸大小

  5. 5

    什么时候以及为什么使用Conv2D时kernel_size可能是1或2暗?

  6. 6

    对于Codeforce,输出返回2而不是1

  7. 7

    在TensorFlow中编写类似Conv2D的操作

  8. 8

    Tensorflow Keras Conv2D多个过滤器

  9. 9

    tensorflow conv2d参数数量

  10. 10

    在 Tensorflow 中查找 conv2d 层的权重

  11. 11

    脚本的计数是2而不是1

  12. 12

    如何要求Terraform CLI使用AWS Shared Credentials而不是其主机的AWS EC2实例配置文件

  13. 13

    为什么cout << setprecision(2)<< 0.999的输出是1而不是1.0?

  14. 14

    Keras:过度拟合的Conv2D

  15. 15

    针对列表运行conv2d

  16. 16

    pytorch conv2d配重

  17. 17

    在Keras中是否可以看到Conv2D层之后的输出

  18. 18

    PyTorch Conv2D返回零输入张量的非零输出?

  19. 19

    Keras:为什么Conv2D图层的输出大小与要素图的预期形状不匹配?

  20. 20

    conv2d 函数后输出大小错误

  21. 21

    设置TensorFlow Conv2d操作的权重和偏置张量

  22. 22

    具有padding ='SAME'的Tensorflow / Keras Conv2D层的行为异常

  23. 23

    Conv2d Tensorflow结果错误-精度= 0.0000e + 00

  24. 24

    在 tensorflow Keras 中将图像拟合到 Conv2D 层时出错

  25. 25

    为什么Promise的输出不是“ 1 2 3”而是“ 1 3 2”?

  26. 26

    为什么Promise的输出不是“ 1 2 3”而是“ 1 3 2”?

  27. 27

    JSON计数仅返回1而不是2

  28. 28

    等待 2 个方法而不是 1 个

  29. 29

    为什么我需要将输入数据重塑为Conv2D的附加尺寸?

热门标签

归档