У меня есть такой набор данных:
q1 q2 label
ccc ddd 1
zzz yyy 0
. . .
. . .
где q1 и q2 - предложения, а метка скажет, дубликаты они или нет.
Теперь я в замешательстве, поскольку у меня есть два входа q1 и q2, так как объединить их для прогнозирования. Я сделал две функции CNN для обоих столбцов, а затем хочу объединить их.
моя функция cnn:
def cnn_model(FILTER_SIZES, \
# filter sizes as a list
MAX_NB_WORDS, \
# total number of words
MAX_DOC_LEN, \
# max words in a doc
EMBEDDING_DIM=200, \
# word vector dimension
NUM_FILTERS=64, \
# number of filters for all size
DROP_OUT=0.5, \
# dropout rate
NUM_OUTPUT_UNITS=1, \
# number of output units
NUM_DENSE_UNITS=100,\
# number of units in dense layer
PRETRAINED_WORD_VECTOR=None,\
# Whether to use pretrained word vectors
LAM=0.0):
# regularization coefficient
main_input = Input(shape=(MAX_DOC_LEN,), \
dtype='int32', name='main_input')
if PRETRAINED_WORD_VECTOR is not None:
embed_1 = Embedding(input_dim=MAX_NB_WORDS+1, \
output_dim=EMBEDDING_DIM, \
input_length=MAX_DOC_LEN, \
# use pretrained word vectors
weights=[PRETRAINED_WORD_VECTOR],\
# word vectors can be further tuned
# set it to False if use static word vectors
trainable=True,\
name='embedding')(main_input)
else:
embed_1 = Embedding(input_dim=MAX_NB_WORDS+1, \
output_dim=EMBEDDING_DIM, \
input_length=MAX_DOC_LEN, \
name='embedding')(main_input)
# add convolution-pooling-flat block
conv_blocks = []
for f in FILTER_SIZES:
conv = Conv1D(filters=NUM_FILTERS, kernel_size=f, \
activation='relu', name='conv_'+str(f))(embed_1)
conv = MaxPooling1D(MAX_DOC_LEN-f+1, name='max_'+str(f))(conv)
conv = Flatten(name='flat_'+str(f))(conv)
conv_blocks.append(conv)
if len(conv_blocks)>1:
z=Concatenate(name='concate')(conv_blocks)
else:
z=conv_blocks[0]
dense = Dense(NUM_DENSE_UNITS, activation='relu',\
kernel_regularizer=l2(LAM),name='dense')(drop)
model = Model(inputs=main_input, outputs=dense)
model.compile(loss="binary_crossentropy", \
optimizer="adam", metrics=["accuracy"])
return model
Сначала у меня есть последовательность полей в обоих столбцах:
tokenizer = Tokenizer(num_words=MAX_NB_WORDS)
tokenizer.fit_on_texts(data["q1"])
# set the dense units
dense_units_num= num_filters*len(FILTER_SIZES)
BTACH_SIZE = 32
NUM_EPOCHES = 100
sequences_1 = tokenizer.\
texts_to_sequences(data["q1"])
# print(sequences_1)
sequences_2 = tokenizer.\
texts_to_sequences(data["q2"])
sequences = sequences_1 + sequences_2
output_units_num=1
# pad all sequences into the same length
# if a sentence is longer than maxlen, pad it in the right
# if a sentence is shorter than maxlen, truncate it in the right
padded_sequences = pad_sequences(sequences, \
maxlen=MAX_DOC_LEN, \
padding='post', \
truncating='post')`
Теперь для обеих колонок я сделал две модели, подобные этой:
left_cnn=cnn_model(FILTER_SIZES, MAX_NB_WORDS, \
MAX_DOC_LEN, \
NUM_FILTERS=num_filters,\
NUM_OUTPUT_UNITS=output_units_num, \
NUM_DENSE_UNITS=dense_units_num,\
PRETRAINED_WORD_VECTOR= None)
right_cnn=cnn_model(FILTER_SIZES, MAX_NB_WORDS, \
MAX_DOC_LEN, \
NUM_FILTERS=num_filters,\
NUM_OUTPUT_UNITS=output_units_num, \
NUM_DENSE_UNITS=dense_units_num,\
PRETRAINED_WORD_VECTOR= None)
Теперь я не знаю, как объединить эти две модели. А что делать дальше!