1

我正在使用 Keras 的 Lambda 层和 TensorFlow Hub 从预构建的嵌入器中下载词嵌入。

import tensorflow_hub as hub
from tensorflow.dtypes import as_string
def embedding(x):
    print(x.shape)
    module = hub.Module("https://tfhub.dev/google/nnlm-en-dim128/1")
    return module(x)
answers_network_rnn = Sequential()
print(trainingData["question"].shape)
answers_network_rnn.add(Lambda(embedding,output_shape=(128,)))
answers_network_rnn.add(Dense(16))
answers_network_rnn.add(Dense(Y_2_train_num.shape[1]))
answers_network_rnn.summary()
answers_network_rnn.compile("adam","categorical_crossentropy",metrics=['accuracy',f1]) answers_network_rnn_checkpoint = ModelCheckpoint('answers_network-rnn-best.h5', verbose=1, monitor='val_f1',save_best_only=True, mode='auto') answers_network_rnn.fit(x=X_2_train_text.values,y=Y_2_train_num) 

我希望 Keras 能够为我的输入中的每个单词构建一个包含 128 个单词嵌入列表的模型。实际上,Lambda 层在“嵌入”函数上运行时会导致以下错误。

“ValueError:张量转换为 dtype float32 的张量请求 dtype 字符串:'Tensor("sequential_5_input:0", shape=(?, 2), dtype=float32)'”

根据 GitHub 问题 ( https://github.com/keras-team/keras/issues/10021 ) 上的用户 nuric,此问题是由 Keras 试图推断输出形状引起的。如您所见,我试图通过指定所需的输出形状来解决此问题。

这是神经网络的输入和期望输出:

输入

[['to whom did the virgin mary allegedly appear in 1858 in lourdes france?'
  'architecturally, the school has a catholic character. atop the main building\'s gold dome is a golden statue of the virgin mary. immediately in front of the main building and facing it, is a copper statue of christ with arms upraised with the legend "venite ad me omnes". next to the main building is the basilica of the sacred heart. immediately behind the basilica is the grotto, a marian place of prayer and reflection. it is a replica of the grotto at lourdes, france where the virgin mary reputedly appeared to saint bernadette soubirous in 1858. at the end of the main drive (and in a direct line that connects through 3 statues and the gold dome), is a simple, modern stone statue of mary.']
 ['what is in front of the notre dame main building?'
  'architecturally, the school has a catholic character. atop the main building\'s gold dome is a golden statue of the virgin mary. immediately in front of the main building and facing it, is a copper statue of christ with arms upraised with the legend "venite ad me omnes". next to the main building is the basilica of the sacred heart. immediately behind the basilica is the grotto, a marian place of prayer and reflection. it is a replica of the grotto at lourdes, france where the virgin mary reputedly appeared to saint bernadette soubirous in 1858. at the end of the main drive (and in a direct line that connects through 3 statues and the gold dome), is a simple, modern stone statue of mary.']
 ['the basilica of the sacred heart at notre dame is beside to which structure?'
  'architecturally, the school has a catholic character. atop the main building\'s gold dome is a golden statue of the virgin mary. immediately in front of the main building and facing it, is a copper statue of christ with arms upraised with the legend "venite ad me omnes". next to the main building is the basilica of the sacred heart. immediately behind the basilica is the grotto, a marian place of prayer and reflection. it is a replica of the grotto at lourdes, france where the virgin mary reputedly appeared to saint bernadette soubirous in 1858. at the end of the main drive (and in a direct line that connects through 3 statues and the gold dome), is a simple, modern stone statue of mary.']

期望的输出:

[[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [1. 0. 0. ... 0. 0. 0.]]
4

1 回答 1

2

我刚刚尝试过,当我删除“input_shape = [None]”时它对我有用。所以这段代码应该可以工作:

import tensorflow_hub as hub
from tensorflow.dtypes import as_string
def embedding(x):
    print(x.shape)
    module = hub.Module("https://tfhub.dev/google/nnlm-en-dim128/1")
    return module(x)
answers_network_rnn = Sequential()
print(trainingData["question"].shape)
from keras.layers import InputLayer
answers_network_rnn.add(Lambda(embedding,output_shape=(128,)))
answers_network_rnn.add(Dense(16))
answers_network_rnn.add(Dense(Y_2_train_num.shape[1]))
answers_network_rnn.summary()

编辑

这个 keras 模型应该等于 SequentialModel(显式输入层除外):

input_text = tf.keras.layers.Input(shape=(1,), dtype=tf.string)
embedding_layer = tf.keras.layers.Lambda(embedding,output_shape=(128,))(input_text)
dense = tf.keras.layers.Dense(16)(embedding_layer)
outputs = tf.keras.layers.Dense(Y_2_train_num.shape[1])(dense)

answers_network_rnn = tf.keras.Model(inputs=[input_text], outputs=outputs)
answers_network_rnn.compile(...)

运行这个对我有用......

with tf.Session() as session:
  session.run([tf.global_variables_initializer(), tf.tables_initializer()])
  answers_network_rnn.fit(...)

...在 lambda 函数中更改此内容后:

#return module(x)
return module(tf.squeeze(tf.cast(x, tf.string)),signature="default", as_dict=True)["default"]
于 2019-04-05T07:59:38.017 回答