Проблема с apply_gradients в тензорном потоке 2: Exception NotImplementedError ('Попытка обновить тензор' ...)
Я вырезал следующий код из кода линейной регрессии, чтобы воспроизвести ошибку, с которой я столкнулся. Код воспроизводит только первый шаг градиентного спуска.
Оптимизация выполняется с помощью Tensorflow 2.1. Оптимизация должна решать систему уравнений. Переменные системы сгруппированы в два вектора: tfeElemv и tfeQv. В tfeqeElem и tfeqeQ сохраняются индексы tfeElemv и tfeQv, которые составляют желаемое уравнение. Уравнение i можно записать в таком виде:
tfeElemv[tfeqeElem[i]] * tfeQv[tfeqeQ[i]] = tfeqy[i]
где tfeqy[i]
- значение y уравнения i.
Моя проблема в том, что я пытаюсь использовать apply_gradients. Я пробовал 4 разных метода, начиная со строки 47, см. Комментарий #Line47-50, метод 1-4.
Что делаю не так, как исправить ошибку?
import numpy as np
import tensorflow as tf #tensorflow 2.1
import matplotlib.pyplot as plt
x = np.linspace(0, 1, 10)
y = 2 * x + 1.0 + np.random.randn(*x.shape) * 0.2
tfeElemv = tf.Variable([0.0, 0.0],dtype=tf.float64,trainable=True)
eQv = [1]
eqList = []
eqeElem = []
eqeQ = []
for i in range(len(x)):
eQv.append(x[i])
eqeElem.append( tf.constant([0, 1])) # eqation: self.eElemv[self.eElem]*self.eQv[self.eQ] = y use: tf.gather_nd
eqeQ.append(tf.constant([len(eQv)-1, 0])) # no te: eQv[0]=1
tfeQv = tf.Variable(eQv,dtype=tf.float64)
tfeqeElem = tf.convert_to_tensor(eqeElem) # eqation i: tfeElemv[tfeqeElem[i]]*tfeQv[tfeqeQ[i]] = tfeqy[i]
tfeqeQ = tf.convert_to_tensor(eqeQ)
tfeqy = tf.constant(y,dtype=tf.float64)
eqidx = [0, 1, 3, 4, 5] #this to select the equation we want to refer to
opt = tf.compat.v1.train.GradientDescentOptimizer(learning_rate=0.12)
with tf.GradientTape(persistent=True) as t: #tf.gather(self.eElemv, unique_indices)e
#t.watch(self.eElemv)
eQf = tf.gather(tfeQv,tf.gather(tfeqeQ,eqidx)) #the internal gather select the equation based on eqidx, the external gather select the variable grupped in tfeQv for each equation
eElemf = tf.gather(tfeElemv,tf.gather(tfeqeElem,eqidx))
loss = eElemf*eQf
loss = tf.reduce_sum(loss, 1)
loss = loss-tf.gather(tfeqy,eqidx)
current_loss = tf.reduce_mean(tf.square(loss))
grd = t.gradient(current_loss, tfeElemv)
if grd is not None:
if isinstance(grd, tf.IndexedSlices):
g = grd.values
unique_indices, idx_in_repeating_indices = tf.unique(grd.indices )
agg_gradients = tf.math.unsorted_segment_sum(g,
idx_in_repeating_indices,
tf.shape(unique_indices)[0])
val = tf.gather(tfeElemv, unique_indices)
zp=[(agg_gradients[i],tfeElemv[i]) for i in range(0, tfeElemv.shape[0])]
opt.apply_gradients(list(zip(agg_gradients,val))) #Line47, methd 1: Exception has occurred: NotImplementedError ('Trying to update a Tensor ', <tf.Tensor: shape=(), dtype=float64, numpy=0.0>)
opt.apply_gradients(zp) #Line48, methd 2: Exception has occurred: NotImplementedError ('Trying to update a Tensor ', <tf.Tensor: shape=(), dtype=float64, numpy=0.0>)
opt.apply_gradients(list(zip(agg_gradients,tfeElemv))) #Line49, methd 3: Exception has occurred: TypeError zip argument #2 must support iteration
opt.apply_gradients(grd) #Line50, methd 4: Exception has occurred: TypeError 'IndexedSlices' object is not iterable
else:
opt.apply_gradients(zip(grd,tfeElemv))
Информация о системе
Версия Python: 3.6.7 Моя версия тензорного потока: 2.1.0
CUDA: Н / Д
Модель графического процессора: Н / Д
Tenorflow, установленный из двоичных файлов
ОС: windows 10.
Написал ли я собственный код: Н / Д
Версия Bazel: Н / Д
Mobile Device N/A
Точная команда для воспроизведения: N/A