我正在尝试使用char-rnn预测Theano与先前角色有关的下一个角色。

因此,存在4个值得注意的张量(或矩阵)。


  x:整形的输入[时间长度,inputsize]
  
  h:形状为[timelength,hiddensize]的隐藏状态
  
  y:输出形状为[timelength,inputsize]
  
  t:目标值的形状为[timelength-1,inputsize]


此处,目标值张量t的定义形式很明确:


  t [i,j]:= x [i + 1,j]
  但是如何使用上述定义来定义t?


x = T.matrix(name="x")
t = ? # t[i] := x[i+1] but how to define it in theano?


ps。我研究了theano的nnet.conv2d,但是没有运气

最佳答案

原始序列是整数的矢量,编码字符。这被转换为单次编码,提供输入。索引为5的字符的一键编码是一个矢量,其中第5个元素为1,其余元素为零。看起来您正在设置目标以也使用一键编码。可以做到这一点,但并不是必须的。您可以只使用原始整数编码,在这种情况下,t将是向量,而不是矩阵。长度应为timelength,而不是timelength-1

相应的theano定义为:

t = ivector(name="t") # for 32-bit integer
t = lvector(name="t") # for 64-bit integer


您应该使用用于索引的任何整数类型,因为在计算交叉熵损失时,目标将用作输出(y)的索引。

char-rnn处理序列的连续块。假设字符编码整数的原始序列称为chars。序列中的当前位置是p。块长度为timelength。对于当前块,输入x包含chars[p : p + timelength]的一键编码。目标t包含chars[p + 1 : p + timelength + 1]。这样,每个目标都比输入提前一个时间步长。

原始字符代码here非常简单。它使用numpy而不是theano,并且其编写方式会稍有不同。但是,这对于理解概念非常有用。

10-06 01:46