使用ELMo预训练嵌入搭建LSTM时Reshape层shape转张量失败如何解决
错误原因
tf.keras.layers.Reshape的target_shape参数不允许传入None,该参数需要明确指定除批量维度之外的所有维度尺寸,如果某一维度需要自动推导,要使用-1代替None,你传入的None无法被转换为合法张量,直接触发报错。- ELMo预训练层的默认输出维度为
(批量大小, 序列长度, 1024),本身就符合LSTM层要求的三维输入格式,不需要额外做Reshape新增维度,你写的(None, 1024, 1)会生成四维张量,反而不符合LSTM的输入要求。 - 存在变量名不匹配问题:你定义的输入层变量名为
text_in、输出层变量名为text_out,但实例化Model时传入了不存在的input_layer和output_layer,后续运行也会触发变量未定义报错。 - 输入层定义不合理:
Input(shape = ())是标量输入,无法承载文本序列数据,需要根据你的数据集设置固定的最大序列长度。
修正后的参考代码
import tensorflow as tf import tensorflow_hub as hub epochs = 50 n_units = 512 max_sequence_len = 50 # 替换为你数据集的实际最大序列长度 total_words = 10000 # 替换为你的实际词表大小 # 定义输入层 text_in = tf.keras.Input(shape=(max_sequence_len,), dtype=tf.string) # 加载ELMo层输出序列嵌入 embedding_layer = hub.KerasLayer("https://tfhub.dev/google/elmo/3", output_signature=tf.TensorSpec(shape=(None, max_sequence_len, 1024)))(text_in) # 直接传入LSTM,无需Reshape x = tf.keras.layers.LSTM(n_units)(embedding_layer) x = tf.keras.layers.Dropout(0.2)(x) text_out = tf.keras.layers.Dense(total_words, activation = 'softmax')(x) model = tf.keras.Model(inputs=[text_in], outputs=text_out, name="LSTM with ELMo Embeddings") model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
内容的提问来源于stack exchange,提问作者savvysavage32
相关产品推荐
相关产品推荐

