Следующий код - моя реализация нейронной сети (1 скрытый слой), пытающаяся предсказать некоторое число на основе входных данных.
- Номер входного узла: 11
- Числоузлов в скрытом слое: 11
- Количество узлов в выходном слое: 1
m
: количество обучающих примеров, здесь = 4527 X
: [11, m]
matrix y
: [1, m]
matrix w1
: веса, связанные со входного слоя в скрытый слой b1
: вектор смещения, связанный со входным слоемдля скрытого слоя w2
: веса, связанные со скрытым слоем для выходного слоя b2
: вектор смещения, связанный со скрытым слоем для выходного слоя alpha
:скорость обучения ite
: число итераций, здесь = 10000
Поскольку я пытаюсь предсказать вывод непрерывного значения, я использую сигмовидную функцию во входных слоях ифункция тождественности в выходном слое
def propagate(X,y,w1,b1,w2,b2,alpha,ite):
assert(X.shape[0] == 11)
assert(y.shape[0] == 1)
assert(X.shape[1] == y.shape[1])
m = X.shape[1]
J = np.zeros(shape=(ite,1))
iteNo = np.zeros(shape=(ite,1))
for i in range(1,ite+1):
z1 = np.dot(w1,X) + b1
a1 = sigmoid(z1)
z2 = np.dot(w2,a1) + b2
dz2 = (z2-y)/m
dw2 = np.dot(dz2,a1.T)
db2 = np.sum(dz2, axis=1, keepdims=True)
dz1 = np.dot(w2.T,dz2)*derivative_of_sigmoid(z1)
dw1 = np.dot(dz1,X.T)
db1 = np.sum(dz1, axis=1, keepdims=True)
w2 = w2 - (alpha*dw2)
b2 = b2 - (alpha*db2)
w1 = w1 - (alpha*dw1)
b1 = b1 - (alpha*db1)
iteNo[i-1] = i
J[i-1] = np.dot((z2-y),(z2-y).T)/(2*m)
print(z2)
return w1,b1,w2,b2,iteNo,J
Я пробовал оба способа (с feaнормализация и масштабирование и без), но моя функция стоимости меняется следующим образом в зависимости от количества итераций (график J). По оси x: номер итерации, по оси y: ошибка * 10 ^ 12
Пожалуйста, помогите!