tensorflow 有效地填充由tf.split给出的二维数组列表的输出

t5zmwmid  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(84)

我试图建立一个物理启发的机器学习模型,但在编写成本函数时遇到了一个奇怪的问题。
该网络接收长度为N的向量并输出长度为N的向量,因此本质上是一个多维回归问题。
问题是这个向量的不规则子集需要保持范数为1,这是成本函数的一部分。也就是说,ML模型的输出需要分割向量并取每个分割部分的范数。假设向量的长度为100,这被分割成长度为50 30 25 5的子Tensor。问题是它也是一个时间序列,所以实际上我们有一个这些形状的输出列表:[(100,50)(100,30)(100,25)(100,5)].为了在没有循环的情况下有效地计算范数,我需要用0填充第二个轴,以便可以组合Tensor并在一个循环中计算范数,但这需要一种有效的方法将其转换为[(100,50),(100,50),(100,50),(100,50)],这样我就可以堆叠这些嵌套框,并在没有循环的情况下运行范数计算。
这可能是我想多了,一个循环是好的。
目前我有这个,其中输入的形状为(100,100),norm_list包含必须计算范数的部分的长度。奇怪的分裂的原因是因为实际值是复杂的,但表示为实数对。

def prop_loss_full(y_true,y_pred):
    y_truer, y_truec = f2rr_full(y_true)
    y_predr, y_predc = f2rr_full(y_pred)
    diff = math_ops.squared_difference(y_pred,y_true)
    split_real = tf.split(y_predr,norm_list,1)
    split_imag = tf.split(y_predc,norm_list,1)
    norm = math_ops.reduce_sum((math_ops.square(split_real[0])+math_ops.square(split_imag[0])),axis=1)

    for i in range(1,len(split_real)):
        norm+=math_ops.reduce_sum((math_ops.square(split_real[i])+math_ops.square(split_imag[i])),axis=1)

    return norm+ks.MSE(y_true, y_pred)
prop_loss_full(data,data)

字符串
任何帮助将不胜感激!当我使用tf.pad_sequence时,我得到一个错误--我假设它不喜欢2dTensor的重复。我已经广泛地研究过了,包括不规则的Tensor和其他类似的特征,但还没有设法让它们工作。

pcrecxhr

pcrecxhr1#

如果先转置数据,则可以使用pad_sequences

# random data in the same shape as yours
x = [tf.random.uniform((100, x)) for x in [50, 30, 25]]  # shape: [(100, 50), (100, 30), (100, 25)]

x = [tf.transpose(x_) for x_ in x]  # shape: [(50, 100), (30, 100), (25, 100)]
x = tf.keras.utils.pad_sequences(x)  # shape: tensor(3, 50, 100)
x = tf.transpose(x, [0, 2, 1])  # shape: tensor(3, 100, 50)

字符串
你仍然有一个循环用于数据的转置操作,但它仍然应该比使用子Tensor上的循环更快。

相关问题