Я строю регрессионную модель логистики 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