gpt4 book ai didi

python-3.x - TensorFlow 2.0 中 lambda 函数的组成

转载 作者:行者123 更新时间:2023-12-02 22:21:18 26 4
gpt4 key购买 nike

为了在 TensorFlow 2.0 中构建大型模型,我使用函数式方法并利用 functools Python 3.6 的模块。我通过显示特定自定义层的代码来说明问题。

import tensorflow as tf
import functools
from collections.abc import Iterable


# TODO Check for correctness of the model implementation
class Unit3D(tf.keras.layers.Layer):
def __init__(self, output_channels,
kernel_shape=(1, 1, 1),
stride=(1, 1, 1),
activation_fn='relu',
use_batch_norm=True,
use_bias=False,
is_training=False,
name='unit_3d'):
super(Unit3D, self).__init__(name=name)
self._output_channels = output_channels
self._kernel_shape = kernel_shape
self._stride = stride
self._activation = activation_fn
self._use_batch_norm = use_batch_norm
self._use_bias = use_bias
self._is_training = is_training
self._pipeline = []
self._pipeline.append(tf.keras.layers.Conv3D(
filters=self._output_channels,
kernel_size=self._kernel_shape,
strides=self._stride,
padding='same',
use_bias=self._use_bias,
data_format='channels_first'
)
)
if self._use_batch_norm:
bn = tf.keras.layers.BatchNormalization(
axis=1,
fused=False,
)
bn = functools.partial(bn, training=self._is_training)
self._pipeline.append(bn)

if self._activation is not None:
self._pipeline.append(tf.keras.layers.Activation(
activation=self._activation
)
)

print(isinstance(self._pipeline, Iterable))
print(type(self._pipeline))
self._pipeline = lambda x: functools.reduce(lambda f, g: g(f), self._pipeline, x)

def call(self, input):
return self._pipeline(input)

当使用以下代码进行测试时,它返回错误

TypeError: reduce() arg 2 must support iteration

该错误与self._pipeline中的函数组成有关。在 __init__方法。

import tensorflow as tf
from nets.i3d import Unit3D

model = Unit3D(output_channels=64, kernel_shape=[7,7,7],
is_training=True)

input = tf.keras.backend.random_uniform(shape=(1,3,64,224,224),
dtype=tf.float32)
output = model(input)

在 TensorFlow 2.0 中,在急切执行期间,所有列表都包装在称为 <class 'tensorflow.python.training.tracking.data_structures.ListWrapper'> 的数据结构中。

事实证明这个数据结构是可迭代的。我使用 collections.abc 中的 Iterable 类对其进行了测试模块。

我无法理解这段代码的问题,并且不确定这是否是 TensorFlow 2.0 的内部问题,或者是我在这里缺少的一些基本问题。

如果有帮助,我正在使用tensorflow版本2.0.0-beta1r2.0 的源代码编译分支。对应的git hash为8e423e3d56390671f0d954c90f4fd163ab02a9c1 .

最佳答案

我认为您的问题与 Tensorflow 没有任何关系。

在这一行中:

self._pipeline = lambda x: functools.reduce(lambda f, g: g(f), self._pipeline, x)

您将使用函数覆盖之前在构造函数中创建的列表。因此,在 lambda 的实际执行过程中(尤其是传递给 reduce 的 lambda),它只是一个函数

如果您将外部 lambda 重构为常规函数以进行调试,情况会变得更加明显:

    def debug_func(x):
print(type(self._pipeline)) # prints <class 'function'>
return functools.reduce(lambda f, g: g(f), self._pipeline, x)

self._pipeline = debug_func # Clearly, no longer a list

解决方案

我认为您的意图是将管道即函数保存在与 _pipeline 不同的字段中,例如:

    # ...
self._pipeline_func = lambda x: functools.reduce(lambda f, g: g(f), self._pipeline, x)

def call(self, input):
return self._pipeline_func(input)

关于python-3.x - TensorFlow 2.0 中 lambda 函数的组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56717031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com