使用Tensorflow中的动态时间包裹DTW功能测量两条曲线之间的距离

问题描述

为了在Tensorflow 2.0中使用动态时间包装(DTW)功能测量两条曲线之间的距离,我尝试将以下DTW python代码段转换为Tensorflow。但是在第二个嵌套循环部分中,final_val不会更新为dtw_matrix。尝试对其进行调试,但还无法完成。解决这个问题的好方法是什么?

def dtw(s,t):
'''
s,t are 1D vector,eg.,128 by 1
'''
n,m = len(s),len(t)
dtw_matrix = np.zeros((n+1,m+1))
for i in range(n+1):
    for j in range(m+1):
        dtw_matrix[i,j] = np.inf
dtw_matrix[0,0] = 0

for i in range(1,n+1):
    for j in range(1,m+1):
        cost = abs(s[i-1] - t[j-1])
        # take last min from a square Box
        last_min = np.min([dtw_matrix[i-1,j],dtw_matrix[i,j-1],dtw_matrix[i-1,j-1]])
        dtw_matrix[i,j] = cost + last_min
return dtw_matrix

我通过以下方式尝试了tensorflow实现:

def dtw(s,t):
n,m = s.shape[0],t.shape[0]

dtw_matrix = tf.Variable(tf.zeros([n+1,m+1],tf.float32))

for i in range(n+1):
    for j in range(m+1):
        dtw_matrix =dtw_matrix[i,j].assign(inf)
dtw_matrix =dtw_matrix[0,0].assign(0)

for i in range(1,m+1):
        
        s_ele = tf.gather(s,i-1)
        
        t_ele = tf.gather(t,j-1)
        
        cost1 = tf.math.subtract(s_ele,t_ele)
        cost  = tf.keras.backend.abs(cost1)
       
        # take last min from a square Box
        last_min =tf.math.reduce_min([dtw_matrix[i-1,j-1]])
       
        final_val=tf.math.add(cost,last_min)
        dtw_matrix=dtw_matrix[i,j].assign(final_val)
return dtw_matrix

我怀疑这可能是由于我不知道的我的张量流编码错误所致。另外,有没有办法摆脱这些嵌套循环?这正在减慢计算速度。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)