我有一个关于TensorFlow
的技术问题。
我有一个TensorFlow矩阵
,其维度为(None, 2)
。我需要将一个函数,比如some_function,仅应用于矩阵的第0维度,即所有行。问题是第0维度是None类型(它是动态的,因为它依赖于输入到NN模型
的大小),并且会显示None不是整数类型的错误。有两个tf函数
:tf.map_fn
和tf.scan
可以用来迭代TensorFlow数组
。但它们都无法处理None维度。
或许您可以定义一个形状为(None, 2)
的测试TensorFlow数组,并尝试将任何测试函数应用于第一维度。任何帮助/输入都将不胜感激!
回答:
由于这是keras模型的输出,如果我尝试执行以下操作,
res2 = tf.map_fn(lambda y: y*2, model.output)
您会得到,
TypeError: ‘Tensor’对象无法被解释为整数
但是,以下操作是可以的,
# 初始化产生您想要映射的输出的模型model = tf.keras.models.Sequential()model.add(tf.keras.layers.Dense(2, input_shape=(2,)))res = tf.keras.layers.Lambda(lambda x: tf.map_fn(lambda y: y*2, x))(model.output)
然后您定义一个新模型,并使用它来获取tf.map_fn
的结果。
model2 = tf.keras.Model(inputs=model.inputs, outputs=res)print(model2.predict(np.array([[1,2],[3,4]])))
附注:但这与第一维度为None
无关。tf.map_fn
完全可以处理None
维度。您可以通过在TF 1.x中对tf.placeholder([None,2])
运行tf.map_fn
来验证这一点。
因为它是迭代地在该维度上应用一个函数,并且不需要知道大小即可执行此操作。