在Keras中使用Subtract层

我在Keras中实现了这里描述的LSTM架构。我认为我已经非常接近了,尽管我仍然在共享层和特定语言层的组合上遇到了一些问题。这里是公式(近似):y = g * y^s + (1 - g) * y^u

以下是我尝试的代码:

### Linear Layers ###univ_linear = Dense(50, activation=None, name='univ_linear')univ_linear_en = univ_linear(en_encoded)univ_linear_es = univ_linear(es_encoded)print(univ_linear_en)# Gate >> ggate_en = Dense(50, activation='sigmoid', name='gate_en')(en_encoded)gate_es = Dense(50, activation='sigmoid', name='gate_es')(es_encoded)print(gate_en)print(gate_es)# EN >> y^sspec_linear_en = Dense(50, activation=None, name='spec_linear_en') (en_encoded)print(spec_linear_en)# g * y^sgated_spec_linear_en = Multiply()([gate_en, spec_linear_en])print(gated_spec_linear_en)# ES >> y^sspec_linear_es = Dense(50, activation=None, name='spec_linear_es')(es_encoded)print(spec_linear_es)# g * y^sgated_spec_linear_es = Multiply()([gate_es, spec_linear_es])print(gated_spec_linear_es)# 1 - Gate >> (1 - g)only_ones_en = K.ones(gate_en.shape)univ_gate_en = Subtract()([only_ones_en, gate_en])print(univ_gate_en)only_ones_es = K.ones(gate_es.shape)univ_gate_es = Subtract()([only_ones_es, gate_es])print(univ_gate_es)# (1 - g) * y^ugated_univ_linear_en = Multiply()([univ_gate_en, univ_linear_en])print(gated_univ_linear_en)gated_univ_linear_es = Multiply()([univ_gate_es, univ_linear_es])print(gated_univ_linear_es)out_en = Add()([gated_spec_linear_en, gated_univ_linear_en])print(out_en)out_es = Add()([gated_spec_linear_es, gated_univ_linear_es])print(out_es)

当我编译我的模型时,我得到了这个错误:

AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

然而,当我用g * y^u替换(1 - g) * y^u时,我的模型可以无误地编译:

# (1 - g) * y^ugated_univ_linear_en = Multiply()([gate_en, univ_linear_en])print(gated_univ_linear_en)gated_univ_linear_es = Multiply()([gate_es, univ_linear_es])print(gated_univ_linear_es)

因此,我认为问题出在注释# 1 - Gate >> (1 - g)下的代码中,更具体地说,是来自减法(1 - g)

有谁知道具体的问题是什么以及我如何解决它吗?


回答:

Keras层的输入必须是Keras张量,这些张量是前一层的输出。当你编写only_ones_en = K.ones(gate_en.shape)时,only_ones_en不会是一个Keras张量,而是一个后端的张量(例如TensorFlow张量)。

至于你的具体例子,你可以使用Lambda层更容易地实现这一点:

univ_gate_en = Lambda(lambda x: 1. - x)(gate_en)

或者可能以一种不太有效的方式:

univ_gate_en = Lambda(lambda x: K.ones_like(x) - x)(gate_en)

或者以一种更加冗长且可能不太有效的方式:

only_ones_en = Lambda(lambda x: K.ones_like(x))(gate_en)univ_gate_en = Subtract()([only_ones_en, gate_en])

在你使用K.*作为层输入的其他地方也适用同样的方法。

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中创建了一个多类分类项目。该项目可以对…

发表回复

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