如何遍历未知大小的张量并对元素进行张量操作?

时间:2019-05-17 22:05:11

标签: python tensorflow keras tensor loss-function

我目前正在研究一个接受一些输入并返回2个输出的神经网络。我在回归问题中使用了2个输出,它们都是2个坐标,即X和Y。 我的问题不需要X和Y值,但它面对的角度是atan2(y,x)。

我试图创建一个自定义的keras度量标准和一个损失函数,以便在预测张量和真实张量的元素之间进行atan2运算,以便更好地对网络进行训练。

输出张量的度量单位为[?,2],我想做一个函数,可以遍历张量并在其上应用atan2(tensor [itr,1],tensor [itr,0])它得到另一个张量的数组。

  1. 我尝试使用tf.slit和tf.slice
  2. 由于性能原因,我不想将其转换为numpy数组并返回到tensorflow。
  3. 我试图使用tensor.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)

我想应用于tensorflow函数的功能的Python伪代码

 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()函数上,最后从它们中制作出另一个张量,以便然后进行其他计算并传递自定义损失。

0 个答案:

没有答案