我正在尝试使用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)
答案 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实现)。