Мне любопытно, может ли функция потерь реализовать выходные данные промежуточного слоя в keras, не разрабатывая модель для подачи промежуточных слоев в качестве выходных данных. Я видел, что решение может состоять в том, чтобы перепроектировать архитектуру, чтобы вернуть промежуточный слой в дополнение к окончательному прогнозу и использовать это в качестве обходного пути, но мне неясно, можно ли получить доступ к выходным данным слоя непосредственно из функции потерь.
I'm unclear whether a layer output can be accessed directly from a loss function
Конечно может.
В качестве примера рассмотрим эту модель с использованием функционального API:
inp = keras.layers.Input(shape=(28, 28))
flat = keras.layers.Flatten()(inp)
dense = keras.layers.Dense(128, activation=tf.nn.relu)(flat)
out = keras.layers.Dense(10, activation=tf.nn.softmax)(dense)
model = keras.models.Model(inputs=inp, outputs=out )
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
Если, скажем, мы хотим ввести новую функцию потерь, которая также штрафует наибольший вес выходных данных нашего слоя dense
, то мы могли бы написать пользовательскую функцию потерь примерно так:
def my_funky_loss_fn(y_true, y_pred):
return (keras.losses.sparse_categorical_crossentropy(y_true, y_pred)
+ keras.backend.max(dense))
которую мы можем использовать в нашей модели, просто передав нашу новую функцию потерь методу compile()
:
model.compile(optimizer='adam',
loss=my_funky_loss_fn,
metrics=['accuracy'])
Можно ли также добавить метку к выходу этого плотного слоя?
С последним тензорным потоком я получаю: «TypeError: невозможно преобразовать символический ввод/вывод Keras в массив numpy». Когда я пытаюсь получить доступ к промежуточным тензорам, подобным этому.
вот простое решение: stackoverflow.com/questions/62454500/…