TF:从二进制数据读取创建掩码(项目分配)

时间:2016-05-24 10:19:31

标签: python tensorflow

问题

我从二进制数据库中读取数据,部分数据是图像掩码中的坐标(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

在线我找到了一个如何创建稀疏张量并用它来修改张量的解决方案。问题是,掩模的坐标和形状需要硬编码,并且不能在运行时从张量读取中获取。

感谢您的建议。

1 个答案:

答案 0 :(得分:0)

你的尝试2 几乎就在那里了!

功能tf.SparseTensor()或更好的tf.sparse_to_dense(sparse_indices, output_shape, sparse_values)功能(请参阅doc.)可让您将阅读的数据视为sparse_indicesoutput_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.)