Проблема с 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

0 ответов

Другие вопросы по тегам