对不起,如果我不知道这很明显,我已经尝试过/ 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”被用作整个模型中每个其他批处理规范层的输入,包括仅连接的模型的另一个“右”臂后来通过连接层来解决这个问题。
我假设我在这里遗漏了一些明显的东西并且很笨,但是由于我的代码中的所有内容似乎都在按预期的方式工作,我对如何尝试进一步解决感到困惑。
预先感谢您的任何建议。
答案 0 :(得分:0)
该图是正确的-Keras就是这样表示某些操作(例如批处理规范)的。
它在执行操作的图形中创建一个节点(保留遇到的第一个节点,在您的情况下为b1_left_0
),并且引用在执行相同操作的每个其他节点中。
tensorboard可视化不适用于使用keras创建的图形,因此,在您的情况下,最好参考model.summary()
方法来查看keras是否正确构建了图形。