Как заменить слой модели с помощью TensorFlow 2.16?

С TensorFlow 2.15 работает следующее:

from tensorflow.keras.layers import Input, Dense, BatchNormalization
from tensorflow.keras.models import Model

inputs = Input(shape=(4,))
x = Dense(5, activation='relu')(inputs)
predictions = Dense(3, activation='softmax')(x)
model = Model(inputs=inputs, outputs=predictions)
model.compile(loss='categorical_crossentropy', optimizer='nadam')

print(model.layers)
model._self_tracked_trackables[1] = BatchNormalization()
print(model.layers)

Выход:

[<keras.src.engine.input_layer.InputLayer object at 0x7f9324ba10c0>, <keras.src.layers.core.dense.Dense object at 0x7f931c1144c0>, <keras.src.layers.core.dense.Dense object at 0x7f931c116c80>]
[<keras.src.engine.input_layer.InputLayer object at 0x7f9324ba10c0>, <keras.src.layers.normalization.batch_normalization.BatchNormalization object at 0x7f9324ba3280>, <keras.src.layers.core.dense.Dense object at 0x7f931c116c80>]

Как этого можно достичь с помощью TensorFlow 2.16?

В модели больше нет _self_tracked_trackables:

AttributeError: 'Functional' object has no attribute '_self_tracked_trackables'

И пытаюсь поменять слой следующим образом:

model.layers[1] = BatchNormalization()

или так

model._layers[1] = BatchNormalization()

или так

model.operations[1] = BatchNormalization()

не меняет содержимое model.layers.

print(model.layers)

выводит следующее не только до, но и после этого присваивания:

[<InputLayer name=input_layer, built=True>, <Dense name=dense, built=True>, <Dense name=dense_1, built=True>]

(Предыстория: я пытаюсь обновить свою экономно-глубокую библиотеку до новой версии TF, и она опирается на замену слоев для преобразования вложенных последовательных моделей в функциональные модели.)

Udacity Nanodegree Capstone Project: Классификатор пород собак
Udacity Nanodegree Capstone Project: Классификатор пород собак
Вы можете ознакомиться со скриптами проекта и данными на github .
1
0
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
model._operations[1] = BatchNormalization()

работает.

Имейте в виду следующее: Этот код обращается к частному члену класса. Это недокументированная деталь реализации, которая может снова измениться в будущих версиях TensorFlow.

Благодарим вас за этот фрагмент кода, который может оказать немедленную ограниченную помощь. Правильное объяснение значительно повысит его долгосрочную ценность, показав, почему это хорошее решение проблемы, и сделает его более полезным для будущих читателей с другими похожими вопросами. Пожалуйста, отредактируйте свой ответ, добавив некоторые пояснения, включая сделанные вами предположения.

jasie 10.04.2024 13:56

Я бы с радостью, но у меня нет подходящего объяснения. Я обращаюсь к частному члену класса здесь. Это недокументированная деталь реализации, которая может снова измениться в будущих версиях TensorFlow.

Tobias Hermann 10.04.2024 18:22

Другие вопросы по теме