少年帮|利用深度学习生成医疗报告( 十 )


我们有alphas , 我们有输入 , 现在我们只需要得到加权和 , 产生新的上下文向量 , 它将被输入解码器 。 在实践中 , 这些模型比编解码器模型工作得更好 。
模型实现:
和上面提到的编解码器模型一样 , 这个模型也将由两部分组成 , 一个编码器和一个解码器 , 但这次解码器中会有一个额外的注意力成分 , 即注意力解码器 。 为了更好地理解 , 现在让我们用代码编写:
# 计算e_jtsscore = self.Vattn(tf.nn.tanh(self.Uattn(features) + self.Wattn(hidden_with_time_axis)))# 使用softmax将分数转换为概率分布attention_weights = tf.nn.softmax(score, axis=1)# 计算上下文向量(加权和)context_vector = attention_weights * features在构建模型时 , 我们不必从头开始编写这些代码行 。 keras库已经为这个目的内置了一个注意层 。 我们将直接使用添加层或其他称为Bahdanau的注意力 。 你可以从文档本身了解有关该层的更多信息 。 链接:
这个模型的文本输入将保持不变 , 但是对于图像特征 , 这次我们将从CheXNet网络的最后一个conv层获取特征 。
少年帮|利用深度学习生成医疗报告合并两幅图像后的最终输出形状为(None , 7 , 14 , 1024) 。 所以整形后编码器的输入将是(None , 981024) 。 为什么要重塑图像?好吧 , 这已经在注意力介绍中解释过了 , 如果你有任何疑问 , 一定要把解释再读一遍 。
模型:
input1 = Input(shape=(98,1024), name='Image_1')maxpool1 = tf.keras.layers.MaxPool1D()(input1)dense1 = Dense(256, kernel_initializer=tf.keras.initializers.glorot_uniform(seed = 56), name='dense_encoder')(maxpool1)input2 = Input(shape=(155), name='Text_Input')emb_layer = Embedding(input_dim = vocab_size, output_dim = 300, input_length=155, mask_zero=True, trainable=False,weights=[embedding_matrix], name="Embedding_layer")emb = emb_layer(input2)LSTM1 = LSTM(units=256, activation='tanh', recurrent_activation='sigmoid', use_bias=True,kernel_initializer=tf.keras.initializers.glorot_uniform(seed=23),recurrent_initializer=tf.keras.initializers.orthogonal(seed=7),bias_initializer=tf.keras.initializers.zeros(), return_sequences=True, return_state=True, name="LSTM1")lstm_output, h_state, c_state = LSTM1(emb)LSTM2 = LSTM(units=256, activation='tanh', recurrent_activation='sigmoid', use_bias=True,kernel_initializer=tf.keras.initializers.glorot_uniform(seed=23),recurrent_initializer=tf.keras.initializers.orthogonal(seed=7),bias_initializer=tf.keras.initializers.zeros(), return_sequences=True, return_state=True, name="LSTM2")lstm_output, h_state, c_state = LSTM2(lstm_output)dropout1 = Dropout(0.5)(lstm_output)attention_layer = tf.keras.layers.AdditiveAttention(name='Attention')attention_output = attention_layer([dense1, dropout1], training=True)dense_glob = tf.keras.layers.GlobalAveragePooling1D()(dense1)att_glob = tf.keras.layers.GlobalAveragePooling1D()(attention_output)concat = Concatenate()([dense_glob, att_glob])dropout2 = Dropout(0.5)(concat)FC1 = Dense(256, activation='relu', kernel_initializer=tf.keras.initializers.he_normal(seed = 56), name='fc1')fc1 = FC1(dropout2)OUTPUT_LAYER = Dense(vocab_size, activation='softmax', name='Output_Layer')output = OUTPUT_LAYER(fc1)attention_model = Model(inputs=[input1, input2], outputs = output)


推荐阅读