Python Higgs玻色子Kaggle上带有Keras DNN的Web服务器中的Numpy阵列形状问题
我正在使用创建一个Python web服务器,以便提供在Kaggle-higgs玻色子数据集上训练的Keras神经网络的结果。我在服务器的日志中看到:Python Higgs玻色子Kaggle上带有Keras DNN的Web服务器中的Numpy阵列形状问题,python,numpy,tensorflow,keras,Python,Numpy,Tensorflow,Keras,我正在使用创建一个Python web服务器,以便提供在Kaggle-higgs玻色子数据集上训练的Keras神经网络的结果。我在服务器的日志中看到: # print(data) [ 0.86929321 -0.63508183 0.22569026 0.32747006 -0.6899932 0.75420225 -0.24857314 -1.0920639 0. 1.37499213 -0.65367419 0.93034911 1.10743606
# print(data)
[ 0.86929321 -0.63508183 0.22569026 0.32747006 -0.6899932 0.75420225
-0.24857314 -1.0920639 0. 1.37499213 -0.65367419 0.93034911
1.10743606 1.13890433 -1.57819831 -1.04698539 0. 0.65792954
-0.01045457 -0.04576717 3.10196137 1.35376 0.97956312 0.97807616
0.92000484 0.72165745 0.98875093 0.87667835]
# print(data.shape)
(28,)
# The exception:
output = model.predict(data)
File "/Users/david/PycharmProjects/server/lib/python3.6/site-packages/keras/engine/training.py", line 1817, in predict
check_batch_axis=False)
File "/Users/david/PycharmProjects/server/lib/python3.6/site-packages/keras/engine/training.py", line 123, in _standardize_input_data
str(data_shape))
ValueError: Error when checking : expected input_1
to have shape (28,) but got array with shape (1,)
我还编写了一个独立脚本,它产生了相同的异常:
model = load_model('models/keras-higgs.h5')
test_data = np.array([0.86929321, -0.63508183, 0.22569026, 0.32747006, -0.6899932, 0.75420225,
-0.24857314, -1.0920639, 0., 1.37499213, -0.65367419, 0.93034911,
1.10743606, 1.13890433, -1.57819831, -1.04698539, 0., 0.65792954,
-0.01045457, -0.04576717, 3.10196137, 1.35376, 0.97956312, 0.97807616,
0.92000484, 0.72165745, 0.98875093, 0.87667835])
print(test_data.shape) # (28, )
result = model.predict(test_data) # ValueError
print(result)
神经网络的结构如下:
from keras.models import Model
from keras.layers import Input, Dense
input_layer = Input(shape=(28, ))
hidden_layer_1 = Dense(24, activation='sigmoid')(input_layer)
hidden_layer_2 = Dense(20, activation='sigmoid')(hidden_layer_1)
hidden_layer_3 = Dense(16, activation='sigmoid')(hidden_layer_2)
hidden_layer_4 = Dense(12, activation='sigmoid')(hidden_layer_3)
output_layer = Dense(2, activation='softmax')(hidden_layer_4)
model = Model(input_layer, output_layer)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(measurements, labels, epochs=500, batch_size=256)
model.save('../models/keras-higgs.h5')
import numpy as np
from japronto import Application
from json import JSONDecodeError
from keras.models import load_model
model = load_model('models/keras-higgs.h5')
def higgs(request):
try:
data = np.array(request.json)
print(data)
print(data.shape)
output = model.predict(data)
except JSONDecodeError:
return request.Response(code=400)
return request.Response(json=output)
app = Application()
app.router.add_route('/higgs', higgs, 'POST')
app.run(debug=True)
Japronto服务器的定义如下:
from keras.models import Model
from keras.layers import Input, Dense
input_layer = Input(shape=(28, ))
hidden_layer_1 = Dense(24, activation='sigmoid')(input_layer)
hidden_layer_2 = Dense(20, activation='sigmoid')(hidden_layer_1)
hidden_layer_3 = Dense(16, activation='sigmoid')(hidden_layer_2)
hidden_layer_4 = Dense(12, activation='sigmoid')(hidden_layer_3)
output_layer = Dense(2, activation='softmax')(hidden_layer_4)
model = Model(input_layer, output_layer)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(measurements, labels, epochs=500, batch_size=256)
model.save('../models/keras-higgs.h5')
import numpy as np
from japronto import Application
from json import JSONDecodeError
from keras.models import load_model
model = load_model('models/keras-higgs.h5')
def higgs(request):
try:
data = np.array(request.json)
print(data)
print(data.shape)
output = model.predict(data)
except JSONDecodeError:
return request.Response(code=400)
return request.Response(json=output)
app = Application()
app.router.add_route('/higgs', higgs, 'POST')
app.run(debug=True)
ValueError
很奇怪,因为日志中的shape=(28,)
。我做错了什么?我该如何解决 看这张照片,你好像有一个小数组;形状(28,)可能具有误导性
只需执行
data=data。重塑((1,28))
即可将输入重塑为具有所需形状的正确nd数组。谢谢,Cihan,我尝试了data=data。重塑((28,1))打印(data.shape)
以打印(28,1)
。但我仍然得到ValueError:Error当检查时:期望输入1具有形状(28),但得到了具有形状(1)的数组。
@mobiusinversion实际上它看起来像keras期望(m\u序列,n\u特征)形状输入。你能试试data=data.Reformate((1,28))吗?Hye Cihan,我刚刚登录发布更新,我查看了training.py:1815
,看到x=\u standarized\u input\u data(x,self.\u feed\u input\u name,self.\u feed\u input\u shapes,check\u batch\u axis=False)
。所以,是的,这是有效的,我改变了:data=data.reformate((1,28))
。你想编辑答案,我可以接受吗?