当我意识到,即使我在for循环中关闭当前的Session,我的程序也会大量减速并且由于构造操作而导致内存泄漏,我只是尝试了一些四元数神经网络的东西.这是我的代码:
for step in xrange(0,200):#num_epochs * train_size // BATCH_SIZE):
338
339 with tf.Session() as sess:
340
341 offset = (BATCH_SIZE) % train_size
342 #print "Offset : %d" % offset
343
344 batch_data = []
345 batch_labels = []
346 batch_data.append(qtrain[0][offset:(offset + BATCH_SIZE)])
347 batch_labels.append(qtrain_labels[0][offset:(offset + BATCH_SIZE)]
352 retour = sess.run(test, feed_dict={x: batch_data})
357
358 test2 = feedForwardStep(retour, W_to_output,b_output)
367 #sess.close()
Run Code Online (Sandbox Code Playgroud)
问题似乎来自test2 = feedForward(..).我需要在执行retour一次后声明这些操作,因为retour不能是占位符(我需要遍历它).没有这一行,程序运行得非常好,速度快,没有内存泄漏.我无法理解为什么TensorFlow似乎试图"保存" test2即使我关闭会话......
我目前正在使用 Tensorflow 开发四元数神经网络(我想使用 GPU)。TensorFlow 不支持四元数,但您可以将其表示为 4x4 实数矩阵,因此可以在 TensorFlow 中构建这样的神经网络。
有没有一种简单的方法来添加自定义操作或对张量进行自定义操作?
例如,我可以写:
output_activation = tf.nn.softmax(tf.matmul(hidden_activation, Weight_to_ouput))
Run Code Online (Sandbox Code Playgroud)
……这很酷!您所要做的就是添加一个损失函数,然后进行反向传播。但是,我想用四元数做同样的事情,例如:
output_activation = mySigmoid(myFunction(hidden_activation, Weight_to_output))
Run Code Online (Sandbox Code Playgroud)
但是,我需要将四元数转换为张量或将其转换为张量以优化 GPU 计算。所以我需要创建一个函数来获取一些张量作为参数并返回转换后的张量。我看过py_func,但似乎你不能返回张量。
我尝试了以下方法,但失败了:
def layerActivation(inputTensor,WeightTensor):
newTensor = tf.matmul(inputTensor,WeightTensor)
return newTensor
Run Code Online (Sandbox Code Playgroud)
...并在main():
x = placeholder ...
W_to_hidden = tf.Variable
test = tf.py_func(layerActivation, [x,_W_to_hidden], [tf.float32])
with tf.Session() as sess:
tf.initialize_all_variables().run()
king_return = sess.run(test, feed_dict={x: qtrain})
Run Code Online (Sandbox Code Playgroud)
错误:未实现:不支持的对象类型张量
理想情况下,我可以output_activation在 TensorFlow 的标准反向传播算法中使用它,但我不知道是否可行。
我只是想在C++中计算一个好的sigmoid函数(并且效率很高).所以我必须这样做:
1/(1 + exp(-x))
问题是,当X变大(或甚至很小)时,结果1 + e变为0或1
例如,
1 + exp(-30) = 1
但这是不正确的......
我们如何轻松有效地添加非常小(或大)的数字?
我正在使用的数据类型:double
这是代码片段:
double Quaternion::sigmoidReal(double v){
return 1.0 / ( 1.0 + exp(-v) ) ;
}
Run Code Online (Sandbox Code Playgroud)
谢谢 !