我目前正在努力完成麻省理工学院的深度学习和计算机视觉课程(EECS 498-007 / 598-005)作业1,这似乎有一个大致相当于斯坦福CS 231n
创建一个函数,计算两两的欧氏距离xtrain,xtest。尺寸:[N,x,x]和[M,x,x] (x是相同的数字)
距离-形状为[N,M]的矩阵,表示每个训练点到每个测试点之间的距离
赋值中有给定的a:
试着用两个广播和和和一个矩阵乘法来表示欧氏距离
我试图使用广播来实现这个数学运算,其中的中间项是一个简单的矩阵乘法
我在与张量形状作斗争。到目前为止,我的实现如下:
def euc_no_loop(x,y):
#hint: two broadcast sums
xsq = torch.sum(x**2,axis=1)
print(xsq.shape)
ysq = torch.sum(y**2,axis=1)
print(ysq.shape)
#and one matrix multiply
mixprod = -2 * x.view(x.shape[0],-1).matmul(y.view(y.shape[0],-1).T)
print(mixprod.shape)
euc_dist = torch.sqrt(xsq + mixprod + ysq.unsqueeze(1).T)
return euc_dist
输入为:
x = torch.randn(5,3,3)
y = torch.randn(3,3,3)
形状成为:
xsq:(5 3)
ysq (3 3):
mixprod:(5 3)
输出维数变为[3,5,3].
许多其他StackOverflow线程存在,其中使用numpy -但是numpy点积似乎比torch.matmul更灵活
我就是不明白我哪里错了