Flask部署NLP项目遇TypeError:str与int无法执行<=比较
问题分析
错误核心是**vocabSize变量类型不匹配**:Embedding层初始化时,input_dim参数(即传入的vocabSize)为字符串类型,无法和整数0做大小比较,触发TypeError。
解决步骤
1. 修正全局变量声明
processing()函数中计算的vocabSize、embedding_matrix等变量是局部变量,未被全局共享,导致build_model()无法获取到正确的数值。需要在processing()开头补充全局变量声明:
@app.route("/preprocessing") def processing(): # 新增需要全局共享的变量声明 global df,cv,x_train,x_test,y_train,y_test, vocabSize, embedding_matrix, tokenizer # 原有预处理代码保持不变...
2. 确保vocabSize为整数类型
显式将vocabSize转换为整数(避免潜在的类型隐式转换问题):
vocabSize = int(len(tokenizer.index_word) + 1)
3. 修正build_model()的参数依赖
input_length直接使用预处理时固定的48(和pad_sequences的maxlen保持一致,避免依赖x_train的长度)- 确保
embedding_matrix已通过全局变量传递:
def build_model(): model = Sequential() # 替换input_length为固定值48,与预处理逻辑对齐 model.add(Embedding(vocabSize, 200, input_length=48, weights=[embedding_matrix], trainable=False)) model.add(LSTM(256, dropout=0.2,recurrent_dropout=0.2, return_sequences=True)) model.add(LSTM(128, dropout=0.2,recurrent_dropout=0.2)) model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model
4. 严格遵循执行顺序
必须先访问/preprocessing接口完成数据预处理,确保所有全局变量被正确赋值后,再访问/train接口。直接访问/train会因变量未初始化触发新错误。
额外优化建议
- 减少全局变量使用:可以用Flask的
g对象或自定义类存储预处理结果,比全局变量更安全 - 增加错误捕获:在
train()中添加异常处理,返回可读的错误信息:
@app.route("/train") def train(): global model,x_train,y_train,x_test,y_test try: model=build_model() model.fit(x_train, y_train, validation_data=(x_test, y_test), verbose=1, batch_size=64, epochs=10) data = {'page':'train page','message':'ok'} return jsonify(data) except Exception as e: return jsonify({'page':'train page','message':str(e)}), 500
内容的提问来源于stack exchange,提问作者Ahmed Adel
相关产品推荐
相关产品推荐

