Я пытаюсь обучить нейронную сеть с градиентным спуском, которая имеет один входной узел, один скрытый слой с десятью узлами и один выходной узел. но я продолжаю получать 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
' ''