为了好玩,为了更深入地了解循环神经网络,我从头开始编写自己的基于RNN的语法依赖解析器。在这种情况下,每个句子都是一个单词序列,从中可以预测一系列解析器动作。
现在,如果每个单词只是用数字表示,那就不会有问题,因为在网络输入的维度和网络的输出之间会有一对一的映射。但是,在我的情况下,每个单词由N维单词嵌入表示,而每个预测的解析器动作是有限空间内的整数值。
这意味着我的网络需要接受一系列特征向量作为输入,然后输出一个整数序列。
目前(部分)我的初始化和转发代码如下所示:
def __init__(self, trans_dim, out_dim, feature_vec_size=1, hidden_dim=100, trunc=4):
self.trans_dim = trans_dim
self.hidden_dim = hidden_dim
self.out_dim = out_dim
self.trunc = trunc
# U = input -> hidden weights
self.U = np.random.uniform(-np.sqrt(1./trans_dim), np.sqrt(1./trans_dim), (hidden_dim, trans_dim))
# V = hidden -> output weights
self.V = np.random.uniform(-np.sqrt(1./hidden_dim), np.sqrt(1./hidden_dim), (out_dim, hidden_dim))
# W = s1 -> s2 weights
self.W = np.random.uniform(-np.sqrt(1./hidden_dim), np.sqrt(1./hidden_dim), (hidden_dim, hidden_dim))
def forward(self, steps):
# Number of time steps
t_steps = len(steps)
print t_steps
# The initial hidden
states = np.zeros((t_steps + 1, self.hidden_dim))
# Output at each time step
output = np.zeros((t_steps, self.out_dim))
# Looping through time steps
for t in np.arange(t_steps):
print steps[t]
# This is where the problem is. Indexing U by steps[t] will not work when steps
# contains floats.
states[t] = np.tanh(self.U[:, steps[t]] + self.W.dot(states[t-1]))
output[t] = self.softmax(self.V.dot(states[t]))
这导致了一个问题 - 如何让我的网络接受一系列特征向量作为输入,然后在每个时间步骤中输出表示解析器动作的整数序列?
如果这是一个愚蠢的问题我很抱歉;在神经网络方面,我只是一个新手,但我希望学习。任何帮助将不胜感激。