我正在使用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”,而不是在训练过程中每次数据输入模型时都显示。
我如何知道我的函数是否按预期工作?
回答:
在构建Keras模型时,您实际上是在构建一个操作图,每次您将输入通过模型运行时,就是在通过这个操作图运行输入。换句话说,您构建模型一次,然后您可以根据需要多次通过它运行输入。
非Keras函数不会成为图的一部分,包括print
或np.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操作添加到模型中,因此每次数据通过模型时,都会在那个点从均匀分布中抽取一个随机数。