gpt4 book ai didi

python - 为什么返回 tf.py_func/tf.numpy_function 结果的 Lambda 函数没有输出形状,我该如何纠正这种行为?

转载 作者:行者123 更新时间:2023-12-02 04:23:04 25 4
gpt4 key购买 nike

为了举例,我创建了两个 Python 函数。一个接受一个值并返回它;另一个是 lambda 函数,它返回一个张量来评估函数:

import tensorflow as tf
import numpy as np
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Input,Lambda,Dense
def test_func(value):
return value
test_func = np.vectorize(test_func)
test_op = lambda x: tf.numpy_function(test_func,[x],tf.float32)
input = Input(shape=(1,))
test_layer = Lambda(test_op)
model = Sequential()
model.add(input)
model.add(test_layer)
model.summary()

当我在 Tensorflow 1.14.x + Keras 2.2.x + Python 3.6.x 上运行此代码时,即使我设置了 Lambda 层的 output_shape 参数,我也会得到一个输出形状为“无”的 Lambda 层:

Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lambda_1 (Lambda) None 0
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________

当我使用测试张量测试代码时,我得到了我可能期望的结果:

with tf.Session() as session:
X = tf.constant([[1.0,2.0],[3.0,4.0]])
Y = tf.constant(2.0)
X_out = test_op(X)
Y_out = test_op(Y)
print("X:",session.run(X))
print("X shape: ",session.run(tf.shape(X_out)))
print("Y:",session.run(Y_out))
print("Y shape: ", session.run(tf.shape(Y_out)))

输出:

X: [[1. 2.] [3. 4.]] X shape: [2 2] Y: 2.0 Y shape: 1 EDIT:

为了比较,我还使用 this page of documentation 中的函数创建了一个神经网络:

from tensorflow.keras import Model
from tensorflow.keras.layers import Input,Lambda
input = Input(shape=(1,))
def antirectifier(x):
x -= K.mean(x, axis=1, keepdims=True)
x = K.l2_normalize(x, axis=1)
pos = K.relu(x)
neg = K.relu(-x)
return K.concatenate([pos, neg], axis=1)
lambda_ = Lambda(antirectifier)
lambda_ = Lambda(antirectifier)(input)
model = Model(inputs=[input],outputs=[lambda_])
model.summary()

正如预期的那样,打印出:

Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 1)] 0
_________________________________________________________________
lambda_1 (Lambda) (None, 2) 0
=================================================================
Total params: 0
Trainable params: 0
Non-trainable params: 0
_________________________________________________________________

现在 - 如果我理解正确的话 - tf.py_func 和 K.concatenate 都返回一个 TensorFlow Tensor 对象。所以,问题是,除了我的 tf.numpy_function 层之外,为什么我在此处发布的所有代码都有效?

最佳答案

问题出在np.vectorize

它说它使用了 numpy 的广播规则,它可能与此有关。

检查一下:

def test_func(value):
return value

test_func = np.vectorize(test_func)
print(test_func(2))
print(test_func(2).shape)

注意结果是 ()。因此,Keras/Tensorflow 工作正常,因为它们正在获得 numpy 给出的输出形状。 Numpy 可能不知道它作为输入得到了什么(因为它不适用于符号张量)。

如果将实际的 numpy 数组传递给函数,请注意它是如何正常工作的:

print(test_func(np.array([2])))
print(test_func(np.array([2])).shape)

>>>> [2]
>>>> (1,)

但是当 Keras 初始化模型时,实际数字并不存在,Numpy 不知道当您“使用”模型时它会收到什么。

关于python - 为什么返回 tf.py_func/tf.numpy_function 结果的 Lambda 函数没有输出形状,我该如何纠正这种行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57858794/

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