PyTorch与TensorFlow混用引发torch.where()参数类型错误求助
问题分析与解决方案
错误原因
- 框架混用导致张量类型不兼容:你用TensorFlow/Keras构建神经网络,却错误使用了PyTorch的
torch.where、torch.ones、torch.zeros函数。TensorFlow张量与PyTorch张量属于不同框架的对象,无法在TensorFlow计算图中直接混用,这是触发TypeError的核心原因。 - 变量未定义:代码中
indicator_probability = dense2(dropout(dense1(outputs)))里的outputs变量未定义,需替换为输入张量all_inputs。
修复后的代码
方案1:将二值化嵌入模型计算图(适配禁用eager模式)
因为你禁用了eager execution,需把二值化操作封装到Lambda层中,才能嵌入Keras模型的计算图:
import tensorflow as tf import numpy as np import pandas as pd tf.get_logger().setLevel('ERROR') from tensorflow.python.keras import layers, Model, callbacks, Sequential from tensorflow.python.keras.callbacks import EarlyStopping from tensorflow.python.keras.layers import GRU, LSTM, Layer, LayerNormalization, Input, Conv1D, Embedding, Flatten, RepeatVector, GlobalAveragePooling1D, Masking, concatenate, TimeDistributed, Dense, Dropout from tensorflow.python.keras.layers.core import Lambda from tensorflow.python.keras import optimizers from tensorflow.python.keras.optimizers import SGD, Adam, rmsprop from tensorflow.python.keras.losses import categorical_crossentropy from tensorflow.python.keras.models import load_model from tensorflow.python.keras.initializers import Constant tf.compat.v1.disable_eager_execution() import tensorflow.compat.v1 as tf tf.disable_v2_behavior() print('Tensorflow version: {}'.format(tf.__version__)) def create_model(n_inputs): all_inputs = Input(shape=(n_inputs, 2), name="all_inputs") dense1 = TimeDistributed(Dense(32, activation='relu')) dropout = TimeDistributed(Dropout(0.2)) dense2 = TimeDistributed(Dense(1, activation='sigmoid')) # 修复未定义的outputs变量,替换为all_inputs indicator_probability = dense2(dropout(dense1(all_inputs))) # 用TensorFlow原生API实现二值化,封装到Lambda层 def binarize(x): # 自动匹配输入张量形状,避免手动指定维度 return tf.where(x > 0.5, tf.ones_like(x), tf.zeros_like(x)) indicator_output = Lambda(binarize)(indicator_probability) model = Model(inputs=all_inputs, outputs=indicator_output) return model prediction_model = create_model(n_inputs=11) prediction_model.compile(optimizer='adam')
方案2:预测后再做二值化(更简洁)
如果不需要把二值化嵌入模型计算图,可在预测完成后处理结果:
# 简化模型定义,去掉二值化部分 def create_model(n_inputs): all_inputs = Input(shape=(n_inputs, 2), name="all_inputs") dense1 = TimeDistributed(Dense(32, activation='relu')) dropout = TimeDistributed(Dropout(0.2)) dense2 = TimeDistributed(Dense(1, activation='sigmoid')) indicator_probability = dense2(dropout(dense1(all_inputs))) model = Model(inputs=all_inputs, outputs=indicator_probability) return model prediction_model = create_model(n_inputs=11) prediction_model.compile(optimizer='adam') # 预测时执行二值化 # 假设test_data为你的输入数据 predictions = prediction_model.predict(test_data) binary_predictions = (predictions > 0.5).astype(int)
关键说明
- 同一模型内统一使用单个框架的API,避免TensorFlow与PyTorch张量操作混用。
- 在TensorFlow计算图模式下,自定义操作需封装到Lambda层或自定义Layer中,才能被Keras模型识别。
tf.ones_like/tf.zeros_like可自动匹配输入张量形状,比手动指定维度更灵活,避免维度不匹配问题。
内容的提问来源于stack exchange,提问作者Theresa Liu
相关产品推荐
相关产品推荐

