RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
I got this RuntimeError
def generate_3d_dipole_kernel(data_shape, voxel_size, b_vec):
#fov = np.array(data_shape) * np.array(voxel_size)
fov = torch.tensor(data_shape)*torch.tensor(voxel_size)
ry, rx, rz = torch.meshgrid(torch.arange(-data_shape[1] // 2, data_shape[1] // 2),
torch.arange(-data_shape[0] // 2, data_shape[0] // 2),
torch.arange(-data_shape[2] // 2, data_shape[2] // 2))
rx, ry, rz = rx / fov[0], ry / fov[1], rz / fov[2]
sq_dist = rx ** 2 + ry ** 2 + rz ** 2
sq_dist[sq_dist == 0] = 1e-6
d2 = ((b_vec[0] * rx + b_vec[1] * ry + b_vec[2] * rz) ** 2) / sq_dist
kernel = (1 / 3 - d2)
return kernel
def forward_convolution_1(chi_sample):
scaling = np.sqrt(chi_sample.shape[0]*chi_sample.shape[1]*chi_sample.shape[2])
chi_fft = torch.fft.fftshift(torch.fft.fftn(torch.fft.fftshift(chi_sample))) / scaling
chi_fft_t_kernel = chi_fft * generate_3d_dipole_kernel(chi_sample.shape, voxel_size=1, b_vec=[0, 0, 1])
tissue_phase = torch.fft.fftshift(torch.fft.ifftn(torch.fft.fftshift(chi_fft_t_kernel)))
tissue_phase = torch.real(tissue_phase * scaling)
return tissue_phase
optimizer = torch.optim.Adam(p, lr=0.01)
num_iter=100
for j in range(num_iter):
optimizer.zero_grad()
out = net(net_input)
out1=out.clone().detach().cpu()
outt = forward_convolution_1(out1[0][0]).cuda()
total_loss = mse(outt, img_noisy_torch)
total_loss.backward()
optimizer.step()
I have to put the output from model into forward_convolution(self-made function).
But it continues making error of no gradient…
How can I solve it?