Я пытаюсь записать все выходные данные для каждого слоя для каждой эпохи.Я нашел следующее решение: 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 не имеет входящих узлов».