张量和array一样可以通过切片获取,但是张量不可以直接修改某个值。
可以理解为张量具有“只读”的模式
。
如果按照数组修改某个值的方式处理的话,会报错:
import tensorflow as tf
tensor_1 = tf.constant([x for x in range(1,10)])
tensor_1[4] = 0 # TypeError: 'Tensor' object does not support item assignment
解决方法:
将张量切片,再拼接。比如:
tensor_1 = tf.constant([x for x in range(1,10)])
# 切片
part1 = tensor_1[:4]
part2 = tf.constant([0]) # 要修改的元素
part3 = tensor_1[5:]
# 拼接
new_tensor = tf.concat([part1,part2,part3], axis=0)
值得注意的一点:如果在进行这样的操作的时候代码报错,记得检查每个 part 的维度,大概率是维度这里出了问题。
牢记:原来张量是几维,最后要拼成几维。
(比如你的张量是3维的,先要切分成三个2维的,再将二维张量切成1维,修改拼接成2维,再拼接成3维)
下面举一个三维拼接的例子:
import tensorflow as tf
import numpy as npclass tttest():def __init__(self):self.tensor_1 = tf.placeholder(tf.int32, [None, 3])self.part1 = self.tensor_1[:3]self.part2 = self.tensor_1[3]self.part2_1 = self.part2[:1]self.part2_2 = tf.constant([10])self.part2_3 = self.part2[2:]self.part2 = tf.expand_dims(tf.concat([self.part2_1, self.part2_2, self.part2_3], axis=0),0)self.part3 = self.tensor_1[4:]self.t = tf.concat([self.part1, self.part2, self.part3], axis=0) # 这样写是正确的# self.tensor_1 = tf.concat([self.part1, self.part2, self.part3], axis=0) # 这样会报错with tf.Session() as sess:init = tf.global_variables_initializer()sess.run(init)fd = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9]])a = tttest()print("tensor_1", sess.run(a.part1, {a.tensor_1:fd}))print("tensor_2", sess.run(a.part2, {a.tensor_1:fd}))print("tensor_3", sess.run(a.part3, {a.tensor_1:fd}))print("tensor_3", sess.run(a.t, {a.tensor_1: fd}))
其中,如果将修改后的值还是赋给 tensor_1 会报错如下:
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder' with dtype int32 and shape [?,3][[Node: Placeholder = Placeholder[dtype=DT_INT32, shape=[?,3], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
关于placeholder需要注意的是
:不可以重新赋值给placeholder类型的,因为这样会使得 feedfic 的时候 tensorflow 找到两个名字一样但是一个是 placeholder 类型,一个不是,必然会报错。