我正在尝试在 Tensorflow 中创建一个生成 LSTM 网络。我有这样的输入向量:
[[0 0 1 0 ... 1 0]
[0 0 1 0 ... 1 0]
...
[0 0 0 1 ... 0 1]]
该矩阵中的每个向量都是一个时间步,或者换句话说,每个向量应该是 LSTM 的一个输入。输出将是相同的,只是它们会向右移动一个时间步长(我正在尝试预测下一个输出)。然后我列出了这些矩阵,比如说其中五个 - 这是一批。最后我有这些批次的列表,它们本质上是我的训练数据。所以基本上我有 4D 张量。
我尝试过做这样的事情,但显然它不起作用,而且我不太确定我明白如何解决它:
def LSTM(x_, weights, biases):
cell = tf.contrib.rnn.BasicLSTMCell(RNN_HIDDEN)
# initial state
batch_size = tf.shape(x_)[1]
initial_state = cell.zero_state(batch_size, tf.float32)
rnn_outputs, rnn_states = tf.nn.dynamic_rnn(cell,
x_,
initial_state=initial_state,
time_major=False)
return tf.matmul(rnn_outputs[-1], weights['out']) + biases['out']
那么,我应该如何表示数据以便网络能够处理它?
另外,我不太确定在这种情况下如何定义损失。我的向量是 88 维的,其中每个索引代表一种音调。 “1”表示播放音调,“0”表示关闭音调。另外,当播放特定音调然后再次播放时,我用“2”标记(为简洁起见,向量被截断):
[0 0 1 0]
[0 0 1 0]
[0 0 2 0]
[0 0 2 0]
如果只有这些,我就无法区分它是一个长音,还是两个(或三个、四个)短音。这样我就在 1 秒和 2 秒之间交替,每次交替都意味着再次按下一个音调。
这里需要手动计算交叉熵吗?