DSX部署单多项式线性回归至WML服务POST请求遇维度错误
解决WML服务部署后线性回归预测的维度不匹配问题
我之前也碰到过一模一样的坑!这个报错的核心原因其实很清晰:你用的线性回归模型(大概率是scikit-learn的实现)要求输入必须是二维数组,本地笔记本测试时的“容错”让你没注意到这点,但部署成WML Web服务后,服务端的输入解析更严格,直接触发了维度校验。
为什么本地没问题,部署后就报错?
- 在DSX笔记本里测试时,如果你写类似
model.predict([5])或者model.predict(np.array([5])),scikit-learn会针对单变量模型自动做维度兼容,悄悄把一维数组转成二维(形状从(1,)变成(1,1)),所以不会报错。 - 但部署到WML服务后,请求里的输入数据会被直接传给模型的
predict方法,如果你发送的是一维格式(比如{"input_data": [{"values": [5]}]}),模型就会抛出Expected 2D array, got 1D array instead的错误——因为它期望的输入形状是(样本数, 特征数),这里特征数是1,每个样本都得是一个长度为1的数组。
两种快速解决方法
1. 调整POST请求的输入格式
把每个输入值包裹在一个子数组里,让整体变成二维结构。比如:
错误格式:
{"input_data": [{"values": [5, 6, 7]}]}
正确格式:
{"input_data": [{"values": [[5], [6], [7]]}]}
这样输入的形状就是(3,1),完美匹配模型的要求。
2. 在模型部署代码里添加维度转换逻辑
如果你不想每次请求都改格式,可以在预测函数里强制把输入转成二维数组。比如在部署前的模型封装代码里加上:
import numpy as np def predict(input_data): # 提取输入值并转换为二维数组,-1表示自动计算样本数 X = np.array(input_data["input_data"][0]["values"]).reshape(-1, 1) # 执行预测并转成列表返回 predictions = model.predict(X).tolist() return {"predictions": [{"values": predictions}]}
这样不管请求传的是一维还是二维数据,都会被转换成正确的形状,彻底避免维度报错。
本地验证小技巧
你可以在笔记本里模拟服务端的严格场景,比如直接传一维数组:
import numpy as np model.predict(np.array([5])) # 这时候应该会触发同样的报错 # 转换后就正常了 model.predict(np.array([5]).reshape(-1,1))
这和你部署后调整维度解决问题的思路完全一致,能帮你快速验证方案是否有效。
内容的提问来源于stack exchange,提问作者user3540644
相关产品推荐
相关产品推荐

