Найти отрицательные логарифмические вероятностные затраты для логистики c регрессии в python и потери градиента по отношению к w, bF - PullRequest
0 голосов
/ 18 апреля 2020

Формула для определения функции стоимости:

Cost Function

Формула для расчета потери градиента для w, b:

Gradient Loss

Аргументы:

  1. w - веса, numpy массив размеров (num_px * num_px * 3, 1)
  2. b - смещение, скаляр
  3. X - данные размера (num_px * num_px * 3, количество примеров)
  4. Y - - истинный вектор «метки» (содержит 0, если не cat, 1, если cat) размера (1, количество примеров)

Return:

  1. стоимость - отрицательное логарифмическое значение вероятности для логистики c регрессия

  2. dw - градиент потерь по отношению к w, поэтому такая же форма, как и у w

  3. дБ - градиент потерь относительно b, таким же образом, как b

Мой код:

import numpy as np

def sigmoid(z):
    """
    Compute the sigmoid of z

    Arguments:
    z -- A scalar or numpy array of any size.

    Return:
    s -- sigmoid(z)
    """

    ### START CODE HERE ### (≈ 1 line of code)
    s = None
    s = 1 / (1 + np.exp(-z))
    ### END CODE HERE ###

    return s




# GRADED FUNCTION: propagate

def propagate(w, b, X, Y):
    """
    Implement the cost function and its gradient for the propagation explained above



    Tips:
    - Write your code step by step for the propagation. np.log(), np.dot()
    """

    m = X.shape[1]

    # FORWARD PROPAGATION (FROM X TO COST)
    ### START CODE HERE ### (≈ 2 lines of code)
    A = None                                    # compute activation
    cost = None                                 # compute cost
    k = w * X + b  
    A = sigmoid(k)

    cost = (-Y * np.log(A) - (1 - Y) * np.log(1 - A)).mean() / m
    ### END CODE HERE ###

    # BACKWARD PROPAGATION (TO FIND GRAD)
    ### START CODE HERE ### (≈ 2 lines of code)
    dw = None
    db = None
    db = np.subtract(A , Y)
    dw = np.dot(X,db.T)/m
    db = np.sum(db)/m
    ### END CODE HERE ###

    # assert(dw.shape == w.shape)
    # assert(db.dtype == float)
    # cost = np.squeeze(cost)
    # assert(cost.shape == ())

    grads = {"dw": dw,
             "db": db}

    return grads, cost


w, b, X, Y = np.array([[1.],[2.]]), 2., np.array([[1.,2.,-1.],[3.,4.,-3.2]]), np.array([[1,0,1]])
grads, cost = propagate(w, b, X, Y)
print ("dw = " + str(grads["dw"]))
print ("db = " + str(grads["db"]))
print ("cost = " + str(cost))

Мой вывод:

dw = [[ 0.72851438  0.99581514]                                                                                               
 [ 1.5487967   2.38666712]]                                                                                                   
db = 0.225798060825                                                                                                           
cost = 1.04403235316 

Ожидаемый результат:

dw = [[ 0.99845601]     [ 2.39507239]]
db = 0.00145557813678
cost = 5.801545319394553

Может кто-нибудь сказать мне, почему мое измерение dw не То же самое с ожидаемым выходом и помочь найти функцию стоимости?

1 Ответ

0 голосов
/ 18 апреля 2020
dw = np.dot(X,db.T)/m 

неправильно.

Вместо дБ его следует умножить на производную функции активации, то есть сигмоид,

A = sigmoid(k)
dA = np.dot((1-A)*A,dloss.T) # This is the derivative of a sigmoid function

dw = np.dot(X,dA.T)

Код не проверяется, но решение будет таким же. См. здесь , чтобы рассчитать dloss.

...