python - 使用预训练的权重和偏差预测自己的图像无法正常工作
问题描述
我正在尝试使用已在 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 中的代码相同,因此前馈是相同的,猜测是相同的,权重和偏差是相同的 - 它在完整版本中确实有效,所以我真的不得到,为什么它现在不能工作。
我错过了什么吗?谢谢你的帮助!
解决方案
TL;DR:您正在构建完全连接的网络,而不是 CNN,您的输入应该是 shape 的 1D 张量28*28 = 784
,而您的输出张量应该是 shape 的 1D 10
。
根据问题描述,您正在尝试构建一个神经网络来对MNIST
数字进行分类。对?因此,您的网络应该将形状的输入映射到形状28x28
的输出向量10
(每个数字类的预测概率: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
. 所以,这绝对不是我们想要达到的。
问题是向前迈出的一步。您正在构建经典的全连接层,但您没有将 2D 输入张量重塑28x28
为 shape 的 1D 张量784
。如果你想处理 2D 输入,你应该使用 CNN 架构。
因此,要解决您的问题,您应该修复输入的所有形状以及偏差、权重。
推荐阅读
- docker - 如何将文件从本地复制到无根 podman 容器中
- python - 将 NestedStackedInline 写入模板
- apache-spark-sql - spark在查询中读取json字符串
- sql - 如何防止使用 not like 运算符过滤 SQL 中的相似词(意外结果)?
- python - 如何用循环制作计算器,直到我选择中断
- python - pandas 中的聚合和计数
- database-design - 足球/足球数据库设计
- php - Laravel 8 测试方法 Illuminate\Http\JsonResponse::getSession 不存在
- javascript - 在javascript中过滤对象
- mongodb - 查看嵌套的对象数组是否包含值 | MongoDB