5

我正在为音素对齐做一个序列到序列的模型。具体来说,我的火车数据看起来像成对的序列(音素-长度),其中音素是一个单热向量,长度是一个浮点数。所以我想给模型输入一个音素序列,得到一个对应的长度序列。

我的网络通常是这样构建的:

model = Sequential(
    EmbeddingLayer{embeddingSize} : 
    RecurrentLSTMLayerStack {lstmDims} :
    LinearLayer{1}
)

如果我做对了,LinearLayer{1}应该从 1 转换lstmDims。因此,当我为模型提供长度为 N 的序列时,我也应该得到长度为 N 的结果序列。

现在我想设置一个合适的损失函数,我认为它应该是已知结果序列的元素与模型输出之间的平均差异。应该通过时间轴进行平均,以便可以管理不同长度的序列。

我打算做类似的事情

objectives = Input(1) #actually a sequence here as stated in the reader
result = model(features)
errs = Abs(objectives - result)
loss_function = ReduceMean(errs)
criterionNodes  = (loss_function)

但在减少操作中明确指出

这些操作不支持对序列进行归约。相反,您可以通过重复来实现这一点。

我不确定如何为我的任务使用重复。而且我也不确定整个概念是否正常。

4

2 回答 2

1

您需要两个不太复杂的重复(对于第二个,我们使用“内置”操作,其实现在cntk.core.bs文件中):

sum = errs + PastValue (0, sum, defaultHiddenActivation=0)
count = BS.Loop.Count(errs)
loss_function = sum / count
于 2017-01-11T18:39:33.253 回答
0

GitHub 中有一个特定的序列到序列教程,它会引导您完成与您的数据相似的数据。您可以查看网络是如何定义的。

https://github.com/Microsoft/CNTK/blob/master/Tutorials/CNTK_204_Sequence_To_Sequence.ipynb

于 2017-01-10T07:05:48.200 回答