Как получить значения активации слоя Dropout в последнем мини-пакете в Keras - PullRequest
0 голосов
/ 22 февраля 2019

Я пытался сделать автоэнкодер с пользовательской функцией потерь, где функция потерь зависит от значений, маскируемых и не маскируемых слоем выпадения.Поэтому я пытаюсь получить доступ к значениям в выпадающем слое на последней итерации.Вот пример кода -

import keras.backend as K
from keras import optimizers

batchSize = 30

a = 1
b = 1

def lossFunc(model,a,b):

    def mse3(y_true, y_pred):  

        temp=y_true>0
        y_pred0=y_pred*tf.cast(temp,tf.float32)

        y_inter = model.get_layer("intermediate").output
        y_inter_filter = tf.math.not_equal(y_inter, tf.zeros_like(y_inter))
        y_pred1 = y_pred*tf.cast(y_inter_filter,tf.float32)
        y_true1 = y_true*tf.cast(y_inter_filter,tf.float32)

        y_inter_filter2 = tf.math.logical_xor(temp, y_inter_filter)
        y_pred2 = y_pred*tf.cast(y_inter_filter2,tf.float32)
        y_true2 = y_true*tf.cast(y_inter_filter2,tf.float32)

        return a*K.sum(K.square(y_pred1 - y_true1), axis=-1) #+ b*K.sum(K.square(y_pred2 - y_true2), axis=-1)

    return mse3

# def lossFunc(model,a,b):
#     def mse3(y_true, y_pred):
#         temp=y_true>0
#         y_pred=y_pred*tf.cast(temp,tf.float32)
#         return K.sum(K.square(y_pred - y_true), axis=-1)
#     return mse3

sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer = sgd, loss = lossFunc(model,a,b))

model.fit(x_input, x_output, epochs = 100, batch_size = batchSize)

Я прошел исходный код слоя Dropout.Но я не уверен, какие значения возвращаются model.get_layer("intermediate").output.Но я уверен, что это не то, что я ищу, так как значения потерь отличаются от ожидаемых.Любое направление будет высоко ценится.Спасибо.

Архитектура -

from keras.layers import Input, Dense, Concatenate, Lambda, Dropout
from keras.models import Model
import tensorflow as tf
from keras.regularizers import l2

group = []
dropout_rate = 0.5
reg = .001

inputTensor = Input(shape = (n_criterias*itemCount,))

for i in range(itemCount):
    group.append(Dense(1, kernel_regularizer=l2(reg), activation='tanh')(Lambda(lambda x: x[:,n_criterias*i:n_criterias*(i+1)], output_shape=((n_criterias,)))(inputTensor)))

intermediate = Dropout(rate=dropout_rate, name='intermediate')(Concatenate()(group))

layer1 = 200
layer2 = 100
x = Dense(layer1, kernel_regularizer=l2(reg), activation='tanh')(intermediate)
coding = Dense(layer2, kernel_regularizer=l2(reg), activation='tanh', name='coding')(x)
x = Dense(layer1, kernel_regularizer=l2(reg), activation='tanh')(coding)
outputTensor = Dense(itemCount, kernel_regularizer=l2(reg), activation='tanh')(x)

model = Model(inputs = inputTensor, outputs = outputTensor)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...