【问题标题】:implementing RNN with numpy用 numpy 实现 RNN
【发布时间】:2018-07-22 13:57:43
【问题描述】:

我正在尝试用 numpy 实现循环神经网络。

我目前的输入输出设计如下:

x 的形状为:(序列长度、批量大小、输入维度)

h:(层数,方向数,批量大小,隐藏大小)

initial weight:(方向数,2 *隐藏大小,输入大小+隐藏大小)

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

bias:(层数,方向数,隐藏大小)

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

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

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

哪位专家能给我指导一下吗?

def rnn(xs, h, w0, w=None, b=None, num_layers=2, nonlinearity='tanh', dropout=0.0, bidirectional=False, training=True):
    num_directions = 2 if bidirectional else 1
    batch_size = xs.shape[1]
    input_size = xs.shape[2]
    hidden_size = h.shape[3]
    hn = []
    y = [None]*len(xs)

    for l in range(num_layers):
        for d in range(num_directions):
            if l==0 and d==0:
                wi = w0[d, :hidden_size,  :input_size].T
                wh = w0[d, hidden_size:,  input_size:].T
                wi = np.reshape(wi, (1,)+wi.shape)
                wh = np.reshape(wh, (1,)+wh.shape)
            else:
                wi = w[max(l-1,0), d, :,  :hidden_size].T
                wh = w[max(l-1,0), d, :,  hidden_size:].T
            for i,x in enumerate(xs):
                if l==0 and d==0:
                    ht = np.tanh(np.dot(x, wi) + np.dot(h[l, d], wh) + b[l, d][np.newaxis])
                    ht = np.reshape(ht,(batch_size, hidden_size)) #otherwise, shape is (bs,1,hs)
                else:
                    ht = np.tanh(np.dot(y[i], wi) + np.dot(h[l, d], wh) + b[l, d][np.newaxis])
                y[i] = ht
            hn.append(ht)
    y = np.asarray(y)
    y = np.reshape(y, y.shape+(1,))
    return np.asarray(y), np.asarray(hn)

【问题讨论】:

  • 如果你想确定它是否在学习,那么你应该使用一个数据集,看看它是否最小化了目标。基本上是调试模型的第一步。
  • @David 有什么简单的虚拟数据来测试它吗?
  • 你可以检查 UCI,但一个简单的可能只是看看它是否可以学习加法(即 1->2->3...)
  • @David 但它如何适应上面的输入设计?例如,如果你要学习加法,它应该如何适应 (seq_len, batch_size, input_size) 的 x 形状,结果应该是什么样的?
  • 您是否在不知道机器学习是什么或者甚至没有先完成简单分类器的情况下尝试实现 RNN?

标签: python numpy recurrent-neural-network rnn


【解决方案1】:

关于形状,如果 PyTorch 是这样做的,这可能是有道理的,但是 Tensorflow 的方式更直观一些 - (batch_size, seq_length, input_size) - batch_size 长度为 seq_length 的序列,其中每个元素都有 input_size 大小。两种方法都可以,所以我想这是一个偏好问题。

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

查看您的代码,我不确定它是否符合预期,但我建议您阅读并尝试复制 this awesome tutorial from wildml,而不是根据现有 API 自行执行此操作(部分2有一个纯粹的numpy实现)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2018-03-17
    • 2018-02-25
    相关资源
    最近更新 更多