我在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
的维度在训练数据和测试数据之间发生变化。
先谢谢!
答案 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
。