В настоящее время я работаю над внедрением сети радиальных базисных функций (RBFN) в Keras / Tensorflow. Я настроил свой собственный слой RBF в Керасе, и теперь я хочу написать свою собственную программу тренировок, используя tf.GradientTape()
. Моя модель Keras имеет набор из трех различных переменных (центр, ширина, вес) для активации RBF. Поскольку я хочу написать учебную программу со стратегиями роста сети и сокращения, мне нужно рассчитать градиент одного RBF по отношению к потерям.
Я использую Tensorflow 2.0.0 и python 3.7.4
Если я передаю все свои model.trainable_variables
в функцию tf.GradientTape().gradients()
, все работает нормально. Моя процедура выглядела бы так:
with tf.GradientTape() as t:
y_hat = model(X)
current_loss = loss(y_hat, y)
grads = t.gradient(current_loss, model.trainable_variables)
optimizer.apply_gradients(zip(grads, model.trainable_variables))
Моя цель - применить градиенты только к ближайшему (по параметру центра) расположенному нейрону RBF к входу X[i]
with tf.GradientTape() as t:
y_hat = model(X[i])
current_loss = loss(y_hat, y[i])
centers = model.trainable_variables[0]
eucl = tf.math.abs(centers - X[i]) # euclidian distance of input to RBF centers
idx_nr = tf.math.argmin(tf.math.abs(eucl)).numpy()[0] # idx of nearest RBF
grads = t.gradient(current_loss, model.trainable_variables[0][idx_nr]) # just the centers
print(grads)
Однако это всегда возвращает None
для градиентов. Ожидает ли t.gradient()
переменные в указанном формате c? Я надеюсь, что вы, ребята, можете предложить хорошие идеи Заранее спасибо! :)