В настоящее время я работаю над нейронной сетью, которая принимает некоторые входы и возвращает 2 выхода.Я использовал 2 выхода в задаче регрессии, где они представляют собой 2 координаты, X и Y. Моя задача не требует значений X и Y, но угол, к которому она обращена, равен atan2 (y, x).
Iя пытаюсь создать пользовательскую метрику keras и функцию потерь, которая выполняет операцию atan2 между элементами прогнозируемого и истинного тензора, чтобы лучше обучить сеть моей задаче.
Форма выводатензор в метрике равен [?, 2], и я хочу создать функцию, в которой я могу пройти через тензор и применить к нему atan2 (тензор [itr, 1], тензор [itr, 0]), чтобы получить массив других тензоров.
- Я пытался использовать tf.slit и tf.slice
- Я не хочу преобразовывать его в массив с единым целым и обратно в тензорный поток по соображениям производительности.
- Я попытался получить форму тензоров с помощью 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 ()на обоих из них и, наконец, сделайте из них еще один тензор, чтобы следовать другим вычислениям и передать пользовательские потери.