【问题标题】:using tensorflow functions with tf.keras在 tf.keras 中使用 tensorflow 函数
【发布时间】:2020-03-03 19:43:52
【问题描述】:

我对 tf 2.0 中的 tf.keras 和 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)

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

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 中使用它吗?

【问题讨论】:

    标签: python tensorflow keras tensorflow2.0 tf.keras


    【解决方案1】:

    只需子类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 的行为如何,但我没有看到任何直接的问题。

    【讨论】:

    • 你已经看到了我之前关于过度拟合的问题......我在没有包装的情况下训练了我的模型。我只是使用了 subpixel 函数并在我的模型中调用它。你认为这有什么不同吗? stackoverflow.com/questions/60461069/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2019-11-03
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2021-05-13
    相关资源
    最近更新 更多