g_error = generator_loss(x)
g_error.backward()
Then the error showed:
backward() takes 1 positional argument but 2 were given.
The value of g_error is tensor([16.8434], grad_fn=)
I want to know the cause of this problem and the way to solve.
g_error = generator_loss(x)
g_error.backward()
Then the error showed:
backward() takes 1 positional argument but 2 were given.
The value of g_error is tensor([16.8434], grad_fn=)
I want to know the cause of this problem and the way to solve.
Could you post a small executable code snippet?
This would make debugging a bit easier.
Thank you very much! Here is the related code.
class VerificationMatcher_ldaloss(nn.Module):
def __init__(self,te,P,y,lamda,cta,w,mu,sigma,sr,T):
super(VerificationMatcher_ldaloss,self).__init__()
self.te=te
self.P=P
self.y=y
self.lamda=lamda
self.cta=cta
self.sr=sr
self.w=w
self.mu=mu
self.sigma=sigma
self.T=T
#self.beta=beta
return
def forward(self,x):
fwa=extractiVector()#self.y+x,self.sr,self.w,self.mu,self.sigma)
#print(wa)
voice=self.y+x
wa=fwa(voice,self.sr,self.w,self.mu,self.sigma,self.T)
ta=self.P.float().mm(wa)
ta=torch.t(ta)
#self.te=torch.t(self.te)
#print(te)
#te=torch()
#print(torch.norm(self.te.float(), 2, 1))
#print(2)
cos = nn.CosineSimilarity(dim=0, eps=1e-6)
#print(self.te)
loss =1- self.lamda*(cos(self.te[0].float(),ta[0])-self.cta)+torch.norm(x).item()
print(loss)
return loss
generator_loss=VerificationMatcher_ldaloss(te=te,P=P,y=y,lamda=lamda,cta=cta,
w=w,mu=mu,sigma=sigma,sr=sr,T=T)
def train_a_gan(G_net, G_optimizer,generator_loss, show_every=250,
noise_size=200, num_epochs=1000):
iter_count = 0
sample_noise = (torch.rand(1, noise_size) - 0.5) / 0.5
for epoch in range(num_epochs):
#sample_noise = (torch.rand(1, noise_size) - 0.5) / 0.5 # -1 ~ 1 的均匀分布
g_fake_seed = Variable(sample_noise)#.cuda()
if torch.cuda.is_available():
g_fake_seed=g_fake_seed.cuda()
fake_voices = G_net(g_fake_seed) # 生成的假的数据
g_error = generator_loss(fake_voices)
G_optimizer.zero_grad()
#weights=torch.ones(1)*0.1
#g_error.backward(weights,retain_graph=True)
g_error.backward()
G_optimizer.step() # 优化生成网络
if (iter_count % show_every == 0):
print('Iter: {}, G:{:.4}'.format(iter_count,g_error.item()))
voices_numpy = fake_voices.data.cpu().numpy()
#show_images(imgs_numpy[0:16])
#plt.show()
#print()
iter_count += 1
train_a_gan(G_net, G_optimizer,generator_loss, show_every=25, noise_size=200, num_epochs=100001)
The error is:
TypeError: backward() takes 1 positional argument but 2 were given
in the line " g_error.backward()"
Thanks for the code!
Unfortunately I cannot debug it smoothly, as all arguments (with their shapes) are missing as well as the definition of extractiVector()
.
One issue in your forward
method is, that you are detaching torch.norm(x)
by calling item
on it, thus it works as a constant value.
The error message is strange given your code, as no arguments are passed to g_error.backward()
.
Could you try to simplify the code a bit or post all arguments using torch.randn
with the corresponding shapes?