如何排查自定义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”,而不是在训练过程中每次数据输入模型时都显示。

我如何知道我的函数是否按预期工作?


回答:

在构建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操作添加到模型中,因此每次数据通过模型时,都会在那个点从均匀分布中抽取一个随机数。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注