Предсказание собственного изображения с предварительно настроенными весами и уклонами не работает правильно - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь импортировать свои собственные изображения в нейронную сеть с нуля с обратным распространением, которое было обучено в базе данных MNIST.

Код:

#X - input image
#W1/W2 - Weights
#b1/b2 - biases

def predict(X, W1, W2, b1, b2):
    Z1 = np.dot(W1, X.T) + b1
    A1 = tanh(Z1)
    Z2 = np.dot(W2, A1) + b2
    A2 = softmax(Z2)
    prediction = np.argmax(A2, axis = 0)
    return prediction
chosen_img = x_test[3]

output = predict(chosen_img, W1, W2, b1, b2)
myImg = chosen_img.reshape((28,28))
print(output)

Где может быть ошибка

Когда я пытаюсь ввести изображение из базы данных MNIST, оно все равно не работает. Например, он может вывести это как output: [7 2 2 7 7 2 2 7 1 2 7 7 2 2 2 7 7 7 7 7 7 7 2 2 7 2 2 2].

Обратите внимание, что я использую такой же код, как в моем полном NN, поэтому прямая связь такая же, предположение такое же, а вес и смещение одинаковы - и это действительно работает в этой полной версии, так что я действительно не понимаю, почему это не может работать сейчас.

Я что-то упустил? Спасибо за любую помощь!

1 Ответ

1 голос
/ 10 февраля 2020

TL; DR: Вы строите полностью подключенную сеть, а не CNN, ваш вход должен быть 1D-тензором формы 28*28 = 784, а ваш выходной тензор должен быть 1D-формой 10.

В соответствии с описанием проблемы вы пытаетесь построить нейронную net для классификации MNIST цифр. Правильно? Таким образом, ваша сеть должна отобразить входные данные формы 28x28 на выходной вектор формы 10 (прогнозируемые вероятности для каждого класса di git: 0,1, ... 9), а затем применить argmax к получить прогнозируемые значения.

Теперь посмотрите на вашу output форму:

# output array from the above issue:
output = np.array([7, 2, 2, 7, 7, 2, 2, 7, 1, 2, 7, 7, 2, 2, 2, 7, 7, 7, 7, 7, 7, 7, 2, 2, 7, 2, 2, 2])
print(output.shape)

Вывод:

(28,)

28 против 10. И даже больше до применения argmax выходная форма была 28x28. Таким образом, это определенно не то, чего мы хотим достичь.

Проблема в шаге вперед. Вы создаете полностью связанные классы c слоев, но вы не изменяете свой входной тензор 2D от 28x28 до 1D тензора формы 784. Если вы хотите работать с 2D-входами, вы должны использовать архитектуру CNN.

Таким образом, чтобы решить вашу проблему, вы должны исправить все формы ввода, а также смещения, веса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...