RaggedTensor成为损失函数中的张量



我有一个序列到序列模型,我试图在其中预测转换后的输出序列。为此,我需要计算不规则张量中元素之间的MSE:

def cpu_bce(y_value, y_pred):
with tf.device('/CPU:0'):
y_v = y_value.to_tensor()
y_p = y_pred.to_tensor()

return tf.keras.losses.MeanSquaredError()(y_v, y_p)

但是,在执行时遇到错误:

AttributeError: 'Tensor' object has no attribute 'to_tensor'

是什么导致了这个问题?当直接调用GRU时,它似乎返回一个RaggedTensor。然而,在运行时,损失函数的参数是正常的Tensors。

import tensorflow as tf
import numpy as np
import functools
def generate_example(n):

for i in range(n):
dims = np.random.randint(7, 11)
x = np.random.random((dims, ))
y = 2 * x.cumsum()
yield tf.constant(x), tf.constant(y)
N = 200
ds = tf.data.Dataset.from_generator(
functools.partial(generate_example, N),
output_signature=(
tf.TensorSpec(shape=(None,), dtype=tf.float32),
tf.TensorSpec(shape=(None,), dtype=tf.float32),
),
)
def rag(x, y):
x1 = tf.expand_dims(x, 0)
y1 = tf.expand_dims(y, 0)

x1 = tf.expand_dims(x1, -1)
y1 = tf.expand_dims(y1, -1)

return (
tf.RaggedTensor.from_tensor(x1),
tf.RaggedTensor.from_tensor(y1),
)
def unexp(x, y):
return (
tf.squeeze(x, axis=1),
tf.squeeze(y, axis=1)
)
ds = ds.map(rag).batch(32).map(unexp)
model = tf.keras.Sequential([
tf.keras.Input(
type_spec=tf.RaggedTensorSpec(shape=[None, None, 1],
dtype=tf.float32)),
tf.keras.layers.GRU(1, return_sequences=True),
])
def cpu_bce(y_value, y_pred):
with tf.device('/CPU:0'):
y_v = y_value.to_tensor()
y_p = y_pred.to_tensor()

return tf.keras.losses.MeanSquaredError()(y_v, y_p)
model.compile(loss=cpu_bce, optimizer="adam", metrics=[cpu_bce])
model.fit(ds, epochs=3)

在您的损失函数中,您可以用以下方式重写它以使其工作。

def cpu_bce(y_value, y_pred):
with tf.device('/CPU:0'):
if isinstance(y_value, tf.RaggedTensor):
y_value = y_value.to_tensor()

if isinstance(y_pred, tf.RaggedTensor):   
y_pred = y_pred.to_tensor()

return tf.keras.losses.MeanSquaredError()(y_value, y_pred)
model.compile(loss=cpu_bce, optimizer="adam", metrics=[cpu_bce])
model.fit(ds, epochs=3) # loss & metrics will vary

或者,你不需要转换不规则张量,保持原样。

def cpu_bce(y_value, y_pred):
with tf.device('/CPU:0'):
return tf.keras.losses.MeanSquaredError()(y_value, y_pred)
model.compile(loss=cpu_bce, optimizer="adam", metrics=[cpu_bce])
model.fit(ds, epochs=3) # loss & metrics will alike

得到AttributeError的原因是在metrics=[cpu_bce]中,目标张量和预测张量get在内部转换为tesnor。你可以通过在损失函数中打印你的目标和预测来检查。你会发现对于损失函数它是粗糙的但是对于度规函数它是张量。它可能感觉不方便,在这种情况下,随时在GitHub中提出票。

相关内容

  • 没有找到相关文章

最新更新