Как перебрать тензор неизвестного размера и выполнить тензорные операции над его элементами? - PullRequest
0 голосов
/ 18 мая 2019

В настоящее время я работаю над нейронной сетью, которая принимает некоторые входы и возвращает 2 выхода.Я использовал 2 выхода в задаче регрессии, где они представляют собой 2 координаты, X и Y. Моя задача не требует значений X и Y, но угол, к которому она обращена, равен atan2 (y, x).

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

Форма выводатензор в метрике равен [?, 2], и я хочу создать функцию, в которой я могу пройти через тензор и применить к нему atan2 (тензор [itr, 1], тензор [itr, 0]), чтобы получить массив других тензоров.

  1. Я пытался использовать tf.slit и tf.slice
  2. Я не хочу преобразовывать его в массив с единым целым и обратно в тензорный поток по соображениям производительности.
  3. Я попытался получить форму тензоров с помощью tenor.get_shape (). As_list () и выполнить итерацию по ней.
self.model.compile(loss="mean_absolute_error",
               optimizer=tf.keras.optimizers.Adam(lr=0.01),
               metrics=[vect2d_to_angle_metric])

# This is the function i want to work on
def vect2d_to_angle_metric(y_true, y_predicted):
    print("y_true = ", y_true)
    print("y_predicted = ", y_predicted)
    print("y_true shape = ", y_true.shape())
    print("y_predicted shape = ", y_predicted.shape())

Печать из вышеприведенной функции:

y_true =  Tensor("dense_2_target:0", shape=(?, ?), dtype=float32)
y_predicted =  Tensor("dense_2/BiasAdd:0", shape=(?, 2), dtype=float32)
y_true shape =  Tensor("metrics/vect2d_to_angle_metric/Shape:0", shape=(2,), dtype=int32)
y_predicted shape =  Tensor("metrics/vect2d_to_angle_metric/Shape_1:0", shape=(2,), dtype=int32)

Python-псевдокод функцииЯ хочу применить к функции tenorflow

 def evaluate(self):
        mean_array = []
        for i in range(len(x_test)):
            inputs = x_test[i]
            prediction = self.model.getprediction(i)
            predicted_angle = np.arctan2(result[i][1], result[i][0])
            real_angle = np.arctan2(float(self.y_test[i][1]), float(self.y_test[i][0]))
            mean_array.append(([abs(predicted_angle - real_angle)]/real_angle) * 100)
            i += 1

Я ожидаю сдвинуть две стороны тензора [i] [0] и [i] [1] и к функции tf.atan2 ()на обоих из них и, наконец, сделайте из них еще один тензор, чтобы следовать другим вычислениям и передать пользовательские потери.

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