使用带 tf.keras 的张量流函数

using tensorflow functions with tf.keras

我有一个关于 tf.keras 和 tf 2.0 中的 tf 函数的问题。 如果我有这样的模型:

 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)

我想添加这样的自定义函数,它是一维子像素层:

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

我可以毫无问题地将这一层包含在 keras 中吗?由于 tensorflow 2.0 比之前的 tensorflow 版本简单得多,我不确定这是否不会混淆后端和会话?

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)

在编译和拟合模型之后会起作用吗?如果 导入了 tensorflow 和 keras

 import tensorflow as tf
 from tensorflow import keras

类似于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.操作或函数,我可以像往常一样将这个函数传递给keras吗? 我可以在 Keras loss 中使用它吗?

只需子类化 tf.keras.Layer 就可以了。这里有很好的参考: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 会如何表现,但我没有看到任何直接问题。