张量流模型中随机 select 层
Randomly select layer in tensorflow model
我想在我的网络中使用具有特定概率的不同层。图层如下类.
class plus1(keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def call(self, X):
return X + 1
def compute_output_shape(self, batch_input_shape):
return batch_input_shape
class plus2(keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def call(self, X):
return X + 2
def compute_output_shape(self, batch_input_shape):
return batch_input_shape
class plus3(keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def call(self, X):
return X + 3
def compute_output_shape(self, batch_input_shape):
return batch_input_shape
网络如下。
def f1():
return plus1()
def f2():
return plus2()
def f3():
return plus3()
def simple_model(input_num):
input_layer = Input(input_num)
rand = tf.random.uniform((1,), minval=0, maxval=3, dtype=tf.int32)
r = tf.switch_case(rand[0], branch_fns={0: f1, 1: f2, 2: f3})
res = r(input_layer)
model = Model(inputs=input_layer, outputs=res)
return model
model = simple_model([1,])
每次我 运行 下面的代码,我得到相同的输出,但我期望不同的输出。
有什么办法可以实现吗?
model.predict([1])
>>> array([[4.]], dtype=float32)
我遇到了同样的问题,但我找不到解决办法。所以我实现了不同的网络,然后从它们的输出中随机选择。
我一直在处理同样的问题:我有一个图层列表,我需要在每次迭代时从中随机 select。 tf.switch_case()
给了我你描述的同样问题。
无论出于何种原因,我没有足够的背景深度来告诉你原因(完全有可能我的 tf.switch_case
实现以不相关的方式出现错误),这段代码对我有用:
def random_layer(layers, image_tensor):
"""
Selects and executes a random layer chosen from a list
"""
to_use = tf.random.uniform(shape=[], maxval=len(layers), dtype=tf.int32)
out = image_tensor
for i, layer in enumerate(layers):
# out is either image_tensor or the actual output, *but*
# since we can't break this loop, when it matches it will become the actual output
# and any further calls will return that value
def _match():
# tf.print("using {}".format(layer))
return layer(out, training=True)
out = tf.cond(to_use==i, _match, lambda: out)
return out
(请注意,我使用的是局部函数,因此我可以验证随机性。)然后我传入:
NOISE_LAYERS = [tf.keras.layers.GaussianNoise(stddev=.1),
tf.keras.layers.GaussianNoise(stddev=.2),
tf.keras.layers.GaussianNoise(stddev=.3),
tf.keras.layers.GaussianNoise(stddev=.4)]
(这是数据集准备的一部分,我希望图像包含不同数量的噪声。)
我想在我的网络中使用具有特定概率的不同层。图层如下类.
class plus1(keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def call(self, X):
return X + 1
def compute_output_shape(self, batch_input_shape):
return batch_input_shape
class plus2(keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def call(self, X):
return X + 2
def compute_output_shape(self, batch_input_shape):
return batch_input_shape
class plus3(keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def call(self, X):
return X + 3
def compute_output_shape(self, batch_input_shape):
return batch_input_shape
网络如下。
def f1():
return plus1()
def f2():
return plus2()
def f3():
return plus3()
def simple_model(input_num):
input_layer = Input(input_num)
rand = tf.random.uniform((1,), minval=0, maxval=3, dtype=tf.int32)
r = tf.switch_case(rand[0], branch_fns={0: f1, 1: f2, 2: f3})
res = r(input_layer)
model = Model(inputs=input_layer, outputs=res)
return model
model = simple_model([1,])
每次我 运行 下面的代码,我得到相同的输出,但我期望不同的输出。 有什么办法可以实现吗?
model.predict([1])
>>> array([[4.]], dtype=float32)
我遇到了同样的问题,但我找不到解决办法。所以我实现了不同的网络,然后从它们的输出中随机选择。
我一直在处理同样的问题:我有一个图层列表,我需要在每次迭代时从中随机 select。 tf.switch_case()
给了我你描述的同样问题。
无论出于何种原因,我没有足够的背景深度来告诉你原因(完全有可能我的 tf.switch_case
实现以不相关的方式出现错误),这段代码对我有用:
def random_layer(layers, image_tensor):
"""
Selects and executes a random layer chosen from a list
"""
to_use = tf.random.uniform(shape=[], maxval=len(layers), dtype=tf.int32)
out = image_tensor
for i, layer in enumerate(layers):
# out is either image_tensor or the actual output, *but*
# since we can't break this loop, when it matches it will become the actual output
# and any further calls will return that value
def _match():
# tf.print("using {}".format(layer))
return layer(out, training=True)
out = tf.cond(to_use==i, _match, lambda: out)
return out
(请注意,我使用的是局部函数,因此我可以验证随机性。)然后我传入:
NOISE_LAYERS = [tf.keras.layers.GaussianNoise(stddev=.1),
tf.keras.layers.GaussianNoise(stddev=.2),
tf.keras.layers.GaussianNoise(stddev=.3),
tf.keras.layers.GaussianNoise(stddev=.4)]
(这是数据集准备的一部分,我希望图像包含不同数量的噪声。)