Как применить поэлементную функцию округления к Keras Tensor? - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь написать слой в лямбда-стиле в Керасе, который квантовает каждый вес в предыдущем слое 1D Dense (output_len) с точностью до 1/128.

Я пытался использовать функцию map_tf в бэкэнде Keras, но пока мне не повезло.

По сути, я пытаюсь применить следующую функцию поэлементно для входного тензора 1D:

def quantize(x):
    'Squashes x (0->1) to steps of 1/128'
    precision = 3
    base = 0.0078125 # 1/128
    if x < 0:
        x = 0
    elif x > 1:
        x = 1

    return round(base * round(float(x)/base) - 1/256, precision)

Так, например, это может быть результатом определенного прогноза:

input (after going through the CNN):
  [0.21940812, 0.7998919 , 0.5420448 , 0.33850232 ]
output (after leaving the quantization layer):
  [0.215, 0.793, 0.535, 0.332 ]

Возможно ли то, что я пытаюсь достичь?

Спасибо.

1 Ответ

0 голосов
/ 28 апреля 2018

Вот как бы я это сделал:

import tensorflow as tf
from keras.models import Model
from keras.layers import Input, Lambda
import keras.backend as K
import numpy as np

def quantize(x):
    'Squashes x (0->1) to steps of 1/128'
    precision = 3
    base = 0.0078125 # 1/128
    x = K.clip( x, min_value = 0.0, max_value = 1.0 )
    return K.round( 1000 * ( base * K.round( x / base ) - 1.0 / 256 ) ) / 1000

a = Input( shape = ( 4, ) )
b = Lambda( quantize )( a )
model = Model( inputs = a, outputs = b )
print ( model.predict( np.array( [ [0.21940812, 0.7998919 , 0.5420448 , 0.33850232 ] ] ) ) )

Выходы:

[[0,215 0,79300004 0,535 0,33200002]]

Если вы можете жить с ошибками округления ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...