【问题标题】:TensorFlow model to Keras functional API?TensorFlow 模型到 Keras 功能 API?
【发布时间】:2021-03-10 17:50:58
【问题描述】:

我想将此模型作为使用 Keras API 的功能模型,但不确定如何。我希望我的模型采用model = tf.keras.model.Model(....) 的形式,所以我可以通过调用model 来评估或导出模型。但我不知道如何使用模型中的注意力层来做到这一点。 Keras attention layer documentation 就停在这一步,留给用户自己解决。

仅供参考,我的模型使用 IMDB 评论进行情绪分析。

query_layer = tf.keras.layers.Conv1D(filters=100, kernel_size=4, padding='same')
value_layer = tf.keras.layers.Conv1D(filters=100, kernel_size=4, padding='same')

attention = tf.keras.layers.Attention()
concat = tf.keras.layers.Concatenate()

cells = [tf.keras.layers.LSTMCell(256), tf.keras.layers.LSTMCell(64)]
rnn = tf.keras.layers.RNN(cells)
output_layer = tf.keras.layers.Dense(1)

for batch in ds['train'].batch(32):
    text = batch['text']
    embeddings = embedding_layer(vectorize_layer(text))
    query = query_layer(embeddings)
    value = value_layer(embeddings)
    query_value_attention = attention([query, value])
    attended_values = concat([query, query_value_attention])
    logits = output_layer(rnn(attended_values))
    loss = binary_crossentropy(tf.expand_dims(batch['label'], -1),
                                               logits, from_logits=True)

【问题讨论】:

标签: python tensorflow keras deep-learning autoencoder


【解决方案1】:

不知道为什么你有“for”。

这是一个基于 keras 文档的示例。我在输出上添加了一个密集层。

import tensorflow as tf

'''
query_layer = tf.keras.layers.Conv1D(filters=100, kernel_size=4, padding='same')
value_layer = tf.keras.layers.Conv1D(filters=100, kernel_size=4, padding='same')

attention = tf.keras.layers.Attention()
concat = tf.keras.layers.Concatenate()

cells = [tf.keras.layers.LSTMCell(256), tf.keras.layers.LSTMCell(64)]
rnn = tf.keras.layers.RNN(cells)
output_layer = tf.keras.layers.Dense(1)

for batch in ds['train'].batch(32):
    text = batch['text']
    embeddings = embedding_layer(vectorize_layer(text))
    query = query_layer(embeddings)
    value = value_layer(embeddings)
    query_value_attention = attention([query, value])
    attended_values = concat([query, query_value_attention])
    logits = output_layer(rnn(attended_values))
    loss = binary_crossentropy(tf.expand_dims(batch['label'], -1),
                                               logits, from_logits=True)
'''

query_input = tf.keras.Input(shape=(None,), dtype='int32')
value_input = tf.keras.Input(shape=(None,), dtype='int32')

# Embedding lookup.
token_embedding = tf.keras.layers.Embedding(input_dim=1000, output_dim=64)
# Query embeddings of shape [batch_size, Tq, dimension].
query_embeddings = token_embedding(query_input)
# Value embeddings of shape [batch_size, Tv, dimension].
value_embeddings = token_embedding(value_input)

# CNN layer.
cnn_layer = tf.keras.layers.Conv1D(
    filters=100,
    kernel_size=4,
    # Use 'same' padding so outputs have the same shape as inputs.
    padding='same')
# Query encoding of shape [batch_size, Tq, filters].
query_seq_encoding = cnn_layer(query_embeddings)
# Value encoding of shape [batch_size, Tv, filters].
value_seq_encoding = cnn_layer(value_embeddings)

# Query-value attention of shape [batch_size, Tq, filters].
query_value_attention_seq = tf.keras.layers.Attention()(
    [query_seq_encoding, value_seq_encoding])

# Reduce over the sequence axis to produce encodings of shape
# [batch_size, filters].
query_encoding = tf.keras.layers.GlobalAveragePooling1D()(
    query_seq_encoding)
query_value_attention = tf.keras.layers.GlobalAveragePooling1D()(
    query_value_attention_seq)

# Concatenate query and document encodings to produce a DNN input layer.
input_layer = tf.keras.layers.Concatenate()(
    [query_encoding, query_value_attention])

# Add DNN layers, and create Model.
output_layer = tf.keras.layers.Dense(1)(input_layer)

model = tf.keras.models.Model(inputs=[query_input, value_input], outputs = output_layer)
model.compile(optimizer='adam', loss='binary_crossentropy')

model.summary()

【讨论】:

  • 谢谢,但我想在模型中添加一个 LSTM 层。我尝试在输入层cells = [tf.keras.layers.LSTMCell(256), tf.keras.layers.LSTMCell(64)] rnn = tf.keras.layers.RNN(cells)(input_layer)之后添加LSTM层,但出现错误TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2019-10-12
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多