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

时间:2019-01-28 23:52:01

标签: python tensorflow keras tensorboard batch-normalization

对不起,如果我不知道这很明显,我已经尝试过/ 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块串在一起。我将对函数的每次调用的输出保存在列表中,并将列表中的最后一个输出用作下一层的输入。(我原本只是将先前的输出用作输入,但是创建了一个列表,所以我可以确保我不会以这种身份发疯)

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

以下是该节点展开的位置:https://i.imgur.com/7ujMDVX.png并更近的位置:https://i.imgur.com/HpNgK4V.png

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

由于某种原因,它表明第一个批处理规范层或“ b1_left_0”被用作整个模型中每个其他批处理规范层的输入,包括仅连接的模型的另一个“右”臂后来通过连接层来解决这个问题。

我假设我在这里遗漏了一些明显的东西并且很笨,但是由于我的代码中的所有内容似乎都在按预期的方式工作,我对如何尝试进一步解决感到困惑。

预先感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

该图是正确的-Keras就是这样表示某些操作(例如批处理规范)的。

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