Tensorflow.GradientTape (). Градиент дает None объект вместо градиента - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь обучить нейронную сеть с градиентным спуском, которая имеет один входной узел, один скрытый слой с десятью узлами и один выходной узел. но я продолжаю получать None, когда я пытаюсь вычислить градиент. Вот мой код, другие люди, которые получают ту же ошибку, обычно не вызывают tf.GradientTape (). Watch, но я делаю, что искал этот сайт, но не могу найти решение.

'' '

import numpy as np
import tensorflow as tf
import math


def train_neural_network(sigma_model=1.):
    iters = 1000  # No. of iterations
    lr = 0.001  # learning rate
    n = 100  # number of examples
    w1 = tf.Variable(tf.random.normal((10, 1), dtype=tf.float32), trainable=True)  # first weight
    w2 = tf.Variable(tf.random.normal((10, 1), dtype=tf.float32), trainable=True)  # second weight
    b1 = tf.Variable(tf.random.normal((10, 1), dtype=tf.float32), trainable=True)  # first bias
    b2 = tf.Variable(tf.random.normal((1,), dtype=tf.float32), trainable=True)  # second bias

    for i in range(iters):
        with tf.GradientTape(persistent=True, watch_accessed_variables=True) as t:
            t.watch(w1)
            t.watch(w2)
            t.watch(b1)
            t.watch(b2)
            x = np.random.uniform(0, 20, n)
            noise = np.random.randn(len(x))
            y = 2 * x + 0.3 * noise

            x = tf.convert_to_tensor(x, dtype=tf.float32, )
            x = tf.reshape(x, (100, 1))
            h_out = tf.tanh(tf.matmul(w1, tf.transpose(x)) + b1)
            y_hat = tf.linalg.matmul(tf.transpose(h_out), w2) + b2

            f = len(x)
            ll = []
            t.watch(y_hat)
            t.watch(ll)
            for j in range(len(y_hat)):
                ll.append(np.sum(-f / 2 * math.log(2 * math.pi * (sigma_model ** 2)) - ((y[j] - 
                                y_hat[j]) ** 2) / (2 * (sigma_model ** 2))))
            ll = tf.convert_to_tensor(ll, dtype=tf.float32)
            nll = tf.Variable(1, trainable=True)
            t.watch(nll)
            nll = -tf.reduce_sum(tf.convert_to_tensor(ll, dtype=tf.float32))

            w1 = tf.math.subtract(w1, lr * t.gradient(nll, w1))  # here I get error 'can't 
                                                                 # multiply float with NoneType'
            w2 = tf.math.subtract(w2, lr * t.gradient(nll, w2))
            b1 = tf.math.subtract(b1, lr * t.gradient(nll, b1))
            b2 = tf.math.subtract(b2, lr * t.gradient(nll, b2))
        del t
    theta = w1, w2, b1, b2
    return theta

' ''

...