Как получить активацию Keras?

Я не уверен, как изменить свой код, чтобы получить активацию keras. Я видел противоречивые примеры входных данных K.function() и не уверен, получаю ли я выходные данные для каждого слоя наших активаций.

Вот мой код

activity = 'Downstairs'
layer = 1


seg_x = create_segments_and_labels(df[df['ActivityEncoded']==mapping[activity]],TIME_PERIODS,STEP_DISTANCE,LABEL)[0]
get_layer_output = K.function([model_m.layers[0].input],[model_m.layers[layer].output])
layer_output = get_layer_output([seg_x])[0]

try: 
    ax = sns.heatmap(layer_output[0].transpose(),cbar=True,cbar_kws={'label':'Activation'})
except:
    ax = sns.heatmap(layer_output.transpose(),cbar=True,cbar_kws={'label':'Activation','rotate':180})

ax.set_xlabel('Kernel',fontsize=30)
ax.set_yticks(range(0,len(layer_output[0][0])+1,10))
ax.set_yticklabels(range(0,len(layer_output[0][0])+1,10))
ax.set_xticks(range(0,len(layer_output[0])+1,5))
ax.set_xticklabels(range(0,len(layer_output[0])+1,5))
ax.set_ylabel('Filter',fontsize=30)
ax.xaxis.labelpad = 10
ax.set_title('Filter vs. Kernel\n(Layer=' + model_m.layers[layer].name + ')(Activity=' + activity + ')',fontsize=35)

Предложения здесь по переполнению стека просто делайте это, как я: Keras, Как получить вывод каждого слоя?

Пример 4 добавляет в смесь фазу обучения k, но мой вывод остается прежним. https://www.programcreek.com/python/example/93732/keras.backend.function

Я получаю вывод или активации? Документация подразумевает, что мне могут понадобиться слои.активации, но я этого не сделал.

Мой код или код, проходящий на этапе обучения, получают эту тепловую карту. https://imgur.com/a/5fI6N0B


person Mark McGown    schedule 17.10.2019    source источник


Ответы (1)


Для слоев, определенных как, например. Dense(activation='relu'), layer.outputs будут получать активацию (relu). Чтобы получить предварительные активации слоя, вам нужно установить activation=None (т. е. 'linear'), а затем слой Activation. Пример ниже.

from keras.layers import Input, Dense, Activation
from keras.models import Model
import numpy as np
import matplotlib.pyplot as plt
import keras.backend as K

ipt = Input(shape=(8,))
x   = Dense(10, activation=None)(ipt)
x   = Activation('relu')(x)
out = Dense(1, activation='sigmoid')(x)

model = Model(ipt, out)
model.compile('adam', 'binary_crossentropy')

X = np.random.randn(16, 8)
outs1 = get_layer_outputs(model, model.layers[1], X, 1)  # Dense
outs2 = get_layer_outputs(model, model.layers[2], X, 1)  # Activation

plt.hist(np.ndarray.flatten(outs1), bins=200); plt.show()
plt.hist(np.ndarray.flatten(outs2), bins=200); plt.show()


введите здесь описание изображения


Используемая функция:

def get_layer_outputs(model, layer, input_data, learning_phase=1):
    layer_fn = K.function([model.input, K.learning_phase()], layer.output)
    return layer_fn([input_data, learning_phase])
person OverLordGoldDragon    schedule 17.10.2019
comment
Это прекрасный ответ и именно то, что мне было нужно. Я читал, что если активация не указана, по умолчанию используется x, линейный. Это тот случай, когда ничего не указано, поэтому активация равна выходу, или это то, что люди имеют в виду, когда говорят об отсутствии активации? Мне интересно, почему я буду использовать активацию в CNN для DropOut, объединения или плотных слоев с точки зрения архитектуры, но все эти вопросы выходят за рамки этого вопроса, для протокола. - person Mark McGown; 17.10.2019
comment
activation=None точно такой же, как activation='linear'; внутри это что-то вроде: if activation is None: activation = 'linear'. Активации имеют решающее значение для глубоких нейронных сетей по многим причинам, главная из которых заключается в том, что они обеспечивают нелинейность — в противном случае это похоже на обучение одного большого слоя вместо нескольких сложенных. Некоторые дополнительное чтение — Рад, что ответ был полезен — если проблема решена, рассмотрите также возможность голосования. - person OverLordGoldDragon; 17.10.2019