#python #numpy #keras
#python #numpy #keras
Вопрос:
У меня есть простой плотный NN с двумя входными значениями, написанными на Keras, работающий поверх Tensorflow и Python. Я успешно установил эту сеть и могу запускать оценку без ошибок. Однако, когда я хочу предсказать результат для одного образца данных, я получаю ошибку из-за неправильной формы размеров входных данных. Однако, когда я печатаю форму массива numpy, он возвращает правильную форму:
inputArr = np.array((x[sample][0], x[sample][1]))
print(inputArr)
print(inputArr.shape)
prediction = model.predict(inputArr)
Это приводит к следующему результату:
Input data: [-1. -1.]
Array shape: (2,)
За которым следует ошибка:
Traceback (most recent call last):
File ".train3d.py", line 60, in <module>
prediction = model.predict(inputArr)
File "C:UserssvojaAppDataLocalProgramsPythonPython35libsite-packageskerasenginetraining.py", line 1147, in predict
x, _, _ = self._standardize_user_data(x)
File "C:UserssvojaAppDataLocalProgramsPythonPython35libsite-packageskerasenginetraining.py", line 749, in _standardize_user_data
exception_prefix='input')
File "C:UserssvojaAppDataLocalProgramsPythonPython35libsite-packageskerasenginetraining_utils.py", line 137, in standardize_input_data
str(data_shape))
ValueError: Error when checking input: expected dense_1_input to have shape (2,) but got array with shape (1,)
Как вы можете видеть из сообщения об ошибке, сеть ожидала получить массив с размерами (2, ), который в точности совпадает с выводом моего входного массива.
Мой вопрос в том, что именно не так с массивом?
Ответ №1:
Вам не хватает размера пакета, Keras ожидает, что данные будут неявными (N, D)
, где N — размер пакета, а D — количество функций. В вашем случае D=2
но у вас нет матрицы.
Для передачи одной точки данных вам нужна форма (1, 2)
, которая считывает 1 точку данных с 2 объектами. Вы можете достичь этого с помощью:
inputArr = np.array((x[sample][0], x[sample][1]))
print(inputArr) # [-1, -1]
print(inputArr.shape) # (2,)
inputArr = np.expand_dims(inputArr, 0)
print(inputArr.shape) # (1, 2)
Или более короткая версия синтаксического сахара:
inputArr = inputArr[None, :] # (1, 2)
где None
добавляется новое измерение.