Используя Keras, как я могу записать каждый вывод каждого слоя для каждой эпохи, используя функции обратного вызова? - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь записать все выходные данные для каждого слоя для каждой эпохи.Я нашел следующее решение: Keras / Tensorflow: получить прогнозы или вывод всех слоев эффективно , но я не понимаю, как применить его к моему коду.Это единственный способ сделать это или вы можете использовать функции обратного вызова?Если да, как я могу применить его к своему коду?Я бы предпочел функцию обратного вызова, так как я хочу иметь слои с переменным количеством.Было бы лучше, если бы существовало общее решение, не зависящее от входных данных.Входные данные теста имеют размер 4092,12, если это помогает.

Я пытался реализовать функцию обратного вызова точно так же, как записывал веса, но я получаю следующую ошибку: «Слой 1 не имеет входящих узлов."Попытка следующим образом: Keras / Tensorflow: эффективно получать прогнозы или выходные данные всех слоев"Последовательный слой не подключен, нет входных данных для возврата"

#function definition
#records weight after each epoch and stores in dictionary. input 
"weights" is object
def record_weights(weights, epoch):
    index = 0
    name_nr = 0
#itterates through each layer and gets weights if dense or cov
    for layer in model.layers:
        if("dense" in layer.name or "cov" in layer.name):
            # 1st element are weights, second is bias input
            layer_name = create_layer_name(layer, name_nr)
            weights.dic[(epoch, name_nr)] = [layer.get_weights()[0], 
layer_name]
            if(name_nr not in weights.flat_weights.keys()):
                 weights.flat_weights[name_nr] = layer.get_weights() 
[0]
            else:
                weights.flat_weights[name_nr] = 
np.append(weights.flat_weights[name_nr], layer.get_weights()[0])
            name_nr += 1
        index += 1

#tries to mimick record_weights. record each layer outputs in a 
dictionary. input "outputs" is object
def record_layer_outputs(outputs, epoch):
     index = 0
     name_nr = 0
     for layer in model.layers:
         if("dense" in layer.name or "cov" in layer.name):
             layer_name = create_layer_name(layer, name_nr)
             outputs.dic[(epoch, name_nr)] = [layer.get_output() 
[0], 
 layer_name]
             if(name_nr not in weights.flat_weights.keys()):
                  outputs.flat_outputs[name_nr] = layer.get_output() 
[0]
             else:
                 outputs.flat_outputs[name_nr] = 
 np.append(outputs.flat_outputs[name_nr], layer.get_output()[0])
             name_nr += 1
         index += 1





 #model definition
 model = Sequential()

 model.add(Dense(8))
 model.add(Activation("tanh"))

 model.add(Dense(6))
 model.add(Activation("tanh"))

 model.add(Flatten())
 model.add(Dense(1))
 model.add(Activation("sigmoid"))

 #callback functions
 weight_recording = LambdaCallback(on_epoch_end=lambda epoch, logs: 
 record_weights(weights, epoch))
 output_recording = LambdaCallback(on_epoch_end=lambda epoch, logs: 
 record_layer_outputs(outputs, epoch))

 # compile model
 sgd = optimizers.SGD(lr=0.0004)
 adam = optimizers.Adam(lr=0.0004)
 model.compile(loss="binary_crossentropy",
           optimizer=adam,
           metrics=["binary_accuracy"])

 history = model.fit(data.data, data.labels[:,0], epochs=2, 
 batch_size=512, validation_split=0.2,
                 callbacks = [weight_recording, output_recording])

Ожидается, что модельсохраняет выходные данные в словаре в объекте, подобном функции обратного вызова для записи веса «Слой 1 не имеет входящих узлов».

...