为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

临摹微笑 2021-12-29 19:50:40
我正在使用 Keras 的 Lambda 层和 TensorFlow Hub 从预构建的嵌入器下载词嵌入。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)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.]]
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

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



查看完整回答
反对 回复 2021-12-29
  • 1 回答
  • 0 关注
  • 194 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信