从头开始的神经网络 - 预测单个示例

Posted

技术标签:

【中文标题】从头开始的神经网络 - 预测单个示例【英文标题】:Neural network from scratch - predict single example 【发布时间】:2020-01-01 10:23:02 【问题描述】:

这是我从 Coursera 深度学习专业化中修改的神经网络,用于在包含扁平化训练数据数组的数据集上进行训练:

%reset -s -f

import numpy as np
import math

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def initialize_with_zeros(dim):

    w = np.zeros(shape=(dim, 1))
    b = 0

    return w, b

X = np.array([[1,1,1,1],[1,0,1,0] , [1,1,1,0], [0,0,0,0], [0,1,0,0], [0,1,0,1]])
Y = np.array([[1,0,1,1,1,1]])

X = X.reshape(X.shape[0], -1).T
Y = Y.reshape(Y.shape[0], -1).T

print('X shape' , X.shape)
print('Y shape' , Y.shape)

b = 1
w, b = initialize_with_zeros(4)

def propagate(w, b, X, Y) : 

    m = X.shape[1]

    A = sigmoid(np.dot(w.T, X) + b)  # compute activation
    cost = (- 1 / m) * np.sum(Y * np.log(A) + (1 - Y) * (np.log(1 - A)))  # compute cost
    dw = (1./m)*np.dot(X,((A-Y).T))
    db = (1./m)*np.sum(A-Y, axis=1)
    cost = np.squeeze(cost)

    grads = "dw": dw,
             "db": db

    return grads, cost

propagate(w , b , X , Y)

learning_rate = .001
costs = []

def optimize(w , b, X , Y) :
    for i in range(2):

        grads, cost = propagate(w=w, b=b, X=X, Y=Y)

        dw = grads["dw"]
        db = grads["db"]

        w = w - learning_rate*dw
        b = b -  learning_rate*db

        if i % 100 == 0:
            costs.append(cost)

    return w , b

w , b = optimize(w , b , X , Y)

def predict(w, b, X):

    m = 6
    Y_prediction = np.zeros((1,m))
#     w = w.reshape(X.shape[0], 1)

    A = sigmoid(np.dot(w.T, X) + b)
    for i in range(A.shape[1]):

        if A[0, i] >= 0.5:
            Y_prediction[0, i] = 1

        else:
            Y_prediction[0, i] = 0

    return Y_prediction

predict(w , b, X)

这按预期工作,但我很难预测一个例子。

如果我使用:

predict(w , b, X[0])

返回错误:

ValueError: shapes (6,4) and (6,) not aligned: 4 (dim 1) != 6 (dim 0)

如何重新排列矩阵运算以预测单个实例?

【问题讨论】:

【参考方案1】:

试试

predict(w, b, X[:1])

您的predict 函数似乎期望X 是二维的,当只传递一个X 时,它应该有一个单一的第二维(即shape=(6,1))而不是一个一维(即 shape=(6,))。

【讨论】:

predict(w , b , X[:1]) 返回错误 'ValueError: 形状 (6,4) 和 (1,6) 未对齐: 4 (dim 1) != 1 (dim 0)' 然后我尝试根据您的建议重塑 (6,1) :预测(w,b,X[:1].reshape((6, 1))) 但错误'ValueError:形状(6,4)和( 6,1) 未对齐:返回 4 (dim 1) != 6 (dim 0)'。 @blue-sky 为什么要在 prediction 函数中硬编码 m=6?如果我理解正确,m 是每个 dim=4 的示例数。您需要直接在 prediction 中设置尺寸,然后验证您尝试预测的 X 是 dim=4 而不是 dim=6。【参考方案2】:

错误来自于 predict 期望在一批形状为... * bs 的数据上调用。为了预测单个元素,您可以使用 np.expand_dims 创建一批大小为 1 的批次:

predict(w, b, np.expand_dims(X[0], axis=1)

应该可以。

【讨论】:

以上是关于从头开始的神经网络 - 预测单个示例的主要内容,如果未能解决你的问题,请参考以下文章

干货|使用PyTorch从零开始构建Elman循环神经网络

从头开始训练 Resnet 深度神经网络

可以使用深度学习框架而不是从头开始构建神经网络吗?

在 MATLAB 中从头开始编程基本神经网络

让一个简单的神经网络在 C++ 中从头开始工作

从头开始训练神经网络(Unet)