Размеры yHat меняются после заполнения модели данными испытаний, и потери растут - PullRequest
0 голосов
/ 30 марта 2020

Я строю регрессионную модель логистики c для задачи двоичной классификации. Ниже вы можете найти мою функцию, которая выполняет часть прямого распространения, и она состоит из функции активации и производной функции активации. Функция активации не является основной функцией, это пользовательская функция.

Моя проблема в том, что, когда я кормлю эту модель набором данных поезда, все в порядке. После завершения оптимизации я загружаю модель тестовым набором данных и что-то странное происходит. Размеры переменной yHat меняются. Когда я использую данные поезда, форма A равна (1000, )), но когда я использую данные испытаний, yhat становится (1, 200), но это должно быть (200, )). Из-за этого я не могу сравнить его с оригинальными ярлыками, так как это (200, ))

Кроме того, моя величина потерь всегда увеличивается. Я пытался установить гиперпараметры, но в лучшем случае потери остаются постоянными на уровне 0,51 ...

Вот вывод:

('Train X shape: ', (2, 1000))
('Train Y shape: ', (1000,))
('Train W shape: ', (2,))
('Train Z shape: ', (1000,))
('Train A shape: ', (1000,))
Loss after iteration 1: 0.500000
-----------------------------------------------------
('Train X shape: ', (2, 1000))
('Train Y shape: ', (1000,))
('Train W shape: ', (2,))
('Train Z shape: ', (1000,))
('Train A shape: ', (1000,))
Loss after iteration 2: 0.546685
-----------------------------------------------------
('Train X shape: ', (2, 1000))
('Train Y shape: ', (1000,))
('Train W shape: ', (2,))
('Train Z shape: ', (1000,))
('Train A shape: ', (1000,))
Loss after iteration 3: 0.627727
-----------------------------------------------------
('Train X shape: ', (2, 1000))
('Train Y shape: ', (1000,))
('Train W shape: ', (2,))
('Train Z shape: ', (1000,))
('Train A shape: ', (1000,))
Loss after iteration 4: 0.758092
-----------------------------------------------------
('Train X shape: ', (2, 1000))
('Train Y shape: ', (1000,))
('Train W shape: ', (2,))
('Train Z shape: ', (1000,))
('Train A shape: ', (1000,))
Loss after iteration 5: 0.959737
-----------------------------------------------------
('Train Z shape: ', (1, 200))
('Train A shape: ', (1, 200))
('Test X shape : ', (2, 200))
('Test Y shape : ', (200,))
('Test yhat shape : ', (1, 200))
(50.0, '% of test examples classified correctly.')

Вот моя функция прямого распространения:

def f(x, w, b):  # do not change this line!
    # x is a N-by-D numpy array
    # w is a D dimensional numpy array
    # b is a scalar
    # Return three things:
    # 1) the output of the f function, as a N dimensional numpy array,
    # 2) gradient of f with respect to w,
    # 3) gradient of f with respect to b

    # Output of the f function is yHat = a = activation_function(z)
    def activation_function(z):
        global alpha
        if (z.all < 0):
            return -alpha * z
        elif (0 <= z.all <= 1):
            return (3 * z ** 3) - (4 * z ** 2) + (2 * z)
        else:
            return z

    def activation_function_prime(z, a):
        global alpha
        if (z.all < 0):
            dfdw = -alpha * x
            dfdb = -alpha
            return dfdw, dfdb
        elif (0 <= z.all <= 1):
            dfdw = (9 * np.dot(x, np.square(a))) - (8 * np.dot(x, a)) + (2 * x)
            dfdb = 9 * np.square(a) - (8 * a) + 2
            print(alpha)
            return dfdw, dfdb
        else:
            dfdw = x
            dfdb = 1
            return dfdw, dfdb

    z = np.dot(w, x) + b
    a = activation_function(z)
    dfdw, dfdb = activation_function_prime(z, a)
    print("Train Z shape: ", z.shape)
    print("Train A shape: ", a.shape)

    return a, dfdw, dfdb
...