Определены ли градиенты для операций, определенных в операциях с массивами в Tensorflow? - PullRequest
0 голосов
/ 10 сентября 2018

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

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

Это моя пользовательская функция потерь:

def calculate_additional_loss(y_true,y_pred):
#additional loss
x_decoded_normalized = original_dim* y_pred
#y_true = K.print_tensor(y_true, message='y_true = ')
#y_pred = K.print_tensor(y_pred, message='y_pred = ')
error = tf.constant(0, dtype= tf.float32)
additional_loss= tf.constant(0, dtype= tf.float32)
final_loss= tf.constant(0, dtype= tf.float32)
for k in range(batch_size):
    #add padding
    reshaped_elem_1 = K.reshape(x_decoded_normalized[k], [DIM,DIM])

    a = K.reshape(reshaped_elem_1[:,DIM-1], [DIM,1])
    b = K.reshape(reshaped_elem_1[:,1], [DIM,1])

    reshaped_elem_1 = tf.concat ([b,reshaped_elem_1], axis= 1)
    reshaped_elem_1 = tf.concat ([reshaped_elem_1,a], axis= 1)

    c= K.reshape(reshaped_elem_1[DIM-1,:], [1,DIM+2])
    d= K.reshape(reshaped_elem_1[1,:], [1,DIM+2])
    reshaped_elem_1 = tf.concat ([d,reshaped_elem_1],axis=0)
    reshaped_elem_1 = tf.concat ([reshaped_elem_1,c],axis=0)

    for (i,j) in range(reshaped_elem_1.shape[0],reshaped_elem_1.shape[1]):
        error = tf.add(error, tf.pow((reshaped_elem_1[i,j]- 
                       reshaped_elem_1[i,j+1]),-2), 
                       tf.pow((reshaped_elem_1[i,j]-reshaped_elem_1[i,j- 
                       1]),-2), tf.pow((reshaped_elem_1[i,j]- 
                       reshaped_elem_1[i-1,j]),-2), 
                       tf.pow((reshaped_elem_1[i,j]-reshaped_elem_1[i+1,j]),-2))
    additional_loss = tf.add(additional_loss, tf.divide(error, original_dim))
final_loss += tf.divide(additional_loss, batch_size)
print('final_loss', final_loss)
return final_loss

, и этогде я это называю:

models = (encoder, decoder)
additional_loss = calculate_additional_loss(inputs,outputs)
vae.add_loss(additional_loss)
vae.compile(optimizer='adam')
vae.summary()

plot_model(vae,to_file='vae_mlp.png',show_shapes=True)
vae.fit(x_train, epochs=epochs, batch_size=batch_size, validation_data=(x_test, None), verbose = 1, callbacks=[CustomMetrics()])

Заранее спасибо.

1 Ответ

0 голосов
/ 10 сентября 2018

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

Сказав это, я вижу в вашем коде пару ошибок:

  1. final_loss определяется как tf.constant, но вы пытаетесь увеличить его.
  2. Вы принимаете кортеж от range
  3. error определяется как tf.constant, но вы пытаетесь увеличить его.
  4. Не используйте цикл for таким образом над batch_size. Вместо этого используйте функции TensorFlow для непосредственной обработки размера batch. Таким образом, вы просто размножаете свои узлы.
  5. То, как вы написали свой код, заставляет меня думать, что вы думаете о TensorFlow как о чистом питоне. Это не. Вы определяете график, а затем выполняете его внутри сеанса. Итак, в функции используйте функции TF, чтобы просто определить вычисления.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...