【问题标题】:preprocess_input changes array inplace, but doesn't change tensorpreprocess_input 更改数组,但不更改张量
【发布时间】:2022-09-22 21:22:33
【问题描述】:

我注意到preprocess_input 中有一些奇怪的行为,该函数用于预处理图像以正确标准化您正在使用的特定预训练网络的值。 经过几个小时的调试,似乎当一个张量用作输入时,输入张量是未修改的,它将处理后的输入作为一个新的张量返回:

tensor = tf.ones(3)*100
print(tensor)
tensor2 = tf.keras.applications.mobilenet_v2.preprocess_input (tensor)
print(tensor)
print(tensor2)

返回

tf.Tensor([100. 100. 100.], shape=(3,), dtype=float32)
tf.Tensor([100. 100. 100.], shape=(3,), dtype=float32)
tf.Tensor([-0.21568626 -0.21568626 -0.21568626], shape=(3,), dtype=float32)

但是,当执行完全相同的操作但使用 numpy 数组作为输入时,除了将处理后的版本作为新数组返回之外,原数组更改为与新数组相同

array = np.ones(3)*100
print(array)
array2 = tf.keras.applications.mobilenet_v2.preprocess_input (array)
print(array)
print(array2)
array+=1
print(array)
print(array2)

返回

[100. 100. 100.]
[-0.21568627 -0.21568627 -0.21568627]       # <== input has changed!!!
[-0.21568627 -0.21568627 -0.21568627]
[0.78431373 0.78431373 0.78431373]
[0.78431373 0.78431373 0.78431373]          # <== further changes to input change output

三个问题:

  1. 为什么行为不一致?
  2. 为什么认为更改原始数组是有益的?
  3. 为什么 preprocess_input 既返回新值又就地修改 - 通常不是其中之一,两者都做令人困惑...

    标签: python tensorflow keras tensorflow2.0 tf.keras


    【解决方案1】:

    公平地说,docs 确实提到了这种行为:

    预处理数据覆盖输入数据,如果数据 类型是兼容的。为了避免这种行为, numpy.copy(x) 可以 用过的。

    所以那种答案 Q1 - 张量是不可变的,所以不能被覆盖,而不是可变的 np 数组,所以可以就地更改。

    注意:这不是一个很好的答案——如果这个函数会在张量上大量使用,那么它的行为肯定应该被修复,这样即使在数组上它也会表现相同。 IE。它不应该曾经更改输入,使其行为一致,人们会知道会发生什么。

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 2016-03-15
      • 2018-10-23
      相关资源
      最近更新 更多