использование функций tenorflow с tf.keras - PullRequest
0 голосов
/ 03 марта 2020

У меня есть вопрос относительно функций tf.keras и tf в tf 2.0. Если у меня есть модель, подобная этой:

 inputdata = keras.Input(shape=(2048, 1))
    x = layers.Conv1D(16, 3, activation='relu')(inputdata)
    x = layers.Conv1D(32, 3, activation='relu')(x)
    x = layers.Conv1D(64, 3, activation='relu')(x)

, и я хочу добавить пользовательскую функцию, подобную этой, это 1-слой субпикселя:

def SubPixel1D(I, r):
  with tf.name_scope('subpixel'):
  X = tf.transpose(I, [2,1,0]) # (r, w, b)
  X = tf.batch_to_space_nd(X, [r], [[0,0]]) # (1, r*w, b)
  X = tf.transpose(X, [2,1,0])
  return X

, могу ли я включить этот слой в керас без проблем? Так как тензор потока 2.0 намного проще, чем предыдущие версии тензор потока, я не уверен в этом, если это не смешивает бэкэнды и сеансы?

inputdata = keras.Input(shape=(2048, 1))
  x = layers.Conv1D(16, 3, activation='relu')(inputdata)
  x = layers.Conv1D(32, 3, activation='relu')(x)
  x = SubPixel1D(x,2)
  x = layers.Conv1D(64, 3, activation='relu')(x)

после того, как эта модель компиляции и подгонки будет работать? Если тензорный поток и керасы импортированы

 import tensorflow as tf
 from tensorflow import keras

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

def my_loss(y_true, y_pred):
 # compute l2 loss/ equal to Keras squared mean
    sqrt_l2_loss = tf.reduce_mean((y_pred-y_true)**2, axis=[1, 2])
    avg_sqrt_l2_loss = tf.reduce_mean(sqrt_l2_loss, axis=0)
    return avg_sqrt_l2_loss

и использую tf. операции или функции, я могу просто передать эту функцию керасу как обычно? Могу ли я просто использовать его при потере Кераса?

1 Ответ

1 голос
/ 03 марта 2020

Просто подкласс tf.keras.Layer и вам будет хорошо go. Отличная ссылка здесь: https://www.tensorflow.org/guide/keras/custom_layers_and_models. Ваш слой должен выглядеть примерно так:

class SubPixel1D(tf.keras.layers.Layer):
  def __init__(self, r)
      super(SubPixel1D, self).__init__()
      self.r = r

  def call(self, inputs):
      with tf.name_scope('subpixel'):
          X = tf.transpose(inputs, [2,1,0]) # (r, w, b)
          X = tf.batch_to_space_nd(X, [self.r], [[0,0]]) # (1, r*w, b)
          X = tf.transpose(X, [2,1,0])
     return X

, а затем вызывать его при определении вашей модели

inputdata = keras.Input(shape=(2048, 1))
  x = layers.Conv1D(16, 3, activation='relu')(inputdata)
  x = layers.Conv1D(32, 3, activation='relu')(x)
  x = SubPixel1D(2)(x)
  x = layers.Conv1D(64, 3, activation='relu')(x)

Я не знаю, как поведет себя tf.name_scope, но я не знаю Не вижу никаких непосредственных проблем.

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