Объяснение поведения слоев кераса в тензорном потоке 2.0 - PullRequest
0 голосов
/ 04 марта 2020

Я провел эксперимент, но не могу понять, почему я получаю такой результат:

  1. Я создаю и подгоняю простую модель, используя функциональный API с 3 скрытыми слоями:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

input_ = layers.Input(shape=(X_train.shape[1:]))
hidden1 = layers.Dense(30, activation='relu')(input_)
hidden2 = layers.Dense(30, activation='relu')(hidden1)
hidden3 = layers.Dense(30, activation='relu')(hidden2)
output = layers.Dense(1)(hidden3)
model1 = keras.Model(inputs=input_, outputs=output)
model1.compile(optimizer='adam', loss='mse')
history = model1.fit(x=X_train, y=y_train, epochs=200)
Теперь скажите, что я хочу исследовать активацию второго скрытого слоя. Затем я создаю другую модель, подобную этой:
model2 = keras.Model(inputs=input_, outputs=hidden2)

Удивительно для меня, если я сейчас позвоню model2.weights, эти веса такие же, как model1.layers[2].weights, который был установлен ранее, но я никогда не звоню .fit() на model2.

Это привело меня к мысли, что веса слоя должны храниться в объекте hidden2 после того, как я вызову model1.fit(x=X_train, y=y_train, epochs=200), поэтому, когда я определяю model2 = keras.Model(inputs=input_, outputs=hidden2), он уже знает веса.

Но когда я попытался исследовать объект hidden2, я не смог найти способ извлечь вес.

Следовательно, мой вопрос, как это возможно, что model2 знает веса model1, если они не содержатся в объекте hidden2?

Большое спасибо

1 Ответ

0 голосов
/ 04 марта 2020

Вы используете функциональный API, и это именно то поведение, которое намечено. Этот API можно использовать для разделения весов между экземплярами слоя (тензорными).

В результате получается, что слой (layers.Dense(30, activation='relu')) является тем, который хранит слои, и когда вы генерируете новые тензоры (вызывая Model(....)), веса используются повторно, так как вы повторно используете фактические слои в модели.

Если вы хотите, чтобы у слоя были новые веса, вы должны создать новые слои, а не использовать их в модель. В остальном работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...