如何使自定义高斯噪声层对Keras中的数据集的每一列施加不同的stddev?

时间:2019-05-19 14:15:30

标签: keras keras-layer

我想制作Keras的高斯噪声层,对数据集的每一列施加具有不同stddev级别的噪声。但是,由于我对编码方面的知识不多,所以有一个很大的问题,我自己无法解决。

使用Keras高斯噪声层的源代码,

我做了如下代码:

def call(self, inputs, training=None):

  def noised():
    temp=inputs
    for i in range(100):
      temp[:,i]=temp[:,i]+K.random_normal(shape= 
                    (len(inputs),1),mean=0.,stddev=self.stddev[i])
      return temp

return K.in_train_phase(noised, inputs, training=training)

但是,它显示出如下错误:

 object of type 'Tensor' has no len()

我认为错误来自不同类型的形状。

因为原始代码如下所示:

 def noised():
    return inputs + K.random_normal(shape=K.shape(inputs),
    mean=0.,
    stddev=self.stddev)

使用shape(K.shape)的符号类型,而我施加的是数字(len())的整数类型。

但是,我不知道解决该问题的方法。

如果您给我一些解决方法,对我来说真的是一个很大的帮助。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我知道这太晚了,但也许对其他人来说仍然很有趣。我使用的是 Tensorflow 2.3.0,我只能使用 numpy 切片命令。所以切片张量,应用各个层并将它们合并在一起:

input = tf.keras.Input(shape=(None,3))

x1 = GaussianNoise(0.1)(input[:,:,0:1])
x2 = GaussianNoise(0.2)(input[:,:,1:2])
x3 = GaussianNoise(0.3)(input[:,:,2:3])

x = Concatenate()([x1,x2,x3])