12

我正在尝试用numpy实现递归神经网络。

我当前的输入和输出设计如下:

x形状:(序列长度、批量大小、输入尺寸)

小时:(层数、方向数、批量大小、隐藏大小)

初始重量:(方向数,2*隐藏大小,输入大小+隐藏大小)

重量:(层数-1,方向数,隐藏大小,方向*隐藏大小+隐藏大小)

偏差:(层数、方向数、隐藏大小)

我已经查找了RNN的pytorch API作为参考(https://pytorch.org/docs/stable/nn.html?highlight=rnn#torch.nn.rnn),但略有更改,将初始重量作为输入。(输出形状应该与pytorch中的相同)

当它运行时,我无法确定它是否运行正常,因为我正在输入随机生成的数字作为输入。

特别是,我不太确定我的输入形状是否设计正确。

有专家能给我指点迷津吗?

def-rnn(xs,h,w0,w=无,b=无,num_layers=2,非线性='tanh',辍学=0.0,双向=假,训练=真):num_directions=2,如果是双向else 1batch_size=xs.shape[1]input_size=xs.shape[2]hidden_size=h.shape[3]hn=[]y=[无]*len(xs)对于范围内的l(num_layers):对于范围内的d(num_directions):如果l==0和d==0:wi=w0[d,:hidden_size,:input_size]。T型wh=w0[d,隐藏大小:,输入大小:]。T型wi=np.重塑(wi,(1,)+wi.形状)wh=np.重塑(wh,(1,)+wh.形状)其他:wi=w[max(l-1,0),d,:,:hidden_size]。T型wh=w[最大值(l-1,0),d,:,hidden_size:]。T型对于枚举(xs)中的i,x:如果l==0和d==0:ht=np.tanh(np.dot(x,wi)+np.dotht=np.reform(ht,(batch_size,hidden_size))#否则,shape为(bs,1,hs)其他:ht=np.tanh(np.dot(y[i],wi)+np.doty[i]=hthn.附录(ht)y=np.a阵列(y)y=np.重塑(y,y.shape+(1,))返回np.asaray(y),np.asarray(hn)
7
  • 如果你想确定它是否在学习,那么你应该使用一个数据集,看看它是否最小化了目标。基本上是调试模型的第一步。
    – 大卫
    评论 2018年7月24日19:39
  • 1
    @大卫,有简单的伪数据可以测试吗? 评论 2018年7月25日2:41
  • 你可以检查UCI,但一个简单的方法可能只是看看它是否可以学习加法(即1->2->3…)
    – 大卫
    评论 2018年7月25日18:56
  • @David,但它如何适合上面的输入设计?例如,如果您要学习加法,它应该如何适应(seq_len,batch_size,input_size)的x形状,结果应该是什么样的? 评论 2018年7月26日0:24
  • 您是否试图在不知道什么是机器学习或甚至先做了简单分类器的情况下实现RNN?
    – 大卫
    评论 2018年7月26日3:55

1答案1

重置为默认值
2

关于形状,如果PyTorch就是这样做的,那么这可能是有意义的,但Tensorflow方法更直观一些-(批次大小、序列长度、输入大小)-批处理大小序列序列_长度每个元素的长度输入_大小大小。这两种方法都可行,所以我想这是一个偏好问题。

为了查看您的rnn是否正常运行,我只需在每个时间点打印隐藏状态,在一些小的随机数据上运行它(例如5个向量,每个向量3个元素),并将结果与手动计算结果进行比较。

看看你的代码,我不确定它是否做了它应该做的事情,但我建议你阅读并尝试复制,而不是根据现有的API自己做这件事这个来自wildml的很棒的教程(在第2部分中,有一个纯粹的numpy实现)。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问自己的问题.