ValueError: Tensor Tensor("dense_2/Softmax:0", shape=(?, 8), dtype=float32) is not an element of thi

本文探讨在Django中整合Keras模型时遇到的问题,即模型加载与预测过程分离导致的错误,并提供了解决方案。通过在模型加载后立即执行一次预测操作,可以避免后续使用过程中出现的问题。

Django整合Keras报

在正常的 python 程序里运行没有问题,在 django 里将模型加载与模型使用的代码放在一起也没有问题,但是一旦将加载与使用的过程分开就会出现这个问题

解决方法

在初始化加载模型之后,就随便生成一个向量让 model 执行一次 predict 函数,之后再使用就不会有问题了

我自己的代码:

saved_model_weights_file_path = os.path.join(MODEL_FOLDER, 'east_model_weights_3T736.h5')
east = East()
east_detect = east.east_network()
east_detect.load_weights(saved_model_weights_file_path)
East_detect_exe = east_detect
first_line = predict(East_detect_exe, 'image_process/test.jpg', 0.9)
print('first_line^^^^^^^^^^^^^^^^^^',first_line)
# 加载模型,django 会在 web 应用初始化时执行这段代码
from keras.models import load_model
print 'load model...'
model_COC = load_model(sys.path[0] + '/resource/cate_class_model.h5')
model_COE = load_model(sys.path[0] + '/resource/emo_class_model.h5')
print 'load done.'
# load 进来模型紧接着就执行一次 predict 函数
print 'test model...'
print model_COC.predict(np.zeros((1, len(word_index)+1)))
print model_COE.predict(np.zeros((1, len(word_index)+1)))
print 'test done.'

# 使用模型,在得到用户输入时会调用以下两个函数进行实时文本分类
# 输入参数 comment 为经过了分词与向量化处理后的模型输入
def category_class(comment):
    global model_COC
    result_vec = model_COC.predict(comment)
    return result_vec


def emotion_class(comment):
    global model_COE
    result_vec = model_COE.predict(comment)
    return result_vec
import tensorflow as tf import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, LSTM, Dense, Attention, Concatenate # 数据预处理函数 def preprocess_data(file_path, sequence_length=10): """读取并预处理双色球历史数据""" df = pd.read_csv(file_path ,encoding ="gbk") # 确保数据排序正确 df.sort_values('期号', inplace=True) # 提取红球和蓝球数据 red_balls = df[['红1', '红2', '红3', '红4', '红5', '红6']].values blue_ball = df['蓝球'].values.reshape(-1, 1) # 归一化处理 scaler_red = MinMaxScaler() scaler_blue = MinMaxScaler() red_scaled = scaler_red.fit_transform(red_balls) blue_scaled = scaler_blue.fit_transform(blue_ball) # 创建序列数据 X_red, X_blue, y = [], [], [] for i in range(len(red_scaled) - sequence_length): X_red.append(red_scaled[i:i+sequence_length]) X_blue.append(blue_scaled[i:i+sequence_length]) y.append(red_scaled[i+sequence_length]) # 预测下一期红球 return np.array(X_red), np.array(X_blue), np.array(y), scaler_red, scaler_blue # Genie 2世界模型架构 def build_genie2_model(red_seq_length, blue_seq_length, red_features, blue_features): """构建Genie 2世界模型""" # 红球输入分支 red_input = Input(shape=(red_seq_length, red_features)) red_lstm = LSTM(64, return_sequences=True)(red_input) red_lstm2 = LSTM(32)(red_lstm) # 蓝球输入分支 blue_input = Input(shape=(blue_seq_length, blue_features)) blue_lstm = LSTM(32)(blue_input) # 注意力机制融合 attention = Attention()([red_lstm2, blue_lstm]) combined = Concatenate()([red_lstm2, blue_lstm, attention]) # 世界模型核心 world_model = Dense(128, activation='relu')(combined) world_model = Dense(64, activation='relu')(world_model) # 输出层 - 预测6个红球 output = Dense(red_features, activation='sigmoid')(world_model) model = Model(inputs=[red_input, blue_input], outputs=output) model.compile(optimizer='adam', loss='mse') return model # 主执行流程 def main(): # 1. 数据准备 FILE_PATH = "D:\\worker\\lottery_results8.csv" X_red, X_blue, y, scaler_red, scaler_blue = preprocess_data(FILE_PATH, sequence_length=10) # 2. 构建模型 model = build_genie2_model( red_seq_length=X_red.shape[1], blue_seq_length=X_blue.shape[1], red_features=X_red.shape[2], blue_features=X_blue.shape[2] ) # 3. 训练模型 model.fit([X_red, X_blue], y, epochs=100, batch_size=32, validation_split=0.2) # 4. 预测最新一期 last_red = X_red[-1].reshape(1, X_red.shape[1], X_red.shape[2]) last_blue = X_blue[-1].reshape(1, X_blue.shape[1], X_blue.shape[2]) predicted_red = model.predict([last_red, last_blue]) # 5. 反归一化并输出预测结果 predicted_red_actual = scaler_red.inverse_transform(predicted_red) predicted_red_actual = np.round(predicted_red_actual).astype(int) # 蓝球预测简化版(实际应用中可扩展) blue_prediction = np.random.randint(1, 17) # 随机预测作为演示 print("\n预测结果:") print(f"红球: {predicted_red_actual[0]}") print(f"蓝球: {blue_prediction}") if __name__ == "__main__": main() ValueError: Exception encountered when calling Attention.call(). Dimension must be 2 but is 3 for '{{node functional_1/attention_1/transpose}} = Transpose[T=DT_FLOAT, Tperm=DT_INT32](functional_1/lstm_2_1/strided_slice_3, functional_1/attention_1/transpose/perm)' with input shapes: [?,32], [3]. Arguments received by Attention.call(): • inputs=['tf.Tensor(shape=(None, 32), dtype=float32)', 'tf.Tensor(shape=(None, 32), dtype=float32)'] • mask=['None', 'None'] • training=True • return_attention_scores=False • use_causal_mask=False 完善相关代码
最新发布
08-28
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) /tmp/ipykernel_424986/1460261549.py in <module> 52 # 训练主循环 53 for epoch in range(epochs): ---> 54 total_loss, evm_loss, spacing_loss = train_step() 55 56 # 温度衰减(后期接近硬采样) ~/miniconda3/lib/python3.8/site-packages/tensorflow/python/util/traceback_utils.py in error_handler(*args, **kwargs) 151 except Exception as e: 152 filtered_tb = _process_traceback_frames(e.__traceback__) --> 153 raise e.with_traceback(filtered_tb) from None 154 finally: 155 del filtered_tb /tmp/__autograph_generated_filekm9_7z0u.py in tf__train_step() 10 retval_ = ag__.UndefinedReturnValue() 11 with ag__.ld(tf).GradientTape() as tape: ---> 12 logits = ag__.converted_call(ag__.ld(encoder), (ag__.converted_call(ag__.ld(tf).expand_dims, (ag__.ld(snr_tf), (- 1)), None, fscope),), None, fscope) 13 (bits, _) = ag__.converted_call(ag__.ld(gumbel_softmax_sampler_tf), (ag__.ld(logits), ag__.ld(n), ag__.ld(bit_sym), ag__.ld(temp)), None, fscope) 14 x = ag__.converted_call(ag__.ld(trans_model), (ag__.ld(bits),), None, fscope) ~/miniconda3/lib/python3.8/site-packages/keras/utils/traceback_utils.py in error_handler(*args, **kwargs) 68 # To get the full stack trace, call: 69 # `tf.debugging.disable_traceback_filtering()` ---> 70 raise e.with_traceback(filtered_tb) from None 71 finally: 72 del filtered_tb /tmp/__autograph_generated_filevxxd8fu5.py in tf__call(self, snr) 9 do_return = False 10 retval_ = ag__.UndefinedReturnValue() ---> 11 x = ag__.converted_call(ag__.ld(self).dense1, (ag__.ld(snr),), None, fscope) 12 x = ag__.converted_call(ag__.ld(self).relu, (ag__.ld(x),), None, fscope) 13 try: ValueError: in user code: File "/tmp/ipykernel_424986/1460261549.py", line 20, in train_step * logits = encoder(tf.expand_dims(snr_tf, -1)) # [M] File "/root/miniconda3/lib/python3.8/site-packages/keras/utils/traceback_utils.py", line 70, in error_handler ** raise e.with_traceback(filtered_tb) from None File "/tmp/__autograph_generated_filevxxd8fu5.py", line 11, in tf__call x = ag__.converted_call(ag__.ld(self).dense1, (ag__.ld(snr),), None, fscope) ValueError: Exception encountered when calling layer 'encoder' (type Encoder). in user code: File "/tmp/ipykernel_424986/3358851902.py", line 16, in call * x = self.dense1(snr) File "/root/miniconda3/lib/python3.8/site-packages/keras/utils/traceback_utils.py", line 70, in error_handler ** raise e.with_traceback(filtered_tb) from None File "/root/miniconda3/lib/python3.8/site-packages/keras/engine/input_spec.py", line 250, in assert_input_compatibility raise ValueError( ValueError: Input 0 of layer "dense" is incompatible with the layer: expected min_ndim=2, found ndim=1. Full shape received: (1,) Call arguments received by layer 'encoder' (type Encoder): • snr=tf.Tensor(shape=(1,), dtype=float32)
08-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值