Извините, если это что-то очевидное, что я пропустил, я пробовал / 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» используется в качестве входных данных для каждого второго уровня нормы партии во всей моей модели, включая весь другой «правый» рычаг модели, который подключен к нему только через слой сцепления намного позже.
Я предполагаю, что я упускаю что-то очевидное здесь, и я тупой, но я в растерянности из-за того, как попытаться сделать это дальше, так как все в моем коде, кажется,работает как задумано.
Заранее благодарим за любые советы.