【发布时间】: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