Я хочу реализовать попытку ускорить softmax, используя только верхние значения k в векторе.
Для этого я попытался реализовать пользовательскую функцию для тензорного потока для использования в модели:
def softmax_top_k(logits, k=10):
values, indices = tf.nn.top_k(logits, k, sorted=False)
softmax = tf.nn.softmax(values)
logits_shape = tf.shape(logits)
return_value = tf.sparse_to_dense(indices, logits_shape, softmax)
return_value = tf.convert_to_tensor(return_value, dtype=logits.dtype, name=logits.name)
return return_value
Я использую fashion mnist, чтобы проверить, работает ли эта попытка:
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
# normalize the data
train_images = train_images / 255.0
test_images = test_images / 255.0
# split the training data into train and validate arrays (will be used later)
train_images, train_images_validate, train_labels, train_labels_validate = train_test_split(
train_images, train_labels, test_size=0.2, random_state=133742,
)
model = keras.models.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(128, activation=tf.nn.relu),
keras.layers.Dense(10, activation=softmax_top_k)
])
model.compile(
loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
model.fit(
train_images, train_labels,
epochs=10,
validation_data=(train_images_validate, train_labels_validate),
)
model_without_cnn.compile(
loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
model_without_cnn.fit(
train_images, train_labels,
epochs=10,
validation_data=(train_images_validate, train_labels_validate),
)
Но во время выполнения возникает ошибка:
ValueError: An operation has
Нетfor gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable).
Я нашел следующее: (Как создать пользовательскую функцию активации), в которой объясняется, как реализовать полностью пользовательскую функцию активации для tensorflow. Но так как это использует и расширяет softmax, я подумал, что градиент должен быть таким же.
Это моя первая неделя кодирования с помощью python и tensorflow, поэтому у меня пока нет хорошего обзора всех внутренних реализаций.
Есть ли более простой способ расширить softmax до новой функции, а не реализовывать ее с нуля?
Заранее спасибо!