Numpy 如何为NN正确重塑图像

Numpy 如何为NN正确重塑图像,numpy,tensorflow,neural-network,python-3.7,cv2,Numpy,Tensorflow,Neural Network,Python 3.7,Cv2,我训练了我的NN模型并使用下一个代码保存它: from tensorflow import keras import tensorflow.keras.layers as layers import cv2 import numpy as np inputs = keras.Input(shape=(784,), name='img') x = layers.Dense(64, activation='relu')(inputs) x = layers.Dense(64, activatio

我训练了我的NN模型并使用下一个代码保存它:

from tensorflow import keras
import tensorflow.keras.layers as layers
import cv2
import numpy as np

inputs = keras.Input(shape=(784,), name='img')

x = layers.Dense(64, activation='relu')(inputs)
x = layers.Dense(64, activation='relu')(x)
outputs = layers.Dense(10, activation='softmax')(x)

model = keras.Model(inputs=inputs, outputs=outputs, name='mnist_model')
# model.summary()

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255
x_test = x_test.reshape(10000, 784).astype('float32') / 255

model.compile(loss='sparse_categorical_crossentropy',
            optimizer=keras.optimizers.RMSprop(),
            metrics=['accuracy'])
history = model.fit(x_train, y_train,
                    batch_size=64,
                    epochs=5,
                    validation_split=0.2)
test_scores = model.evaluate(x_test, y_test, verbose=2)
model.save("myFirstModel.model")
# print('Test loss:', test_scores[0])
# print('Test accuracy:', test_scores[1])
# print("-"*20)
如您所见,训练图像的大小为28x28像素。但是,当我加载经过训练的模型并试图预测从手机上拍摄的自定义图像(
1620x2160
像素)的值时,它会返回一个错误:

model = keras.models.load_model('myFirstModel.model')
model.summary()

img = cv2.imread('C:/Users/Horseman.mini/Desktop/7.jpg', 0) # it is a picture of number 7
# img = cv2.resize(img, (28, 28)) # if I use this - error 1 occures
img = np.resize(img, (-1, 28, 28, 1)) # if I use this - error 2 occures
img_array = np.asarray(img)
Xnew = np.array([img_array])
# make a prediction
ynew = model.predict(Xnew)
result = np.argmax(ynew, axis=1)
print("predicted : ", result)
错误1

ValueError: Input 0 of layer dense is incompatible with the layer: expected axis -1 of input shape to have value 784 but received input with shape [None, 28, 28]
错误2

ValueError: cannot reshape array of size 3498416 into shape (28,28,1)
问题

  • 如何正确重塑图像,使此模型在没有此类错误的情况下工作

  • 我应该如何从大小不同的
    w x h
    图像(而不仅仅是大小为28x28像素的图像)预测数字(在本例中)

  • 编辑1

    尝试将w和h更改为784,现在没有以前的错误,除了一个新错误,下一个错误可能是因为那个错误。但是它返回给我,我的
    7.jpg
    数字是2。我改为
    0.jpg
    (即0),预测结果仍然是2。因此,由于某种原因,输出是错误的

    model = keras.models.load_model('myFirstModel.model')
    model.summary()
    
    img = cv2.imread('C:/Users/Horseman.mini/Desktop/7.jpg', 0)
    img = cv2.resize(img, (784, 784))
    
    img_array = np.asarray(img)
    
    Xnew = np.array([img_array])
    ynew = model.predict(Xnew)
    result = np.argmax(ynew)
    print("predicted : ", result) # always result is 2
    
    输出

    WARNING:tensorflow:Model was constructed with shape (None, 784) for input Tensor("img:0", shape=(None, 784), dtype=float32), but it was called on an input with incompatible shape (None, 784, 784).
    predicted :  2
    

    在您的模型中,您指定了input_shape=784,因此您需要预测的图像也是尺寸为784而不是28 X 28的图像,因此将其调整为784。您的模型是针对尺寸为784像素的图像进行训练的,因此无论原始图像的尺寸如何,您都必须在使用它之前将其重塑为784像素。只是对未来的一句警告。您正在阅读cv2图像,但因为它们是灰度图像,所以没有问题。但是,如果是彩色图像,请记住cv2将图像读取为bgr图像而不是rgb。因此,如果您已经在rgb图像上进行了培训,但阅读了bgr图像进行预测,则不会给出准确的结果。必须使用将图像转换为rgb

    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    

    我最近犯了这个错误,很容易忘记转换图像

    我不清楚应该如何指定它。当I
    cv2.resize(img,(784))
    时,它返回我
    函数正好取2个参数(给定1个)
    <代码>cv2。调整大小(img,(784,)也不起作用。当I
    img=cv2.resize(img,(784,img.shape[0]))
    它说
    警告:tensorflow:模型是用shape(None,784)为输入张量(“img:0”,shape=(None,784),dtype=float32)构造的(“img:0”,shape=(None,784),dtype=float32),但它是在不兼容shape(None,1600,784)的输入上调用的。
    我该怎么做?