Tensorfly_最专注的机器学习社区,tensorflow研究者社区

查看: 2611|回复: 0

gradient error test

[复制链接]

1

主题

2

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2016-5-16 11:40:49 | 显示全部楼层 |阅读模式
本帖最后由 Iven 于 2016-5-16 11:42 编辑

Hi 各位,想請問一下再tensorflow中新增一個OP之後返回的Gradient的寫法
我自己寫了test case使用tf.test.compute_gradient_error,
其計算結果印出錯誤如下

錯誤訊息

  FAIL: test_grad (main.ZeroOut2Test) Traceback (most recent call  last):   File "test_case.py", line 42, in test_grad      self.assertLess(err, 1e-4) AssertionError: 0.0072760284 not less than 0.0001

我已經用微分去計算了gradient的delta

要如何讓這個測試項會pass呢?

OP有兩個input 跟兩個output
Input1 data
Input2 truthdata
output1 loss
output2 delta(gradient)

Here is the op code
    #include "tensorflow/core/framework/op.h"
   
    REGISTER_OP("DetectionOut")
        .Attr("T: {float}")
        .Input("detect: T")
        .Input("truthdata: T")
        .Output("loss: T")
        .Output("delta: T");
   
   
    #include "tensorflow/core/framework/op_kernel.h"
   
    using namespace tensorflow;
   
    typedef Eigen::ThreadPoolDevice CPUDevice;
    typedef Eigen::GpuDevice GPUDevice;
   
    template <typename Device, typename T>
    class DetectionOutOp : public OpKernel {
     public:
      explicit DetectionOutOp(OpKernelConstruction* context) : OpKernel(context) {}
   
      void Compute(OpKernelContext* context) override {
        // Grab the input tensor
        const Tensor& input_tensor = context->input(0);
        auto PreDetection = input_tensor.flat<T>();
   
        const Tensor& input_tensor1 = context->input(1);
        auto TruthData = input_tensor1.flat<T>();
   
        // Create an output tensor
        Tensor* output_tensor = NULL;
        OP_REQUIRES_OK(context, context->allocate_output(0, TensorShape({input_tensor.dim_size(0)}),
                                                         &output_tensor));
        auto loss = output_tensor->template flat<T>().setZero();
   
        Tensor* output_tensor1 = NULL;
        OP_REQUIRES_OK(context, context->allocate_output(1, input_tensor.shape(),
                                                         &output_tensor1));
        auto back_detl = output_tensor1->template flat<T>().setZero();
   
        const int N = PreDetection.size();
   
        const int64 batch_size_ =  input_tensor.dim_size(0);
        const int64 bottom_count_ = input_tensor.dim_size(1);
        int b,i;
        for (b = 0; b < batch_size_ ; ++b){
            int index = b * bottom_count_;
            for (i = 0; i < bottom_count_; ++i) {
                loss(b) +=  pow(PreDetection(index+i)-TruthData(index+i), 2);
                back_detl(index+i) = 2 *(PreDetection(index+i) - TruthData(index+i));
            }
        }
      }
    };
   
    #define REGISTER_KERNEL(T)                                      \
      REGISTER_KERNEL_BUILDER(                                      \
          Name("DetectionOut").Device(DEVICE_CPU).TypeConstraint<T>("T"), \
          DetectionOutOp<CPUDevice, T>);
   
    REGISTER_KERNEL(float);
    #undef REGISTER_KERNEL

#if GOOGLE_CUDA
REGISTER_KERNEL_BUILDER(Name("DetectionOut")
    .Device(DEVICE_GPU)
    .TypeConstraint<float>("T"),
    DetectionOutOp<GPUDevice, float>);
#endif  // GOOGLE_CUDA



Here is TestCase.py
import tensorflow as tf
import numpy as np

from tensorflow.python.framework import ops
from tensorflow.python.ops import array_ops
from tensorflow.python.ops import sparse_ops

D2Test = np.zeros((2,7*7*(15)),float)
D2Truth = np.zeros((2,7*7*(15)),float)

items = 1
coord = 4
num = 2
class_num = 5
localsize = 49

object_index = (class_num) * localsize + items
tobject_index = (class_num) * localsize + items

D2Truth[0,tobject_index] = 1.0
D2Test[0,object_index] = 0.5


@ops.RegisterGradient("DetectionOut")
def _detection_out_grad(op, grad, grad1):
  mat = op.outputs[1]
  vec = array_ops.expand_dims(grad, -1)
  vec = vec * mat
  return [vec, None]

detection_module = tf.load_op_library('detection.so')

class ZeroOut2Test(tf.test.TestCase):
  def test_grad(self):
    with self.test_session():
      shape=(2,7*7*(15))
      shape1=(2,)
      x = tf.constant(D2Test, dtype=tf.float32)
      y = tf.constant(D2Truth, dtype=tf.float32)
      result = detection_module.detection_out(x,y)
      err = tf.test.compute_gradient_error(x, shape, result[0], shape1)
      self.assertLess(err, 1e-4)

if __name__ == '__main__':
  tf.test.main()

請知道的各位提點一下,謝謝

   

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Tensorflow中文社区  

GMT+8, 2017-3-30 22:54 , Processed in 0.022974 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表