web-dev-qa-db-ja.com

予測時のケラスエラー

ケラスニューラルネットワークを使用して、描画された数字のキャンバスイメージを認識し、その数字を出力しようとしています。ニューラルネットワークを保存し、Django=を使用してWebインターフェイスを実行します。しかし、実行すると、内部サーバーエラーとサーバー側コードのエラーが発生します。エラーは例外:チェック時のエラー:密な入力_1には形状(なし、784)があると期待されていましたが、形状(784、1)の配列を取得しました私の唯一のメインビューは

from Django.shortcuts import render
from Django.http import HttpResponse
import StringIO
from PIL import Image
import numpy as np
import re
from keras.models import model_from_json
def home(request):
    if request.method=="POST":
        vari=request.POST.get("imgBase64","")
        imgstr=re.search(r'base64,(.*)', vari).group(1)
        tempimg = StringIO.StringIO(imgstr.decode('base64'))
        im=Image.open(tempimg).convert("L")
        im.thumbnail((28,28), Image.ANTIALIAS)
        img_np= np.asarray(im)
        img_np=img_np.flatten()
        img_np.astype("float32")
        img_np=img_np/255
        json_file = open('model.json', 'r')
        loaded_model_json = json_file.read()
        json_file.close()
        loaded_model = model_from_json(loaded_model_json)
        # load weights into new model
        loaded_model.load_weights("model.h5")
        # evaluate loaded model on test data
        loaded_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
        output=loaded_model.predict(img_np)
        score=output.tolist()
        return HttpResponse(score)
    else:
        return render(request, "digit/index.html")

私がチェックアウトしたリンクは次のとおりです。

編集Rohanの提案に従って、これは私のスタックトレースです

Internal Server Error: /home/
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/Django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/local/lib/python2.7/dist-packages/Django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/vivek/keras/neural/digit/views.py", line 27, in home
output=loaded_model.predict(img_np)
  File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 671, in predict
return self.model.predict(x, batch_size=batch_size, verbose=verbose)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1161, in predict
check_batch_dim=False)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 108, in standardize_input_data
str(array.shape))
Exception: Error when checking : expected dense_input_1 to have shape (None, 784) but got array with shape (784, 1)

また、私は最初にネットワークのトレーニングに使用したモデルを持っています。

import numpy
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.utils import np_utils
# fix random seed for reproducibility
seed = 7
numpy.random.seed(seed)
(X_train, y_train), (X_test, y_test) = mnist.load_data()
for item in y_train.shape:
    print item
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
# normalize inputs from 0-255 to 0-1
X_train = X_train / 255
X_test = X_test / 255
print X_train.shape
# one hot encode outputs
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
num_classes = y_test.shape[1]
# define baseline model
def baseline_model():
    # create model
    model = Sequential()
    model.add(Dense(num_pixels, input_dim=num_pixels, init='normal', activation='relu'))
    model.add(Dense(num_classes, init='normal', activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model
# build the model
model = baseline_model()
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), nb_Epoch=20, batch_size=200, verbose=1)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Baseline Error: %.2f%%" % (100-scores[1]*100))
# serialize model to JSON
model_json = model.to_json()
with open("model.json", "w") as json_file:
    json_file.write(model_json)
# serialize weights to HDF5
model.save_weights("model.h5")
print("Saved model to disk")

Editimgを(1,784)に再形成しようとしましたが、失敗しました。この質問のタイトルと同じエラーが発生しました

助けてくれてありがとう、そして私が質問にどう追加すべきかについてコメントを残してください。

12
Superman

ニューラルネットワークに、784入力の単一ケースではなく、それぞれ1入力の784ケースを評価するように依頼しています。私は同じ問題を抱えていて、入力の配列である単一の要素を持つ配列を持つことで解決しました。次の例を参照してください。最初の例は機能しますが、2番目の例では同じエラーが発生します。

model.predict(np.array([[0.5, 0.0, 0.1, 0.0, 0.0, 0.4, 0.0, 0.0, 0.1, 0.0, 0.0]]))
model.predict(np.array([0.5, 0.0, 0.1, 0.0, 0.0, 0.4, 0.0, 0.0, 0.1, 0.0, 0.0]))

これがあなたのためにもそれを解決することを願っています:)

27
Andrea Bassich