我在TensorFlow中實現了一種新型的NN。區別在於評估函數,所以不要致電tf.matmul()
,而是調用我自己的函數,我們將其稱爲My_Function(A)
。For'overType'循環TensorFlow尺寸
代碼片段可以在下面看到,其中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
。
我的問題是,獲得指數的最佳方法是什麼?我曾嘗試用tf.placeholder(tf.int32)
對象,而不是,在那裏我會再只是通過大小,當我運行會話替換dims_H[0]
在for循環,但我得到的
TypeError: 'Tensor' object cannot be interpreted as an integer
任何幫助的錯誤,將不勝感激。
編輯:
僅供參考,這段代碼被稱爲按以下方式,其中M
是一個預建新NN由具有tf.Variable
值。
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
變化的尺寸。
感謝先進!
不是。當'A'的尺寸固定時,我的代碼功能完美。但是,當尺寸固定時,我無法在測試和訓練數據上運行它。 – Cmertin
問題來自'dim_H [0]'爲'None',這個值來自'shape [0]',它是'A'的第一維,它的類型爲'None'。 我已經添加了另一個編輯來顯示如何創建'A'。 – Cmertin