张量转换请求的 dtype 字符串用于具有 dtype float32(lambda 输入)

我正在使用 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: Tensor 转换请求的 dtype 字符串为具有 dtype float32 的 Tensor: 'Tensor("sequential_5_input:0", shape=(?, 2), dtype=float32)'”


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


期望的输出:


[[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.]]


临摹微笑
浏览 195回答 1
1回答

子衿沉夜

我刚刚尝试了一下,当我删除“input_shape = [None]”时,它对我有用。所以这段代码应该可以工作:import tensorflow_hub as hubfrom tensorflow.dtypes import as_stringdef 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 InputLayeranswers_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"]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python