Keras - 第一个批量规范层显示为张量板中每个其他批量规范层的输入,为什么会这样?

Keras - First batch norm layer shown as input to every other batch norm layer in tensorboard, why is this the case?

抱歉,如果这是我遗漏的明显问题,我已经尝试过 /r/learnmachinelearning 但它们没有帮助,所以我想我会在这里尝试。

我正在使用这个:

    def cnn_block_1(inp, filt, kernal, b_num):
        # Layer Names
        c1_left, b1_left, a1_left, c2_left, b2_left, a2_left, c3_left, b3_left, a3_left, p_left = \
        "c1_left_" + b_num, "b1_left_" + b_num, "a1_left_" + b_num, "c2_left_" + b_num, \
        "b2_left_" + b_num, "a2_left_" + b_num, "c3_left_" + b_num, "b3_left_" + b_num, \
        "a3_left_" + b_num, "p_left_" + b_num,

        # Block
        c1_l = Conv2D(filters=filt, kernel_size=kernal, padding="same", name=c1_left)(inp)
        bn1_l = BatchNormalization(name=b1_left)(c1_l)
        a1_l = Activation("relu", name=a1_left)(bn1_l)
        c2_l = Conv2D(filters=filt, kernel_size=kernal, padding="same", name=c2_left)(a1_l)
        bn2_l = BatchNormalization(name=b2_left)(c2_l)
        a2_l = Activation("relu", name=a2_left)(bn2_l)
        c3_l = Conv2D(filters=filt, kernel_size=kernal, padding="same", name=c3_left)(a2_l)
        bn3_l = BatchNormalization(name=b3_left)(c3_l)
        a3_l = Activation("relu", name=a3_left)(bn3_l)
        p_l = MaxPooling2D(padding="same", name=p_left)(a3_l)

        return p_l

    left_arm_blocks = 6
    filter_value = 2

    x1 = Sequential()
    x1.add(Embedding(vocab_char_size, embedding_char_size, input_length=maxlen, mask_zero=True,         weights=[e_char], name='embedding_1', trainable=False))
    x1.add(Lambda(lambda xo: K.expand_dims(xo, axis=3)))

    x2 = Sequential()
    x2.add(Embedding(vocab_word_size, embedding_word_size, input_length=maxlen, mask_zero=True,     weights=[e_word], name='embedding_2', trainable=False))
    x2.add(Lambda(lambda xo: K.expand_dims(xo, axis=3)))

    c = Concatenate(axis=3)([x1.output, x2.output])
    left_string = list()
    left_string.append(c)
    f_value = filter_value
    for i in range(left_arm_blocks):
        c = cnn_block_1(left_string[-1], f_value, kernal_value, str(i))
        left_string.append(c)
        f_value *= 2

    x = Lambda(lambda xq: xq, output_shape=lambda s: s)(left_string[-1])
    flat1 = Flatten()(x)
    #etc....

将一堆预定义的 CNN 块串在一起。我将每次调用该函数的输出保存在一个列表中,并将列表中的最后一个输出用作下一层的输入等。确保我不会以这种身份发疯)

当我在 tensorboard 上加载模型以查看架构时,发生了一些奇怪的事情:https://i.imgur.com/zhjOkhe.png

这是展开的节点:https://i.imgur.com/7ujMDVX.png & closer up: https://i.imgur.com/HpNgK4V.png

这个没有任何功能,只有 CNN 层:https://i.imgur.com/4G3IPgu.png

出于某种原因,它表明第一个批量规范层或 "b1_left_0" 被用作我整个模型中所有其他批量规范层的输入,包括整个其他 "right" 臂很久以后才通过连接层连接到此的模型。

我假设我在这里遗漏了一些明显的东西并且我很愚蠢但是我不知道如何尝试进一步解决这个问题因为我的代码中的所有内容似乎都按预期工作。

提前感谢您的任何建议。

该图是正确的 - 这就是 Keras 表示某些操作(如批量归一化)的方式。

它在图表中创建一个执行操作的节点(它保留遇到的第一个节点,在您的情况下为 b1_left_0)并且引用在执行相同操作的每个其他节点中。 tensorboard 可视化不适合用 keras 创建的图形,因此在您的情况下最好参考 model.summary() 方法来查看 keras 是否正确构建了图形。