张量转换请求 dtype string for Tensor with dtype float32 (lambda input)

Tensor conversion requested dtype string for Tensor with dtype float32 (lambda input)

我正在使用 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 层在 "embedding" 函数上运行时会导致以下错误。

"ValueError: Tensor conversion requested dtype string for Tensor with dtype float32: '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.]]

我刚刚试了一下,当我删除 "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"]