Python 用预先训练的权重和偏差预测自己的形象并不';我不能正常工作

Python 用预先训练的权重和偏差预测自己的形象并不';我不能正常工作,python,neural-network,mnist,Python,Neural Network,Mnist,我正试图通过在MNIST数据库上训练的反向传播将我自己的图像从零开始导入神经网络 代码: #X-输入图像 #W1/W2-重量 #b1/b2-偏差 def预测(X、W1、W2、b1、b2): Z1=np.dot(W1,X.T)+b1 A1=tanh(Z1) Z2=np.dot(W2,A1)+b2 A2=软最大值(Z2) 预测=np.argmax(A2,轴=0) 收益预测 selected\u img=x\u测试[3] 输出=预测(选择的项目,W1、W2、b1、b2) myImg=选择的形状重塑(

我正试图通过在MNIST数据库上训练的反向传播将我自己的图像从零开始导入神经网络

代码:

#X-输入图像
#W1/W2-重量
#b1/b2-偏差
def预测(X、W1、W2、b1、b2):
Z1=np.dot(W1,X.T)+b1
A1=tanh(Z1)
Z2=np.dot(W2,A1)+b2
A2=软最大值(Z2)
预测=np.argmax(A2,轴=0)
收益预测
selected\u img=x\u测试[3]
输出=预测(选择的项目,W1、W2、b1、b2)
myImg=选择的形状重塑((28,28))
打印(输出)
哪里可能出错

当我尝试从MNIST数据库本身输入图像时,它仍然不起作用。例如,它可以将其输出为
输出
[722727271772727727272]

请注意,我使用的代码与完整NN中的代码相同,因此前馈是相同的,猜测是相同的,权重和偏差是相同的-它在完整版本中确实有效,所以我真的不明白,为什么它现在不能工作

我错过什么了吗?
谢谢你的帮助

TL;DR:您正在构建完全连接的网络,而不是CNN,您的输入应为1D形状张量
28*28=784
,输出张量应为1D形状张量
10

根据问题描述,您正在尝试构建一个神经网络来分类
MNIST
数字。对吗?因此,您的网络应该将shape
28x28
的输入映射到
10
的shape的输出向量(每个数字类别的预测概率:0,1,…9),然后应用
argmax
获得预测值

现在,看看您的
输出
形状:

#上述问题的输出数组:
输出=np.数组([7,2,2,7,7,2,2,7,1,2,7,7,2,2,2,7,7,7,7,2,2,7,7,7,2,2,2])
打印(输出.形状)
输出:

(28,)
28
vs
10
。甚至在应用
argmax
之前,输出形状是
28x28
。所以,这绝对不是我们想要实现的

问题正在向前发展。您正在构建经典的完全连接层,但并没有将二维输入张量的
28x28
重塑为1D形状张量的
784
。如果你想处理2D输入,你应该使用CNN架构


因此,要解决您的问题,您应该修复输入的所有形状以及偏差、权重。

啊,我明白了!为了确保我理解正确,我的原始网络参数形状是:输入-(10000,784)权重1-(28784)bias1-(28,1)bias2-(10,1)权重2-(10,28)np后的结果。点(权重,输入)+偏差-(2810000)激活函数-(2810000)我的预测函数参数形状是:输入-(1784)权重1-(1784)权重2-(1,28)bias1-(1,1)bias2-(1,1)np后的结果。点(权重,输入)+偏差-(1,1)激活函数-(1,1)我理解正确吗?哦,对,我没有理解正确。现在我想我知道你的意思,但它仍然输出错误的数字。所以从原始输入大小
(10000,784)
我从权重1
(28784)
->
(10784)
从bias1
(28,1)
->
(10,1)
从权重2
(10,28)
->
(10,10)
从bias2
(10,1)
->
(10,1)
现在这就是你想要的吗?好的,你有一个n=10000个样本的数据集,每个样本有m=784个特征,隐藏单元的数量,比如说将是h=1024,输出大小o=10,输入(n,m),因此(为了简单起见,我省略了激活):输入层:np.dot(W1(h,m),输入(n,m).T)+b1(h,1)->A1(h,n);隐藏层:np.dot(W2(o,h)A1(H,N)+B2(O,1)-A2(O,N)只是将神经网络看作是一个矩阵乘法和偏置的序列,与广播相加,所以:<代码>(1024, 784)x(784,n)->(1024,n)+(1024, 1)->(1024,n)< /代码>;<代码>(10, 1024)x(1024,n)->(10,n)+(10, 1)->(10,n)。哦,我明白了,多亏了你,我终于能够正确预测了!