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