Python 在损失函数中将浮点张量转换为整数张量

Python 在损失函数中将浮点张量转换为整数张量,python,numpy,tensorflow,keras,Python,Numpy,Tensorflow,Keras,我正在构建一个损失函数,我需要使用y_真和y_pred作为矩阵的索引,我用它来计算损失。问题是,这两个函数都是浮点张量,像cast()和round()这样的函数是不可微的,所以我不能在loss函数中使用它们 import numpy as np import tensorflow as tf from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam fr

我正在构建一个损失函数,我需要使用y_真和y_pred作为矩阵的索引,我用它来计算损失。问题是,这两个函数都是浮点张量,像cast()和round()这样的函数是不可微的,所以我不能在loss函数中使用它们

import numpy as np
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam
from sklearn.utils import shuffle
from keras.utils import to_categorical

K = tf.keras.backend
A = np.random.randint(12, size=(12,12))


def score_loss(y_true, y_pred):
    y_pred = tf.nn.softmax(y_pred)
    y_true = tf.nn.softmax(y_true)
    y_pred = K.cast(y_pred,"int32")
    y_true = K.cast(y_true,"int32")
    loss = -K.sum(tf.gather_nd(A, tf.stack((y_true, y_pred), axis=-1)))
    return loss

data = np.random.rand(1000,10)
data_y = np.array(range(0,10))
X = data[:, 0:8]
y = data[:, 9]
for i in range(0, len(y)):
  y[i] = data_y[i%9]
y = shuffle(y)
y = to_categorical(y, 9)
model = Sequential()
model.add(Dense(200, input_shape = (8,), activation = "relu"))
model.add(Dense(9, activation = "softmax"))
model.compile(loss = score_loss, optimizer= Adam())

培训期间出现以下错误:

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

我需要另一种方法将其转换为整数,或者另一种方法来完成整件事。

在代码中的哪一行出现错误?在调用损失函数的训练过程中。您能在损失函数之外进行转换吗?如果您的模型正在生成索引,那么不管怎样,将它们设置为
int
s可能更有意义。在代码中的哪一行出现错误?在调用损失函数的训练期间。您可以在损失函数之外进行转换吗?如果您的模型正在生成索引,那么将它们设置为
int
s可能更有意义。