用numpy实现RNN

时间:2018-07-22 13:57:43

标签: python numpy recurrent-neural-network rnn

我正在尝试使用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)

1 个答案:

答案 0 :(得分:0)

关于形状,如果那是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实现)。