#tensorflow #keras
#tensorflow #keras
Вопрос:
У меня есть следующая пользовательская функция tf:
import tensorflow as tf
@tf.function
def top10_accuracy_scorer(y_true, y_pred):
values, indeces = tf.math.top_k(y_pred, 10)
lab_indeces_tensor = tf.argmax(y_true,1)
lab_indeces_tensor = tf.reshape(lab_indeces_tensor,
shape=(tf.shape(lab_indeces_tensor)[0],1))
lab_indeces_tensor = tf.dtypes.cast(lab_indeces_tensor,dtype=tf.int32)
equal_tensor = tf.equal(lab_indeces_tensor, indeces)
sum_tensor = tf.reduce_sum(tf.cast(equal_tensor, tf.float32))
top10_accuracy = sum_tensor/tf.cast(tf.shape(lab_indeces_tensor)[0], tf.float32)
return top10_accuracy
Она отлично работает как показатель в моей модели, но когда я пытаюсь использовать ее как функцию потерь, я получаю ошибку: ValueError: No gradients provided for any variable
. Очевидно, что какая-то ее часть не поддается дифференцированию, но я не могу понять, как это исправить. Любая помощь приветствуется.
Рабочий пример:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
X_temp = np.random.uniform(0,1,(1000,100))
y_temp = np.random.uniform(0,1,(1000,10))
y_temp = np.argmax(y_temp, axis=1)
y_temp = tf.keras.utils.to_categorical(y_temp)
model = Sequential()
model.add(Dense(y_temp.shape[1], input_shape = (X_temp.shape[1],), activation='softmax'))
model.compile(optimizer='adam',
loss=top10_accuracy_scorer,
metrics=['accuracy'])
model.fit(X_temp, y_temp)