Python tensorflow是否将\u转换为\u?tensor是否进行内存复制?

Python tensorflow是否将\u转换为\u?tensor是否进行内存复制?,python,numpy,tensorflow,Python,Numpy,Tensorflow,我正在基于ndarray列表对象创建一个tensorflow常量。我的理解是,tensor本身不会对底层数据进行内存拷贝,而是使用相同的底层ndarray数据创建python对象。然而,在运行一个小测试之后,它似乎确实复制了数据 def mem_test(): printMemUsed("before r list") r = ['Supporter'] * 100000000 printMemUsed("after r list") r_arr = np.array(r)

我正在基于ndarray列表对象创建一个tensorflow常量。我的理解是,tensor本身不会对底层数据进行内存拷贝,而是使用相同的底层ndarray数据创建python对象。然而,在运行一个小测试之后,它似乎确实复制了数据

def mem_test():
  printMemUsed("before r list")
  r = ['Supporter'] * 100000000
  printMemUsed("after r list")
  r_arr = np.array(r)
  printMemUsed("after nd_array")
  tf.convert_to_tensor(r_arr)
  printMemUsed("after tensor conversion")

def printMemUsed(discript):
    print("{}:\t{}".format(discript, psutil.virtual_memory().used))
以下是输出:

before r list:  727310336 -> 727 Mb
after r list:   1528782848 -> 1.5 GB
after nd_array: 2430574592 -> 2.4 GB
after tensor conversion:        8925667328 -> 8.9 GB

编辑:r_arr的数据类型为'S9'(以null结尾的字符串)。将输入数组元素更改为“unicode”(U9)类型后,nd_数组

tf之后,虚拟内存消耗增加到5 GB。convert_to_tensor
使用一个
\u tensor_conversion_func_注册表
为不同的输入类型注册转换函数。对于Python列表、tuple和numpy nd.array,这种情况在中发生。 根据答案
tf.constant
至少创建两个副本

为什么tf.constant()的值会多次存储在内存中

因为常数张量的数据嵌入到图形定义中。这意味着该数据存储在维护图形定义的客户端和为所有张量分配内存的运行时中:

编辑:


根据答案,一个选项是使用
tf.Variable
并用
tf.placeholder
tf初始化它。convert\u to\u tensor
使用
\u tensor\u conversion\u func\u注册表
为不同的输入类型注册转换函数。对于Python列表、tuple和numpy nd.array,这种情况在中发生。 根据答案
tf.constant
至少创建两个副本

为什么tf.constant()的值会多次存储在内存中

因为常数张量的数据嵌入到图形定义中。这意味着该数据存储在维护图形定义的客户端和为所有张量分配内存的运行时中:

编辑:


根据答案,一个选项是使用
tf.Variable
,并用
tf.placeholder

初始化它
r\u arr
dtype
转换的结果是什么<代码>转换为张量
没有说明复制与否;你在哪里读到的?r_arr的数据类型是S9,tensorflow的数据类型是常量。我读到tensorflow没有复制数据,只是围绕底层数据创建了一个包装器/数据结构
r\u arr
dtype
转换的结果是什么<代码>转换为张量
没有说明复制与否;你在哪里读到的?r_arr的数据类型是S9,tensorflow的数据类型是常量。我读到tensorflow没有复制数据,只是围绕底层数据创建了一个包装器/数据结构