переменные, включая веса в модели Кераса, которые я хотел оставить нетронутыми.

as как упрощенный интерфейс для TensorFlow: учебное пособие они описывают, как можно назвать модель Кераса на тензоре TensorFlow.Они также говорят:

from keras.models import Sequential

model = Sequential()
model.add(Dense(32, activation='relu', input_dim=784))
model.add(Dense(10, activation='softmax'))

# this works! 
x = tf.placeholder(tf.float32, shape=(None, 784))
y = model(x)

Примечание: вызывая модель Keras, вы повторно используете и ее архитектуру, и ее веса. Когда вы вызываете модель для тензора, вы создаете новые операции TF поверх входного тензора, и эти операции повторно используют экземпляры TF Variable, уже присутствующие в модели.

Я интерпретирую это так, что веса модели будут одинаковыми в

 как в модели. Однако для меня кажется, что веса в результирующем узле Tensorflow переинициализированы. Минимальный пример можно увидеть ниже:yПочему я хочу сделать это:

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
# Create model with weight initialized to 1
model = Sequential()
model.add(Dense(1, input_dim=1, kernel_initializer='ones',
                bias_initializer='zeros'))
model.compile(loss='binary_crossentropy', optimizer='adam',
              metrics=['accuracy'])

# Save the weights 
model.save_weights('file')

# Create another identical model except with weight initialized to 0
model2 = Sequential()
model2.add(Dense(1, input_dim=1, kernel_initializer='zeros',
                 bias_initializer='zeros'))
model2.compile(loss='binary_crossentropy', optimizer='adam',
               metrics=['accuracy'])
# Load the weight from the first model
model2.load_weights('file')
# Call model with Tensorflow tensor
v = tf.Variable([[1, ], ], dtype=tf.float32)
node = model2(v)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
print(sess.run(node), model2.predict(np.array([[1, ], ])))
# Prints (array([[ 0.]], dtype=float32), array([[ 1.]], dtype=float32))
Я хочу использовать обученную сеть в другой схеме минимизации, где сеть "наказывает" места в пространстве поиска, которые не разрешены. Поэтому, если у вас есть идеи, не связанные с этим конкретным подходом, это также очень ценится.

Наконец-то нашел ответ. Есть две проблемы в примере из вопроса.

Ответы на вопрос(1)

Решение Вопроса

Первым и самым очевидным было то, что я назвал

 функция, которая будет повторно инициализировать все переменные в сеансе. Вместо этого я должен был назватьtf.global_variables_intializer() гдеtf.variables_initializer(var_list) список переменных для инициализацииvar_list2:

Вторая проблема заключалась в том, что Keras не использовал тот же сеанс, что и собственные объекты Tensorflow. Это означало, что для возможности запуска объекта tenorflow

 с моей сессииmodel2(v) это нужно было повторно инициализировать. Очередной разsessКерас как упрощенный интерфейс к тензорному потоку: Учебное пособие смог помочьМы должны начать с создания сеанса TensorFlow и регистрации его в Keras. Это означает, что Keras будет использовать зарегистрированный нами сеанс для инициализации всех переменных, которые он создает внутри.

Если мы применим эти изменения к примеру, приведенному в моем вопросе, мы получим следующий код, который делает именно то, что от него ожидается.

import tensorflow as tf
sess = tf.Session()

from keras import backend as K
K.set_session(sess)

Заключение:

from keras import backend as K
from keras.models import Sequential
from keras.layers import Dense
sess = tf.Session()
# Register session with Keras
K.set_session(sess)
model = Sequential()
model.add(Dense(1, input_dim=1, kernel_initializer='ones',
                bias_initializer='zeros'))
model.compile(loss='binary_crossentropy', optimizer='adam',
              metrics=['accuracy'])
model.save_weights('test')

model2 = Sequential()
model2.add(Dense(1, input_dim=1, kernel_initializer='zeros',
                 bias_initializer='zeros'))
model2.compile(loss='binary_crossentropy', optimizer='adam',
               metrics=['accuracy'])
model2.load_weights('test')
v = tf.Variable([[1, ], ], dtype=tf.float32)
node = model2(v)
init = tf.variables_initializer([v, ])
sess.run(init)
print(sess.run(node), model2.predict(np.array([[1, ], ])))
# prints: (array([[ 1.]], dtype=float32), array([[ 1.]], dtype=float32))
Урок заключается в том, что при смешивании Tensorflow и Keras убедитесь, что все используют один и тот же сеанс.

Что не так с использованием

 Imran Rashid07 авг. 2018 г., 13:09
 в твоем примере?tf.global_variables_initializer()@ImranRashid tf.global_variables_initializer () выполнит повторную инициализацию
 Emil Johansson13 авг. 2018 г., 17:12
все переменные, включая веса в модели Кераса, которые я хотел оставить нетронутыми.Вызов модели Keras для тензора TensorFlow, но с сохранением

Ваш ответ на вопрос