如何对自定义Keras图层进行故障排除

时间:2020-04-17 22:36:16

标签: python machine-learning keras

我正在使用Keras(我是初学者)创建模型,并编写了一个lambda函数来随机选择是否翻转初始输入层。

这是尝试这样做的摘录:

input_global = Input(shape=(2001,1))
flipped = Lambda(lambda x: keras.backend.reverse(x, axes=1) if np.random.random() < 0.5 else x, output_shape=(input_global.shape[1], input_global.shape[2]))(input_global)

我的模型可以编译,但是在模型定义的中间记录print("Hello, world")之类的消息只会导致记录一次“ Hello world”,而不是每次训练期间数据都进入模型。

我怎么知道我的功能符合我的预期?

1 个答案:

答案 0 :(得分:1)

在构建Keras模型时,您将在构建操作图,并且每当通过模型运行输入时,就会通过该操作图运行输入。换句话说,您只需构建一个模型,然后就可以根据需要多次运行输入。

非Keras函数将成为图形的一部分,包括printnp.random.random()之类的操作。您将需要使用Keras等效项。

对于print,使用功能keras.backend.print_tensor

对于np.random.random,使用功能keras.backend.random_uniform

我认为您不打算这样做,但是由于您在自定义层中使用np.random.random(),因此该操作将仅在构建模型时执行。只要您通过模型运行数据,就不会运行它。换句话说,该图层将仅反转输入,或者仅返回输入。要获得我认为想要的随机行为,您需要使用Keras函数(即keras.backend.random_uniform)。每次运行模型时,使用Keras函数都会生成一个随机数。

要弄清这一点,np.random.random()将在构建模型时运行一次,并且实质上将在构建时确定该层将执行的操作(即,它将仅反转输入,或者只会返回不变的输入)。另一方面,keras.backend.random_uniform()在构建模型时不会生成随机数,而是会向模型添加random_uniform操作,因此每次数据通过模型时,都会从中提取随机数此时的均匀分布。