質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

TypeError: forward() missing 1 required positional argumentの解消方法について

h_proc
h_proc

総合スコア68

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0リアクション

0クリップ

2751閲覧

投稿2021/11/01 07:25

Python

from __future__ import absolute_import from __future__ import division from __future__ import print_function import torch from torch.autograd import Variable import numpy as np from scipy import sparse ######################################### ##Utils################################## ######################################### def convert_as(src, trg): src = src.type_as(trg) if src.is_cuda: src = src.suda(device=trg.get_device()) return src class Laplacian(torch.nn.Module): def __init__(self, cot=True): super(Laplacian, self).__init__() self.cot = cot def forward(self, V, F): """ Input: param V: B x N x 3 param F: B x F x 3 return: Lx :B x N x 3 """ F = F.unsqueeze(0) V = V.unsqueeze(0) self.F_np = F.data.cpu().numpy() self.F = F.data self.L = None V_np = V.cpu().detach().numpy() batchV = V_np.reshape(-1, 3) #print(order) F = self.F F_np = self.F_np #compute cotangents if self.cot: C = cotangent(V, F) C_np = C.cpu().detach().numpy() else: C_np = np.ones(len(F.reshape(-1)), dtype= np.float32) batchC = C_np.reshape(-1, 3) #3列に成型 offset = np.arange(0, V.size(0)).reshape(-1, 1, 1) * V.size(1) F_np = F_np + offset batchF = F_np.reshape(-1, 3) # 3列に成型 rows = batchF[:, [1, 2, 0]].reshape(-1) cols = batchF[:, [2, 0, 1]].reshape(-1) BN = batchV.shape[0] L = sparse.csr_matrix((batchC.reshape(-1), (rows, cols)), shape=(BN, BN)) L = L + L.T M = sparse.diags(np.arraya(np.sum(L, 1)).reshape(-1), format='csr') L = M - L self.L = L #print(L.max()) result = L.todense() result = convert_as(torch.Tensor(result), V) return result def backward(self, grad_out): """ Return :param grad_out: B x N x 3 :return: grad_vertices: B x N x 3 """ g_o = grad_out.cpu().numpy() #Stack g_o = g_o.reshape(-1, 3) Lg = self.L.dot(g_o).reshape(grad_out.shape) return convert_as(torch.Tensor(Lg), grad_out), None def cotangent(V, F): """ Input :param V: B x N x 3 :param F: B x F x 3 :return: C: B x F x 3 list of cotangents corresponding angles for triangles, columns correspond to edges 23,31,12 B x F x 3 x 3 重み行列 """ indices_repeat = torch.stack([F, F, F], dim=2) #v1が最初の三角形、v2,v3と続く v1 = torch.gather(V, 1, indices_repeat[:, :, :, 0].long()) v2 = torch.gather(V, 1, indices_repeat[:, :, :, 1].long()) v3 = torch.gather(V, 1, indices_repeat[:, :, :, 2].long()) #from scipy.io import savemat #savemat('test,mat',{'v2':v2.cpu().numpy(), 'v3':v3.cpu().numpy()}) #辺の長さ l1 = torch.sqrt(((v2 - v3)**2).sum(2)) l2 = torch.sqrt(((v3 - v1)**2).sum(2)) l3 = torch.sqrt(((v1 - v2)**2).sum(2)) sp = (l1 + l2 + l3) * 0.5 A = 2*torch.sqrt( sp * (sp-l1)*(sp-l2)*(sp-l3)) idx = A <= 0 A[idx]=1.0 bad = A != A A[bad]=1.0 cot23 = (l2**2 + l3**2 - l1**2) cot31 = (l3**2 + l1**2 - l2**2) cot12 = (l1**2 + l2**2 - l3**2) C = torch.stack([cot23, cot31, cot12], 2) / torch.unsqueeze(A, 2) / 4 return C def load_obj(fn): fin = open(fn, 'r') lines = [line.rstrip() for line in fin] fin.close() vertices = []; faces = []; for line in lines: if line.startswith('v '): vertices.append(np.float32(line.split()[1:4])) elif line.startswith('f '): faces.append(np.int32([item.split('/')[0] for item in line.split()[1:4]])) f = np.vstack(faces) v = np.vstack(vertices) return v, f def test_laplacian(): verts, faces = load_obj('4.obj') print(verts.shape) print(faces.min()) verts = verts[None, :, :] faces = faces[None, :, :]-1 verts = torch.nn.Parameter(torch.FloatTensor(verts).cuda()) faces = Variable(torch.LongTensor(faces).cuda(), requires_grad=False) laplacian = Laplacian(verts) Lx = laplacian(faces) L = laplacian.L.todense() from scipy.io import loadmat L_want = loadmat('mat.mat')['laplacepoint'] from scipy.io import savemat savemat('test.mat',{'L':L}) print(L -L_want) import pdb; pdb.set_trace() if __name__ == '__main__': test_laplacian()

こちらのコードを実行すると

TypeError: forward() missing 1 required positional argument: 'F'

というエラーが表示されます。
原因は、

def forward(self, V, F):

で引数を2つしていることにあると思います。
しかし、init =='main'部分で

laplacian = Laplacian(verts, faces)

と書き直しても

TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given

というエラーが表示されます。

これ以外に修正すべきところの検討がつかなかったのですが、他にどこに原因があることが考えられるでしょうか?
よろしくお願い致します。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

y_waiwai

2021/11/01 07:38

どの行でそのエラーが出てるんでしょうか
h_proc

2021/11/01 07:47

Lx = laplacian(faces) というところで止まっているようで、 return forward_call(*input, **kwargs) TypeError: forward() missing 1 required positional argument: 'F' と表示されます。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。