Tensorflow修改张量特定位置元素的值

张量和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 np

class 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 类型,一个不是,必然会报错。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值