【发布时间】:2020-03-27 22:18:22
【问题描述】:
我正在尝试做梯度下降来计算三阶张量的 CP 分解。我正在使用张量,我是它的初学者。而且我不知道如何计算梯度。
这就是我们目前所拥有的:
def CP_GD(T, rank, epsilon=1e-5,max_iters=100,lr=1e-2,verbose=True,errors_at_iterations=[]):
# Initialize A, B and C
dim1= T.shape[0]
dim2= T.shape[1]
dim3= T.shape[2]
A= tl.tensor(np.random.normal(0,1,[dim1,rank]))
B= tl.tensor(np.random.normal(0,1,[dim2,rank]))
C= tl.tensor(np.random.normal(0,1,[dim3,rank]))
T_approx_old = tl.kruskal_to_tensor((np.ones(rank),[A,B,C]))# YOUR CODE HERE #
it = 1
while True: # repeat until convergence
# compute gradients wrt A B and C and do a gradient step
# check for convergence:
T_approx_new = tl.kruskal_to_tensor((np.ones(rank),[A,B,C]))
reconstruction_error = tl.norm(T_approx_new-T)
errors_at_iterations.append(reconstruction_error)
if tl.norm(T_approx_old - T_approx_new)/tl.norm(T_approx_old) < epsilon or it > max_iters:
return (A,B,C)
if verbose:
print(it, " - reconstruction error: ",reconstruction_error, "convergence: ", tl.norm(T_approx_old - T_approx_new)/tl.norm(T_approx_old))
T_approx_old = T_approx_new
it += 1
【问题讨论】: