循环神经网络架构

时间:2018-04-01 06:16:16

标签: python-3.x tensorflow deep-learning lstm recurrent-neural-network

我正致力于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))

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

1 个答案:

答案 0 :(得分:1)

如果您希望输出为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)似乎非常小。然而,这只是一个猜测,而且需要进行调整。

相关问题