Tensorflow - Keras 断开连接的图
Tensorflow - Keras disconnected graph
Tensorflow 版本:2.x
Python: 3.7.4
断开连接的图表: 我正在尝试复制以下模型架构,但当我尝试在 Keras 中绘制模型时,右侧部分似乎已断开连接。我已经将隐藏矩阵 HQ(For question) 和 HA(For answer) 作为输入传递给注意力层(我们可以在下面的摘要中看到 Coattention 层的输入——输入形状为 (512,600) 和 (512, 600) 以及 Coattention矩阵 CQ 和 CA 的输出形状也相同)。请帮助我理解这种脱节。这是否需要更正或可以忽略?
最终模型:
inputs = [input_text1, input_text2]
outputs = score_oq_oa
model = Model(inputs=inputs, outputs=outputs)
model.summary()
预期模型架构:
模型生成的图形: 为什么右侧断开连接?请帮助我理解。我没有在问答的双向层之后使用连接层,但我只是将两个双向层的输出矩阵作为输入传递给注意力层,如上所述。
问题已使用 Coattention 层的代码更新如下:
这里的 HQ 和 HA 是我们在模型架构中看到的两个独立双向层的隐藏状态 matrices/outputs。
class coattention(tf.keras.layers.Layer):
def __init__(self):
super(coattention, self).__init__()
def call(self, HQ, HA):
L = tf.linalg.matmul(HA, HQ, transpose_a = True, transpose_b = False)
AQ = tf.nn.softmax(L, axis = 1)
AA = tf.nn.softmax(tf.transpose(L), axis = 1)
CQ = tf.linalg.matmul(HA, AQ, transpose_a = False, transpose_b = False)
CA = tf.linalg.matmul(HQ, AA, transpose_a = False, transpose_b = False)
return CQ, CA
coattention_layer = coattention()
CQ, CA = coattention_layer(HQ, HA)
print ("Shape of Context vector of Question (CQ): ", CQ.shape)
print ("Shape of Context vector of Answer (CA): ", CA.shape)
问题上下文向量的形状 (CQ):(512, 600)
答案上下文向量的形状 (CA):(512, 600)
因为你没有提供代码,我相信你忘记了以 Bidirectional_7 层作为输入调用 coattention 层。
这里是示例代码
Ha = Input(shape=(1,2,3), name='Ha')
Hq = Input(shape=(1,2,3), name='Hq')
your_coattention_layer = Dense(12, name='your_coattention_layer')
# this part that I think you forgot
Ca = your_coattention_layer(Ha)
cQ = your_coattention_layer(Hq)
out1 = Dense(123, name='your_Ca_layer')(Ca)
out2 = Dense(123, name='your_Cq_later')(cQ)
M = Model(inputs=[Ha,Hq], outputs=[out1,out2])
M.summary()
from keras.utils import plot_model
plot_model(M, to_file='Example.png')
这是模型图片
Tensorflow 版本:2.x
Python: 3.7.4
断开连接的图表: 我正在尝试复制以下模型架构,但当我尝试在 Keras 中绘制模型时,右侧部分似乎已断开连接。我已经将隐藏矩阵 HQ(For question) 和 HA(For answer) 作为输入传递给注意力层(我们可以在下面的摘要中看到 Coattention 层的输入——输入形状为 (512,600) 和 (512, 600) 以及 Coattention矩阵 CQ 和 CA 的输出形状也相同)。请帮助我理解这种脱节。这是否需要更正或可以忽略?
最终模型:
inputs = [input_text1, input_text2]
outputs = score_oq_oa
model = Model(inputs=inputs, outputs=outputs)
model.summary()
预期模型架构:
模型生成的图形: 为什么右侧断开连接?请帮助我理解。我没有在问答的双向层之后使用连接层,但我只是将两个双向层的输出矩阵作为输入传递给注意力层,如上所述。
问题已使用 Coattention 层的代码更新如下:
这里的 HQ 和 HA 是我们在模型架构中看到的两个独立双向层的隐藏状态 matrices/outputs。
class coattention(tf.keras.layers.Layer):
def __init__(self):
super(coattention, self).__init__()
def call(self, HQ, HA):
L = tf.linalg.matmul(HA, HQ, transpose_a = True, transpose_b = False)
AQ = tf.nn.softmax(L, axis = 1)
AA = tf.nn.softmax(tf.transpose(L), axis = 1)
CQ = tf.linalg.matmul(HA, AQ, transpose_a = False, transpose_b = False)
CA = tf.linalg.matmul(HQ, AA, transpose_a = False, transpose_b = False)
return CQ, CA
coattention_layer = coattention()
CQ, CA = coattention_layer(HQ, HA)
print ("Shape of Context vector of Question (CQ): ", CQ.shape)
print ("Shape of Context vector of Answer (CA): ", CA.shape)
问题上下文向量的形状 (CQ):(512, 600)
答案上下文向量的形状 (CA):(512, 600)
因为你没有提供代码,我相信你忘记了以 Bidirectional_7 层作为输入调用 coattention 层。
这里是示例代码
Ha = Input(shape=(1,2,3), name='Ha')
Hq = Input(shape=(1,2,3), name='Hq')
your_coattention_layer = Dense(12, name='your_coattention_layer')
# this part that I think you forgot
Ca = your_coattention_layer(Ha)
cQ = your_coattention_layer(Hq)
out1 = Dense(123, name='your_Ca_layer')(Ca)
out2 = Dense(123, name='your_Cq_later')(cQ)
M = Model(inputs=[Ha,Hq], outputs=[out1,out2])
M.summary()
from keras.utils import plot_model
plot_model(M, to_file='Example.png')
这是模型图片