基于预训练ELMO的情感分析模型调用model.fit()报outer_context属性错误
问题
使用预训练ELMO模型构建基础情感分析模型时,执行model.fit()抛出AttributeError: 'NoneType' object has no attribute 'outer_context'错误,已将输入文本转为numpy数组。
相关代码
本地加载ELMO:
elmo_path = r"C:\Users\name\Downloads\elmo" elmo_module = hub.KerasLayer(elmo_path)
模型定义:
input_text = keras.layers.Input(shape=(), dtype=tf.string) embeddings = elmo_module(input_text) dense = keras.layers.Dense(256, activation="relu")(embeddings) predictions = keras.layers.Dense(1, activation="sigmoid")(dense) model = keras.Model(inputs=[input_text], outputs=predictions)
数据转换:
X_train_lemmatized = np.asarray(X_train_lemmatized)
模型编译与训练:
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"]) model.fit(X_train_lemmatized, y_train, epochs=1, batch_size=64)
完整错误信息
File "C:\Users\name\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\engine\training.py", line 1160, in train_function * return step_function(self, iterator) File "C:\Users\name\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\engine\training.py", line 1146, in step_function ** outputs = model.distribute_strategy.run(run_step, args=(data,)) File "C:\Users\name\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\engine\training.py", line 1135, in run_step ** outputs = model.train_step(data) File "C:\Users\name\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\engine\training.py", line 997, in train_step self.optimizer.minimize(loss, self.trainable_variables, tape=tape) File "C:\Users\name\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\optimizers\optimizer_v2\optimizer_v2.py", line 576, in minimize grads_and_vars = self._compute_gradients( File "C:\Users\name\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\optimizers\optimizer_v2\optimizer_v2.py", line 634, in _compute_gradients grads_and_vars = self._get_gradients( File "C:\Users\name\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\keras\optimizers\optimizer_v2\optimizer_v2.py", line 510, in _get_gradients grads = tape.gradient(loss, var_list, grad_loss) AttributeError: 'NoneType' object has no attribute 'outer_context'
解决方案
1. 匹配TensorFlow与Hub版本兼容性
该错误多因TensorFlow和TensorFlow Hub版本不匹配导致,尤其是ELMO这类较早的预训练模型。建议:
- 降级至兼容性较好的版本组合:
pip install tensorflow==2.10.0 tensorflow-hub==0.12.0
2. 明确ELMO层的输出配置
本地加载ELMO时,指定输出形状与输入类型,避免梯度跟踪异常:
import tensorflow as tf import tensorflow_hub as hub from tensorflow import keras elmo_path = r"C:\Users\name\Downloads\elmo" elmo_module = hub.KerasLayer(elmo_path, output_shape=(1024,), input_shape=(), dtype=tf.string)
3. 使用TensorFlow Dataset输入数据
将numpy数组转为tf.data.Dataset格式,规避训练时的数据格式冲突:
train_dataset = tf.data.Dataset.from_tensor_slices((X_train_lemmatized, y_train)) train_dataset = train_dataset.batch(64).prefetch(tf.data.AUTOTUNE) model.fit(train_dataset, epochs=1)
4. 自定义训练循环处理梯度
若上述方法无效,可手动编写训练循环控制梯度流程:
@tf.function def train_step(x, y): with tf.GradientTape() as tape: predictions = model(x, training=True) loss = model.compiled_loss(y, predictions) gradients = tape.gradient(loss, model.trainable_variables) model.optimizer.apply_gradients(zip(gradients, model.trainable_variables)) model.compiled_metrics.update_state(y, predictions) return {m.name: m.result() for m in model.metrics} # 执行训练循环 for epoch in range(1): print(f"Epoch {epoch+1}") for x_batch, y_batch in train_dataset: metrics = train_step(x_batch, y_batch) print({k: v.numpy() for k, v in metrics.items()})
内容的提问来源于stack exchange,提问作者1m2n3
相关产品推荐
相关产品推荐

