Keras自定义层和急切执行

2024-06-07 16:01:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的模型与一个自定义层,在正常情况下工作良好。 当我通过tf.enable_eager_execution()切换到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”功能有关:

^{pr2}$

当我试图检查我的自定义层的输出时,我惊讶地发现这个层正在生成两个输出。第一个是模棱两可和不受欢迎的。在

代码:

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>]

即使我用简单的custom layer from the Keras documentation更改了自定义层,我也得到了相同的错误:

^{pr2}$

Tags: nameimportselfalphainputoutputtensorflowdef
1条回答
网友
1楼 · 发布于 2024-06-07 16:01:22

我在GitHub中问这个问题,因为它看起来更像是一个bug。 他们建议在解决内部问题之前使用变通方法。在

我从这里引用:github

As a workaround, you could wrap the output shape returned by compute_output_shape in a TensorShape. For example: TensorShape((input_shape[0], self.output_dim)). Let me know if this works.

相关问题 更多 >

    热门问题