我试图建立一个物理启发的机器学习模型,但在编写成本函数时遇到了一个奇怪的问题。
该网络接收长度为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和其他类似的特征,但还没有设法让它们工作。
1条答案
按热度按时间pcrecxhr1#
如果先转置数据,则可以使用
pad_sequences
:字符串
你仍然有一个循环用于数据的转置操作,但它仍然应该比使用子Tensor上的循环更快。