2017-11-28 8 views
0

TensorFlow에서 "훼이크"양자화 함수 중 하나를 내 텐서 중 하나에 적용하고 싶습니다. 구체적으로 나는 this 기능을 사용하여에 관심이 있어요 : 그것은 상자 밖으로 잘 작동실행 시간에 다른 텐서를 수정하기 위해 텐서 값을 사용하십시오.

fake_quant_with_min_max_args(
    inputs, 
    min=-6, 
    max=6, 
    num_bits=8, 
    narrow_range=False, 
    name=None 
    ) 

. 이상적으로 입력 텐서에 따라 minmax 인수를 조정하고 싶습니다. 구체적으로, 범위를 정의하려면 99.7% rule을 사용하고 싶습니다. 즉, 입력 된 텐서를 1 차원 벡터로 표현하면 그 요소의 99.7 %가 [평균 -3 * 표준, 평균 +3 * 표준] 사이에 놓이는 값의 범위를 사용하고자합니다. 범위. 이를 위해

나는 다음을 수행하십시오

def smartFakeQuantization(tensor): 
    # Convert the input tensor to a 1-d tensor 
    t_1d_data = tf.reshape(tensor,[tf.size(tensor), 1]) 
    # get the moments of that tensor. Now mean and var have shape (1,) 
    mean, var = tf.nn.moments(t_1d_data, axes=[0]) 
    # get a tensor containing the std 
    std = tf.sqrt(var) 

    < some code to get the values of those tensors at run-time> 

    clip_range = np.round([mean_val - 3*std_val, mean_val + 3*stdstd_val], decimals=3) 
    return tf.fake_quant_with_min_max_args(tensor, min=clip_range[0], max=clip_range[1]) 

내가 수행하여 그래프의 모든 텐서를 평가할 수 있다는 것을 알고 myTensor.eval() 또는 mySession.run(myTensor)을하지만 난 그 위에 옆에 라인 내 기능을 그 종류를 추가하는 경우 그래프를 실행할 때 충돌합니다. 다음 형식의 오류가 발생합니다.

텐서 < ...> 가져올 수 없음으로 표시되었습니다.

아마 TensorFlow의 "그래프"특성에 맞는 단계는 아닙니다. 이것이 어떻게 이루어질 수있는 아이디어가 있습니까? 요약하면, 다른 텐서를 수정하기 위해 런타임에 텐서 값을 사용하고 싶습니다. 나는이 문제가 tf.cond()으로 할 수있는 것보다 더 복잡하다고 말한다.

+0

나는 문제를 조금 좁혔다 고 생각합니다. 그래프가 아직 초기화되지 않았기 때문에이 오류가 발생하는 것 같습니다. 따라서 .eval()을 수행하면 충돌이 발생합니다. – karl71

답변

1

나는 당신이 원하는 것을 쉽게 할 수있는 방법이 없다고 생각합니다. minmaxfake_quant_with_min_max_args에 대한 인수가 작업 속성으로 변환되어 기본 커널의 construction에 사용됩니다. 런타임에는 변경할 수 없습니다. 보고있는 데이터에 따라 간격을 조정하는 일부 (공개 API의 일부인 것 같음) ops (LastValueQuantizeMovingAvgQuantize 참조)이 있지만 원하는 것은 아닙니다.

사용자 정의 op를 작성하거나 일반적으로 유용하다고 생각되는 경우 github에 기능 요청을 제출하십시오.