Оценка тензоров Tensorflow

#tensorflow #tensorboard #tensorflow-datasets #tensorflow-estimator

#тензорный поток #tensorboard #tensorflow-datasets #tensorflow-оценщик #tensorflow-наборы данных

Вопрос:

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

 grads = tf.gradients(model.output, model.input)
  

где оценки =

 [<tf.Tensor 'gradients_81/dense/MatMul_grad/MatMul:0' shape=(?, 18) dtype=float32>]
  

Это модель, в которой имеется 18 непрерывных входных данных и 1 непрерывный выходной.

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

Я бы использовал

 Test =[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0]
with tf.Session() as sess:
    alpha = sess.run(grads, feed_dict = {model.input : Test})
    print(alpha)
  

Но я получаю ошибку

 FailedPreconditionError (see above for traceback): Error while reading resource variable dense_2/bias from Container: localhost. This could mean that the variable was uninitialized. Not found: Container localhost does not exist. (Could not find resource: localhost/dense_2/bias)
     [[Node: dense_2/BiasAdd/ReadVariableOp = ReadVariableOp[dtype=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](dense_2/bias)]]
  

Что не так?

РЕДАКТИРОВАТЬ: Это то, что происходило раньше:

 def build_model():
    model = keras.Sequential([ 
            ...])
    optimizer = ...
    model.compile(loss='mse'... ) 
    return model 


model = build_model()
history= model.fit(data_train,train_labels,...)
loss, mae, mse = model.evaluate(data_eval,...)
  

Прогресс на данный момент:

 Test =[1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0]

with tf.Session() as sess:
    tf.keras.backend.set_session(sess)
    tf.initializers.variables(model.output)
    alpha = sess.run(grads, feed_dict = {model.input : Test})
  

также не работает, выдавая ошибку:

 TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.
  

Комментарии:

1. Что произойдет, если вы запустите out = sess.run(model.output, feed_dict = {model.input : Test}) ? Я предполагаю, что эта ошибка не имеет отношения к градиентам в частности, но сама модель каким-то образом отсутствует.

2. Если вы позволите ему запускаться в «с tf.Session() как sess:», вы получите «FailedPreconditionError (см. Выше для отслеживания): ошибка при чтении переменной ресурса dense_26 / bias из контейнера: localhost. Это может означать, что переменная была неинициализирована. Не найдено: Контейнер localhost не существует. (Не удалось найти ресурс: localhost/dense_26/смещение) [[Узел: dense_26/BiasAdd/ReadVariableOp = ReadVariableOp[dtype=DT_FLOAT, _device=»/задание: localhost/реплика: 0/задача: 0/ устройство: процессор: 0″](dense_26 / смещение)]]»

Ответ №1:

Вы пытаетесь использовать неинициализированную переменную. Все, что вам нужно сделать, это добавить

 sess.run(tf.global_variables_initializer()) 
  

сразу после with tf.Session() as sess:

Редактировать: Вам необходимо зарегистрировать сеанс в Keras

 with tf.Session() as sess:
    tf.keras.backend.set_session(sess)
  

И использовать tf.initializers.variables(var_list) вместо tf.global_variables_initializer()

See https://blog.keras.io/keras-as-a-simplified-interface-to-tensorflow-tutorial.html

Редактировать:

 Test = np.ones((1, 18), dtype=np.float32)

inputs = layers.Input(shape=[18,])
layer = layers.Dense(10, activation='sigmoid')(inputs)
model = tf.keras.Model(inputs=inputs, outputs=layer)
model.compile(optimizer='adam', loss='mse')
checkpointer = tf.keras.callbacks.ModelCheckpoint(filepath='path/weights.hdf5')
model.fit(Test, nb_epoch=1, batch_size=1, callbacks=[checkpointer])
grads = tf.gradients(model.output, model.input)

with tf.Session() as sess:
    tf.keras.backend.set_session(sess)
    sess.run(tf.global_variables_initializer())
    model.load_weights('path/weights.hdf5')
    alpha = sess.run(grads, feed_dict={model.input: Test})
    print(alpha)
  

Это показывает согласованный результат

Комментарии:

1. Здравствуйте, это не работает. Если вы примените его несколько раз, он всегда будет давать разные результаты для одного и того же ввода. У меня такое ощущение, что это инициализирует все веса. Но веса должны быть фиксированными, так как они были тренированы ранее.

2. Я думаю, что это другая проблема. Если вы попробуете это на синтетических постоянных данных, это покажет тот же результат. Как вы загружаете model.output?

3. Я использую model = build_model(), а затем model.fit() и model.evaluate(). Сама модель является последовательной моделью Keras. Я записал это в вопрос.

4. Это должно быть нормально для вашего случая

5. Спасибо. Должен ли я использовать это в «с tf.Session() как sess»? И какие переменные я должен поместить в var_list, если я не хочу перезаписывать веса, обученные в модели?