【问题标题】:Autoencoder Python Keras - Error graph disconnectedAutoencoder Python Keras - 错误图已断开
【发布时间】:2021-06-17 17:47:24
【问题描述】:

我尝试使用 Keras 库在 Python 中创建自动编码器。 我想将我的模型分成两部分:编码器和解码器。但是当我尝试创建解码器时出现错误。

我的代码是:

autoencoder = tf.keras.models.Sequential()
encoding_dim = 250  
nb_classe = 4

# Inputs
input_imgA = keras.Input(shape=(784,))
input_imgB = keras.Input(shape=(784,))
input_imgC = keras.Input(shape=(784,))

# Encoder part
encodedA = keras.layers.Dense(encoding_dim, activation='relu')(input_imgA)
encodedB = keras.layers.Dense(encoding_dim, activation='relu')(input_imgB)

encoded = keras.layers.Multiply()([encodedA, encodedB])
encoded = keras.layers.Dense(nb_classe, activation='softmax')(encoded)

# Decoder part
decodedA = keras.layers.Dense(encoding_dim, activation='relu')(encoded)
decodedB = keras.layers.Dense(encoding_dim, activation='relu')(input_imgC)

decoded = keras.layers.Multiply()([decodedA, decodedB])
decoded = keras.layers.Dense(784, activation='relu')(decoded)

# Autoencoder
autoencoder = keras.Model(inputs = [input_imgA, input_imgB, input_imgC], outputs = decoded)
encoder = keras.Model(inputs = [input_imgA, input_imgB], outputs = encoded)

encoded_input = keras.Input(shape=(nb_classe,))
decoder = keras.Model(inputs = [encoded_input, input_imgC], outputs = decoded)

当我定义自动编码器和编码器时,没有问题。但我无法定义解码器。我希望解码器将编码器输出和图像作为输入。但我有一个错误,例如:

Graph disconnected: cannot obtain value for tensor Tensor("input_8:0", shape=(None, 4), dtype=float32) at layer "dense_6". The following previous layers were accessed without issue: []

我不明白我的错误。 请问你能帮帮我吗?

谢谢。

【问题讨论】:

    标签: python tensorflow keras-layer autoencoder


    【解决方案1】:

    如果您需要访问模型中的中间层,通常最好通过子类化 tf.keras.Model 并返回您需要的任何内容来构建您自己的单个模型。

    示例

    相关包

    import tensorflow as tf
    
    from tensorflow.keras.layers import Dense
    from tensorflow.keras.layers import Multiply
    

    构建模型

    class Autoencoder(tf.keras.Model):
        """``Autoencoder``."""
        def __init__(self, orig_units=784, num_units=250, num_classes=4):
            super().__init__()
            self._orig_units = orig_units
            self._num_units = num_units
            self._num_classes = num_classes
            # encoder
            self.enc_a = Dense(self._num_units, activation="relu")
            self.enc_b = Dense(self._num_units, activation="relu")
            self.probs = Dense(self._num_classes, activation="softmax")
            self.enc = Multiply()
            # decoder
            self.dec_a = Dense(self._num_units, activation="relu")
            self.dec_b = Dense(self._num_units, activation="relu")
            self.logits = Dense(self._orig_units, activation="relu")
            self.dec = Multiply()
    
        def call(self, xa, xb, xc):
            # encoder
            exa = self.enc_a(xa)
            exb = self.enc_b(xb)
            encoded = self.enc([exa, exb])
            encoded = self.probs(encoded)
            # decoder
            dxa = self.dec_a(encoded)
            dxb = self.dec_b(xc)
            decoded = self.dec([dxa, dxb])
            decoded = self.logits(decoded)
            return encoded, decoded
    

    实例化并测试所需的输出

    # model
    ae = Autoencoder()
    
    # data
    Xa = tf.random.normal([5, 784])
    Xb = tf.random.normal([5, 784])
    Xc = tf.random.normal([5, 784])
    
    # correct output?
    enc_out, dec_out = ae(Xa, Xb, Xc)
    
    print(enc_out)
    # tf.Tensor(
    #    [[0.15498394 0.00756733 0.5070575  0.33039123]
    #     [0.12203674 0.05137487 0.2758123  0.5507761 ]
    #     [0.11994947 0.5594128  0.08857376 0.23206405]
    #     [0.6519191  0.06745841 0.2350422  0.04558026]
    #     [0.16059074 0.11788747 0.46389887 0.257623  ]],
    # shape=(5, 4), dtype=float32)
    
    print(dec_out)
    # tf.Tensor(
    #    [[0.00234556 0.         0.00978717 ... 0.         0.         0.00275952]
    #    [0.03659576 0.00313164 0.00698952 ... 0.         0.01964222 0.        ]
    #    [0.00446499 0.01008888 0.         ... 0.00357639 0.00307285 0.00277464]
    #    [0.00713126 0.00656428 0.03171315 ... 0.0217022  0.         0.        ]
    #    [0.         0.01419089 0.         ... 0.         0.         0.00467858]],
    # shape=(5, 784), dtype=float32)
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2022-01-03
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 2017-06-07
      相关资源
      最近更新 更多