问题
我从二进制数据库中读取数据,部分数据是图像掩码中的坐标(x,y)和图像本身。当我知道图像形状和坐标时,面具本身很容易创建。基本上我只需创建一个空白掩码,其形状由读取的图像定义,并在给定坐标处将像素设置为1。所以我基本上想要的是以下内容:
import tensorflow as tf
import numpy as np
# coord read from binary file
x = tf.constant([1])
y = tf.constant([1])
# shape is taken from another image read from binary file
shape = tf.shape(tf.constant(np.ones([3, 3]).astype('float32')))
# create empty image but set (x,y) = 1
mask = tf.zeros(shape)
mask[x, y] = 1
由于TypeError导致失败:
TypeError: 'Tensor' object does not support item assignment
尝试1
tmp = np.zeros([3, 3])
tmp[x, y] = 1
mask = tf.constant([tmp.tolist()])
首先,我认为使用所需数据创建一个numpy数组,然后使用tf.constant()将其转换为张量可能是一个很好的方法。但这导致了问题,即我无法使用张量x,y进行索引。这是因为在创建时这些仅仅是从数据库中读取数据的占位符(当我想从二进制数据中读取大小3x3时,同样的问题将适用)。请注意,在会话中运行张量x和y以获取值是而不是对我来说是一个解决方案,因为我需要数据来训练网络。因此,必须在一次运行调用中获取和处理所有数据。
尝试2
zero_tensor = tf.zeros(shape)
delta = tf.SparseTensor([[1, 1]], [1.0], [3, 3])
mask = zero_tensor + tf.sparse_tensor_to_dense(delta)
sess = tf.Session()
mask_val = sess.run([mask])
print mask_val
在线我找到了一个如何创建稀疏张量并用它来修改张量的解决方案。问题是,掩模的坐标和形状需要硬编码,并且不能在运行时从张量读取中获取。
感谢您的建议。
答案 0 :(得分:0)
你的尝试2 几乎就在那里了!
功能tf.SparseTensor()
或更好的tf.sparse_to_dense(sparse_indices, output_shape, sparse_values)
功能(请参阅doc.)可让您将阅读的数据视为sparse_indices
和output_shape
。< / p>
以下是代码:
import tensorflow as tf
import numpy as np
# coord read from binary file
x = tf.constant([1])
y = tf.constant([1])
# shape is taken from another image read from binary file
shape = tf.constant([3, 3])
# Little modification to get the right shape for the indices
sparse_indices = tf.transpose(tf.pack([x, y]))
mask = tf.sparse_to_dense(sparse_indices, shape, 1.)