NotImplementedError: Невозможно преобразовать символический Tensor (2nd_target: 0) в массив numpy - PullRequest
1 голос
/ 21 октября 2019

Я пытаюсь передать 2 функции потерь в модель, поскольку Keras позволяет это.

loss: String (имя целевой функции) или целевая функция или экземпляр Loss. Смотрите потери. Если модель имеет несколько выходов, вы можете использовать разные потери на каждом выходе, передавая словарь или список потерь . Значение потери, которое будет минимизировано моделью, будет затем суммой всех индивидуальных потерь.

Две функции потерь:

def l_2nd(beta):
    def loss_2nd(y_true, y_pred):
        ...
        return K.mean(t)

    return loss_2nd

и

def l_1st(alpha):
    def loss_1st(y_true, y_pred):
        ...
        return alpha * 2 * tf.linalg.trace(tf.matmul(tf.matmul(Y, L, transpose_a=True), Y)) / batch_size

    return loss_1st

Затем я строю модель:

l2 = K.eval(l_2nd(self.beta))
l1 = K.eval(l_1st(self.alpha))
self.model.compile(opt, [l2, l1])

Когда я тренируюсь, выдает ошибку:

1.15.0-rc3 ПРЕДУПРЕЖДЕНИЕ: tenorflow: From / usr / local/lib/python3.6/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630: вызов BaseResourceVariable. init (из tenorsflow.python.ops.resource_variable_ops) с ограничением устарело и будетудалено в будущей версии. Инструкции по обновлению

: если Keras передает аргументы * _constraint слоям.

NotImplementedError Traceback (последний вызов последнего) в () 47 create_using = nx.DiGraph (), nodetype = None,data = [('weight', int)]) 48 ---> 49 model = SDNE (G, hidden_size = [256, 128],) 50 model.train (batch_size = 100, epochs = 40, verbose = 2)51 embeddings = model.get_embeddings ()

10 кадров в init (self, graph, hidden_size, alpha, beta, nu1, nu2) 72 self.A, self.L = self. _create_A_L (73 self.graph, self.node2idx) # Adj Matrix, L Matrix ---> 74 self.reset_model () 75 self.inputs = [self.A, self.L] 76 self._embeddings = {}

в reset_model (self, opt)

---> 84 self.model.compile (opt, loss = [l2, l1]) 85 self.get_embeddings () 86

/ usr / local / lib / python3.6 / dist-packages /ensorflow_core / python / training / tracking / base.py в _method_wrapper (self, * args, ** kwargs) 455 self._self_setattr_tracking = False # pylint: disable =защищенный доступ 456 попробуйте: -> 457 результат = метод (self, * args, ** kwargs) 458 наконец: 459 self._self_setattr_tracking = previous_value # pylint: disable = protected-access

NotImplementedError: Невозможно преобразовать символьный тензор (2nd_target): 0) к массиву.

Пожалуйста, помогите, спасибо!

1 Ответ

0 голосов
/ 03 ноября 2019

Я нашел решение этой проблемы:

Это было потому, что я смешал символический тензор с несимвольным типом, таким как numpy. Например. НЕ рекомендуется иметь что-то вроде этого:

def my_mse_loss_b(b):
     def mseb(y_true, y_pred):
         ...
         a = np.ones_like(y_true) #numpy array here is not recommended
         return K.mean(K.square(y_pred - y_true)) + a
     return mseb

Вместо этого вы должны преобразовать все в символические тензоры, как это:

def my_mse_loss_b(b):
     def mseb(y_true, y_pred):
         ...
         a = K.ones_like(y_true) #use Keras instead so they are all symbolic
         return K.mean(K.square(y_pred - y_true)) + a
     return mseb

Надеюсь, эта помощь!

...