Как заставить Tensorflow работать под float16? - PullRequest
0 голосов
/ 16 июня 2019

Я строю последовательную модель Keras с пользовательской функцией активации, определяя новый класс, написанный tf-бэкэндом keras и самими некоторыми тензорными операторами tf.Я поместил пользовательскую функцию активации в ../keras/advanced_activation.py.

Я намерен запустить ее с точностью float16.Без пользовательской функции я мог бы легко использовать следующее для выбора между float32 и float16:

        if self.precision == 'float16':
            K.set_floatx('float16')
            K.set_epsilon(1e-4)
        else:
            K.set_floatx('float32')
            K.set_epsilon(1e-7)

Тем не менее, при использовании пользовательской функции в моей модели, tf сохраняется в float32, даже когда я выбрал float16.Я понимаю, что tf по умолчанию запускается под flat32, поэтому мои вопросы:

  1. В одном файле также есть несколько встроенных функций активации, как Keras заставляет их работать под float16чтобы я мог сделать то же самое?Существует метод tf tf.dtypes.cast (...), могу ли я использовать его в своей пользовательской функции для принудительного вызова tf?В этих встроенных функциях нет такого приведения.

  2. В качестве альтернативы, как я могу заставить tf работать под float16 напрямую, используя Keras с tf в качестве бэкэнда?

Большое спасибо.

1 Ответ

0 голосов
/ 17 июня 2019

Я получил ответ отладкой.Урок заключается в том, что

Во-первых, tf.dtypes.cast (...) работает.

Во-вторых, я могу указать второй аргумент в своей пользовательской функции активации, чтобы указать тип данныхбросать(...).Ниже приведен связанный код

В-третьих, нам не нужен tf.constant для указания типа данных этих констант

В-четвертых, я заключаю, что добавление пользовательской функции в custom_activation.py являетсяСамый простой способ определить наш собственный слой / активацию, если он везде дифференцируем, или, по крайней мере, кусочно дифференцирован и не имеет разрыва на стыках.

# Quadruple Piece-Wise Constant Function
class MyFunc(Layer):


    def __init__(self, sharp=100, DataType = 'float32', **kwargs):
        super(MyFunc, self).__init__(**kwargs)
        self.supports_masking = True
        self.sharp = K.cast_to_floatx(sharp)
        self.DataType = DataType

    def call(self, inputs):

        inputss = tf.dtypes.cast(inputs, dtype=self.DataType)
        orig = inputss
        # some calculations
        return # my_results

    def get_config(self):
        config = {'sharp': float(self.sharp), 
                  'DataType': self.DataType}
        base_config = super(MyFunc, self).get_config()
        return dict(list(base_config.items()) + list(config.items()))

    def compute_output_shape(self, input_shape):
        return input_shape

Спасибо @ y.selivonchyk за достойное обсуждениесо мной и @Yolo Swaggins за ваш вклад.

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