2017-11-14 2 views
0

PyTorchのアクセラレータをGPUに設定して、関数(fit)を最適化しようとしています。これは私がfitの評価をしているストレートPythonコード、されていますPyTorch損失関数の評価

import numpy as np 
... 
for j in range(P): 
    e[:,j] = z - h[:,j]; 
    fit[j] = 1/(sqrt(2*pi)*sigma*N)*np.sum(exp(-(e[:,j]**2)/(2*sigma**2))); 

変数の寸法は以下のとおりです。 z [Nx1の]、h [NXP]、e [NXP]、fit [1xP ]。 Pfitの次元数で、Nは各次元の長さです。

私は、PyTorchからtorch.cuda.FloatTensorを使用してそれを行う私の試みであるので、forループは避けるべきであることを知っています。

import torch 
dtype = torch.cuda.FloatTensor 
e  = z - h; 
fit = 1/(torch.sqrt(2*pi)*sigma*N)*torch.sum(torch.exp(-(torch.pw(e,2))/(2*torch.pow(sigma,2)))); 

残念ながら、それが機能していません。なにが問題ですか? ありがとうございました!

+0

エラーメッセージは何ですか?常にエラー情報とともに質問を投稿してください。私は 'e = z-h'行でサイズの不一致エラーが発生していると思いますが、それは正しいですか? –

+0

申し訳ありません。次回はエラーメッセージを投稿します。うん、あなたは正しい。 – Dirac

答えて

1

次の行でサイズの不一致エラーが発生しているようです。あなたの例で

e = z - h 

zベクトルとh形状NxPの2Dテンソルである(形状Nx1の2Dテンソル)です。したがって、直接hzから引くことはできません。

サイズの不一致エラーを回避するには、次の操作を行います。ここ

e = z.expand(*h.size()) - h 

z.expand(*h.size())は列ベクトルをP回複製することによってNx1からNxP形状にテンソルzを変換します。

+0

ありがとう、それは動作します! – Dirac