对于循环' NoneType' TensorFlow尺寸

时间:2017-03-15 18:12:55

标签: python tensorflow neural-network deep-learning tensorflow-serving

我在TensorFlow中实现了一种新类型的NN。不同之处在于评估功能,因此我不会调用tf.matmul(),而是调用我自己的函数,我们将调用My_Function(A)

下面可以看到代码片段,其中A是左边的张量乘以这个新的NN实现,位于右侧。等效张量流代码为tf.matmul(A, this_new_NN)

def My_Function(self, A):
    dims = A.get_shape().as_list()
    shape = [dims[0], self.m] # Defining shape of resulting tensor
    X = tf.placeholder(tf.float32, shape=[shape[0], shape[1]])
    result = tf.zeros(tf.shape(X), dtype=tf.float32)
    for xyz in self.property:
        # Do some computation between A and xyz, xyz is a property of this_new_NN
        # resulting to temp_H with dimension [shape[0], xyz.m] of type tf.tensor
        dims_H = temp_H.get_shape().as_list()
        indices = [[i,j] for i in range(0, dims_H[0]) for j in range(xyz.k, xyz.k+dims_H[1])]
        # indices is a list of indices to update in "result"
        values = tf.reshape(temp_H, [-1]) # Values in temp_H as 1D list
        delta = tf.SparseTensor(indices, values, shape)
        result += tf.sparse_tensor_to_dense(delta)
    return result

现在我遇到的问题是在我计算indices的行中,我收到了错误

TypeError: 'NoneType' object cannot be interpreted as an integer

现在,我明白这个错误意味着您不能在None类型上迭代for循环,但我遇到的问题是测试集和训练集具有batch_size的不同值。这意味着当我去创建result时,第一个维度是未知的,这就是它为None类型的原因。

但是,为了获得我必须在result中更新的索引,我必须使用for循环生成这些值作为列表以提供给delta我创建的作为tf.SparseTensor,因此可以将其添加到result

我的问题是,获得指数的最佳方法是什么?我尝试用dims_H[0]对象替换for循环中的tf.placeholder(tf.int32),然后我在运行会话时只传递大小,但是我得到错误

TypeError: 'Tensor' object cannot be interpreted as an integer

非常感谢任何帮助。

编辑:

仅供参考,此代码以下列方式调用,其中M是由tf.Variable值组成的预构建的新NN。

Y1 = tf.nn.relu(M.My_Function(A) + B1)

其中B1是此图层的偏移量,A是输入图层。

EDIT2:

每次调用 result时,

My_Function都应为零张量。但是,我怀疑它是在每个函数调用时保留result的值。如果这是对的,请让我知道我需要做些什么来改变它。

EDIT3:

定义A时,定义为

X1 = tf.placeholder(tf.float32, [None, 28, 28, 1])
A = tf.reshape(X1, [-1, 28*28])

由于A的维度在训练数据和测试数据之间发生变化。

先谢谢!

1 个答案:

答案 0 :(得分:0)

我刚试过这个

>>> range(None, 0)
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    range(None, 0)
TypeError: 'NoneType' object cannot be interpreted as an integer

检查xyz.k是否不是None