【问题标题】:Predicting own image with pretrained weights and biases doesn't work correctly使用预训练的权重和偏差预测自己的图像无法正常工作
【发布时间】:2020-05-26 04:52:09
【问题描述】:

我正在尝试使用已在 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 中的 相同 代码相同,因此前馈是相同的,猜测是相同的,权重和偏差是相同的 - 它确实适用于那个完整版,所以我真的不明白,为什么它现在不能工作。

我错过了什么吗? 感谢您的帮助!

【问题讨论】:

    标签: python neural-network mnist


    【解决方案1】:

    TL;DR:您正在构建全连接网络,而不是 CNN,您的输入应该是形状为 28*28 = 784 的一维张量,您的输出张量应该是形状为 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,)
    

    2810。甚至在应用argmax 之前,输出形状为28x28。所以,这绝对不是我们想要达到的目标。

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

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

    【讨论】:

    • 啊,我明白了!所以只是为了确保我是否理解正确:我的原始网络参数形状是:输入 - (10000, 784) Weight1 - (28, 784) bias1 - (28, 1) bias2 - (10, 1) Weight2 - (10 , 28) np.dot(weight, Input) + bias - (28, 10000) 激活函数 - (28, 10000) 我的预测函数参数形状为:输入 - (1, 784) Weight1 - (1, 784) weight2 - (1, 28) bias1 - (1, 1) bias2 - (1, 1) np.dot(weight, Input) + bias - (1, 1) 激活函数 - (1, 1) 后的结果我明白了吗正确吗?
    • 哦,对了,我没有正确理解。现在我想我知道你的意思了,但它仍然输出错误的数字。所以从(10000, 784)的原始输入大小我已经完成了(1, 784)从Weight1 (28, 784) -> (10, 784) 从bias1 (28, 1) -> (10, 1) From Weight2 (10, 28)-> (10, 10) 从bias2 (10, 1) -> (10, 1)这是你说的吗?
    • 好的,你有 n=10000 个样本的数据集,每个样本有 m=784 个特征,隐藏单元的数量,假设是 h=1024,输出大小 o=10,输入(n , m),因此(为简单起见,我省略了激活):输入层:np.dot(W1 (h, m), input (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)
    • 哦,我明白了,多亏了你,我终于能够正确预测了!
    猜你喜欢
    • 2023-04-07
    • 2021-03-09
    • 2020-01-12
    • 2017-03-02
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多