Keras - Первый слой нормы партии, показанный как входные данные для каждого второго слоя нормы в тензорной доске, почему это так? - PullRequest
0 голосов
/ 29 января 2019

Извините, если это что-то очевидное, что я пропустил, я пробовал / 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 голосов
/ 29 января 2019

График верен - именно так Keras представляет определенные операции, такие как пакетная норма.

Создает узел на графике, который выполняет операцию (он сохраняет первую встреченную, b1_left_0 в вашем случае) и ссылки есть в каждом другом узле, который выполняет ту же операцию.Визуализация тензорной доски не подходит для графа, созданного с помощью keras, поэтому в вашем случае лучше обратиться к методу model.summary(), чтобы проверить, правильно ли керасы построили график.

...