我想实现一个简单的注意力机制来集成 CNN 模型的结果。
具体来说,我输入的每个示例都是图像序列,因此每个示例都有 shape [None, img_width, img_height, n_channels]
。
使用TimeDistributed
包装器,我可以应用我的 CNN 以获得 shape 的输出[None, hidden_state_size]
。
我想将 CNN 应用于序列中的每个图像,然后计算 shape 的注意力向量[None]
。为了做到这一点,我通过具有单个输出单元的 TimeDistributed Dense 网络运行 TimeDistributed CNN 的输出,并计算序列上的 softmax。
然后应该将注意力向量乘以 TimeDistributed CNN 的输出,并将所有内容相加,以便我们最终得到一个 shape 的张量[hidden_state_size]
。
结果代码是这样的:
import tensorflow.keras as keras
import tensorflow.keras.layers as ll
inputs = ll.Input([None, 28, 28, 3])
x = inputs
x = ll.TimeDistributed(ll.Flatten())(x)
attention = ll.TimeDistributed(ll.Dense(1))(x)
attention = ll.Flatten()(attention)
attention = ll.Softmax()(attention)
outputs = ll.dot([x, attention], axes=[-2, -1])
model = keras.models.Model(inputs, outputs)
这个模型的尺寸似乎检查出来了,但这会做我想要的吗?还是我在某个地方犯了错误?