递归神经网络架构

Recurrent neural network architecture

我正在研究一种 RNN 架构,它可以进行语音增强。输入的维度是 [XX, X, 1024],其中 XX 是批量大小,X 是可变序列长度。

网络的输入是正值数据,输出是屏蔽二进制数据(IBM),稍后用于构建增强信号。

例如,如果网络的输入是 [10, 65, 1024],则输出将是具有二进制值的 [10,65,1024] 张量。我使用带有均方误差的 Tensorflow 作为损失函数。但是我不确定在这里使用哪个激活函数(它使输出保持为零或一),以下是我到目前为止想出的代码

tf.reset_default_graph()
num_units = 10 #
num_layers = 3 #
dropout = tf.placeholder(tf.float32)

cells = []
for _ in range(num_layers):
    cell = tf.contrib.rnn.LSTMCell(num_units)
    cell = tf.contrib.rnn.DropoutWrapper(cell, output_keep_prob = dropout)
    cells.append(cell)
cell = tf.contrib.rnn.MultiRNNCell(cells)

X = tf.placeholder(tf.float32, [None, None, 1024])
Y = tf.placeholder(tf.float32, [None, None, 1024])

output, state = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)

out_size = Y.get_shape()[2].value
logit = tf.contrib.layers.fully_connected(output, out_size)
prediction = (logit)

flat_Y = tf.reshape(Y, [-1] + Y.shape.as_list()[2:])
flat_logit = tf.reshape(logit, [-1] + logit.shape.as_list()[2:])

loss_op = tf.losses.mean_squared_error(labels=flat_Y, predictions=flat_logit)  

#adam optimizier as the optimization function
optimizer = tf.train.AdamOptimizer(learning_rate=0.001) #
train_op = optimizer.minimize(loss_op)

#extract the correct predictions and compute the accuracy
correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

我的重建也不好。有人可以建议改进模型吗?

如果您希望输出为 0 或 1,对我来说,将其转化为分类问题似乎是个好主意。为此,我将使用 S 形激活函数和交叉熵:

...
prediction = tf.nn.sigmoid(logit)
loss_op = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=Y, logits=logit))
...

此外,在我看来,对于如此大的输入维度 (1024),堆叠 RNN 的隐藏维度 (10) 似乎很小。不过这只是猜测,还有待调整。