张量流中的 CNN + LSTM

机器算法验证 深度学习 lstm 张量流
2022-04-06 11:00:24

关于如何在 TF 中单独使用 LSTM 的例子很多,但我找不到任何关于如何联合训练 CNN + LSTM 的好例子。在我看来,如何进行这样的培训并不是很简单,我只能想到一种选择。

我相信最简单的解决方案(或最原始的解决方案)是独立训练 CNN 以学习特征,然后在不更新 CNN 部分的情况下在 CNN 特征上训练 LSTM,因为可能必须在 numpy 中提取和保存这些特征,然后将它们提供给 TF 中的 LSTM。但在这种情况下,可能不得不使用不同标记的数据集来预训练 CNN,这消除了端到端训练的优势,即学习 LSTM 所针对的最终目标的特征(除了必须拥有这些首先是附加标签)。

还有其他方法吗?我无法在 tensorflow 中找到任何示例。

2个回答

CNN + RNN 可能。为了理解让我尝试发布评论代码。句子字符的 CNN 运行和与词嵌入合并的 CNN 输出被馈送到 LSTM

N -批次数
M -示例数
L -句子长度
W -任何单词中的最大字符长度
coz - cnn char 输出大小

考虑x = [N, M, L]- 单词级别
考虑cnnx = [N, M, L, W]- 字符级别

目的是在 LSTM 中使用字符和词嵌入

CNNx = tf.nn.embedding_lookup(emb_mat, cnnx) [N, M, L, W, dc]

filter_sizes = [100]
heights = [5]
outs = []
for filter_size, height in zip(filter_sizes, heights):
    num_channels = 3
    filter_ = [1, height, num_channels, filter_size] 
    strides = [1, 1, 1, 1]

    xxc = tf.nn.conv2d(Acx, filter_, strides, "VALID")  # [N*M, L, W/stride, d]
    out = tf.reduce_max(tf.nn.relu(xxc), 2)  # [-1, L, d]
    outs.append(xxc)

concat_out = tf.concat(2, outs)
xx = tf.reshape(concat_out, [-1, M, L, coz])

Ax = tf.nn.embedding_lookup(emb_mat, x)
xx = tf.concat(3, [xx, Ax])  # [N, M, L, di]

我们可以使用 LSTM 将其xx馈送到 RNN

查看https://github.com/NLeSC/mcfly,它有助于为深度 cnn+lstm 搜索和配置最佳架构。你可以查看源码来学习。