python - Keras 自定义层和急切执行
问题描述
我有一个带有一个自定义层的简单模型,在正常情况下可以正常工作。当我通过 切换到急切执行时tf.enable_eager_execution()
,我遇到了一个奇怪的错误。
这是到目前为止的代码:
import numpy as np
import tensorflow as tf
import tensorflow.keras.backend as K
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Layer, Input
from tensorflow.keras.losses import kullback_leibler_divergence
tf.enable_eager_execution()
class ClusteringLayer(Layer):
def __init__(self, output_dim, input_dim=None, alpha=1.0, **kwargs):
self.output_dim = output_dim
self.input_dim = input_dim
self.alpha = alpha
super(ClusteringLayer, self).__init__(**kwargs)
def build(self, input_shape):
self.W = self.add_weight(name='kernel', shape=(self.output_dim, input_shape[1]), initializer='uniform', trainable=True)
super(ClusteringLayer, self).build(input_shape)
def call(self, x, mask=None):
q = 1.0/(1.0 + K.sqrt(K.sum(K.square(K.expand_dims(x, 1) - self.W), axis=2))**2 /self.alpha)
q = q**((self.alpha+1.0)/2.0)
q = K.transpose(K.transpose(q)/K.sum(q, axis=1))
return q
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
def clustering_loss(y_true, y_pred):
a = K.square(y_pred) / K.sum(y_pred, axis=0)
p = K.transpose(K.transpose(a) / K.sum(a, axis=1))
loss = kullback_leibler_divergence(p, y_pred)
return loss
input1 = Input(shape=(10,), name="input")
out = ClusteringLayer(output_dim = 5, name='clustering')(input1)
model = Model(inputs=input1, outputs=out)
model.compile(optimizer=tf.train.AdamOptimizer(1e-3), loss={'clustering' : clustering_loss})
X = np.random.random((20, 10)).astype(np.float32)
Y = np.random.random((20, 5)).astype(np.float32)
model.fit(x={'input' : X}, y={'clustering' : Y}, batch_size=1, epochs=10)
错误信息与“fit”函数有关:
AssertionError: Could not compute output DeferredTensor('None', shape=(5,), dtype=float32)
当我尝试检查自定义层的输出时,我惊讶地发现该层正在生成两个输出。第一个是模棱两可和不受欢迎的。
代码:
input1 = Input(shape=(10,), name="input")
layer = ClusteringLayer(output_dim = 5, name='clustering')
out = layer(input1)
print(out)
输出:
[<DeferredTensor 'None' shape=(?,) dtype=float32>, <DeferredTensor 'None' shape=(5,) dtype=float32>]
即使我使用Keras 文档中的简单自定义层更改了自定义层,我也遇到了同样的错误:
AssertionError: Could not compute output DeferredTensor('None', shape=(5,), dtype=float32)
解决方案
我在 GitHub 上问了这个问题,因为它看起来更像是一个错误。他们建议在解决内部问题之前使用解决方法。
我从这里引用:github
作为一种解决方法,您可以将 compute_output_shape 返回的输出形状包装在 TensorShape 中。例如:TensorShape((input_shape[0], self.output_dim))。让我知道这个是否奏效。
推荐阅读
- angular - 使用从 API 到 AGM 圈子的纬度和经度
- flutter - 我该如何解决这个错误(A RenderFlex 在底部溢出了 104 个像素。)
- javascript - 如何将车把模板插入外部 Javascript 文件?
- css - Flex align-items:拉伸不适用于 Chrome 中的按钮元素
- javascript - 无法设置属性 'innerHTML' of null ///// from origin 'null' 已被 CORS 策略阻止:
- ruby-on-rails - rails 6中有许多默认路线?
- boto3 - 在 aiobotocore 响应 ['Body'].read(...) 上看到挂起(没有超时)
- c - 使用指针函数对结构的成员进行排序
- batch-file - 如何使用循环密码制作批处理文件?
- android - 在 Google Play 商店更新后,Android 应用程序将无法打开。有关如何调试的任何提示?