程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

关注本站官方公众号:程序员总部,领取三大福利!
福利一:python和前端辅导
福利二:进程序员交流微信群,专属于程序员的圈子
福利三:领取全套零基础视频教程(python,java,前端,php)

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

尝试使用 pytorch 更新 RNN 的加权矩阵,但 .grad 返回 None

发布于2022-08-09 03:20     阅读(157)     评论(0)     点赞(22)     收藏(1)


我正在尝试使用 pytorch 创建自己的 RNN,并且正在关注一些关于 .backward 函数的简单教程。一旦我运行我的代码,我得到“无”作为 .grad 的结果,我不知道为什么。从这篇文章看起来,这可能是因为我将输入设置为张量,所以它们变得分离了?如果是这样,我不确定如何纠正这一点,但确保它们仍然可以在矩阵中相乘。

import math
import numpy as np
import torch

from collections import deque

#set up the inputs
lists = deque()
for i in range(0, 13, 1):
     lists.append(range(i, i + 4))

x = np.array(lists)

# set up the y vector
y = []

for i in range(len(x)):
    y.append((x[i,3])+1)

#set up the validation input
lists = deque()
for i in range(13, 19, 1):
     lists.append(range(i, i + 4))

x_val = np.array(lists)

#set up the validation y vector
y_val = []

for i in range(len(x_val)):
    y_val.append((x_val[i,3])+1)

#set params
input_dimension = len(x[0])
hidden_dimension = 100
output_dimension = 1

#set up the weighted matrices
np.random.seed(99)
Wxh = np.random.uniform(0, 1, (hidden_dimension, input_dimension)) # weights from input to hidden layer
Whh = np.random.uniform(0, 1, (hidden_dimension, hidden_dimension)) # weights inside cell - recurrant
Why = np.random.uniform(0, 1, (output_dimension, hidden_dimension)) # weights from hidden to output layer

#set up the input tensor
xt = torch.tensor(x[[0]], dtype=torch.float)  #do I want to keep a float here? or force an int?  think: float - understand why

Wxh_t = torch.tensor(Wxh, requires_grad = True).float()
Whh_t = torch.tensor(Whh, requires_grad = True).float()
Why_t = torch.tensor(Why, requires_grad = True).float()



loss = 0

for i in range(len(x)):
    xt = torch.tensor(x[[i]], dtype=torch.float)
    print(xt)
    current_affine_3 = torch.mm(xt,Wxh_t.T)
    hidden_t = torch.mm(h_prev_t, Whh_t.T)
    ht_t = torch.tanh(current_affine_3 + hidden_t)
    y_hat_t = torch.mm(ht_t, Why_t.T)
    loss += (y[i] - y_hat_t)**2
    print(y[i])
    print(loss)
    h_prev_t = ht_t

loss.backward

print(Wxh_t.grad)


loss.backward返回<bound method Tensor.backward of tensor([[18672.0215]], grad_fn=<AddBackward0>)>

如果我查看加权矩阵,我会注意到与教程不同的东西。而不是grad_fn=<AddBackward0>在使用 requires_grad = True 张量计算之后,我得到grad_fn=<MmBackward0>. 我认为这是因为我使用的是 torch.mm,但我不确定这是否重要。这是我在教程中使用的一些代码示例:

x = torch.tensor(2., requires_grad = False)
w = torch.tensor(3., requires_grad = True)
b = torch.tensor(1., requires_grad = True)
print("x:", x)
print("w:", w)
print("b:", b)

# define a function of the above defined tensors
y = w * x + b
print("y:", y)

# take the backward() for y
y.backward()
# print the gradients w.r.t. above x, w, and b
print("x.grad:", x.grad)
print("w.grad:", w.grad)
print("b.grad:", b.grad)

谢谢!


解决方案


暂无回答



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1652065/82159c258d028905f8ac/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

22 0
收藏该文
已收藏

评论内容:(最多支持255个字符)