Как реализовать градиентный спуск в MLP вручную с tenorflow.GradientTape.gradient с тензорами - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь создать нейронную сеть (MLP) с входным слоем с одним узлом, одним скрытым слоем с двумя узлами и выходным слоем с одним узлом. поэтому между входным и скрытым слоями будет два веса и смещения, а между скрытым и выходным слоями - два веса и смещения. X является вводом, а Y является целью. Эта нейронная сеть должна принимать одно действительное число в качестве входного и выходного одного действительного числа. (Y_pred)

Как вы можете видеть, мой подход довольно наивен, так как мне реализовать это с тензорами, чтобы, если я добавлю больше скрытые узлы мне не придется писать столько кода. Кроме того, что я могу сделать, чтобы он взял вектор X в качестве входного и выходного вектора y_pred в качестве своих прогнозируемых значений, а затем скорректировал вес и смещения (Это все равно должно дать один выход для одного значения ввода, я думал просто положить oop). Спасибо.

'' '

def neural_network(X, Y):

w11 = 4  # some random value
w12 = 6
w21 = 6
w22 = 1
b11 = 4  # some random value
b12 = 6
b21 = 6
b22 = 1
for x in X:
    with tf.GradientTape() as t:
        t.watch(w11)
        t.watch(w12)
        t.watch(b11)
        t.watch(b12)
        t.watch(w21)
        t.watch(w22)
        t.watch(b21)
        t.watch(b22)
    hidden_1 = x * w11 + b11
    hidden_2 = x * w12 + b12
    a_1 = tf.math.tanh(hidden_1)
    a_2 = tf.math.tanh(hidden_2)
    output = (a_1 * w21 + b21) + (a_2 + w22 + b22)
    nll = -tf.compat.v1.losses.log_loss(Y, output)
    w11 = w11 - t.gradient(nll, w11)
    w12 = w12 - t.gradient(nll, w12)
    # same with rest of the weights and biases with every value of x and then return weights and biases

' ''

...