Есть ли способ слияния слоев в кератах с разными размерами образцов / партий и вопрос о слитых слоях - PullRequest
0 голосов
/ 09 июля 2019

Я искал ответ на свой конкретный вопрос, но ничего такого не встречал здесь.Любая помощь будет принята с благодарностью!

У меня есть два вопроса о слиянии слоев в keras.Я построил модель, которая объединяет слой между двумя моделями перед выводом.Из-за характера моих данных входные данные (размеры выборки) с обеих сторон будут разными, однако объединение слоев будет полезным, поскольку два источника данных будут принадлежать к одним и тем же классам в данных, и поэтому было бы неплохо увидетькак происходит классификация, когда две модели обмениваются данными перед выводом.

Я хотел бы знать, есть ли способ использовать разные размеры выборки с обеих сторон, так как я получаю ошибку длины массива при подгонке модели, если данные имеют разные размеры.

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

поезд слева: 140 образцов, поезд справа 180 образцов ... для поезда слева, я добавляю строки 1:40 в конец данных, чтобы получить 180 выборок.

Является ли это достаточным способом противодействия этой проблеме?

Мой код для модели выглядит следующим образом:

left_branch_input = Input(shape=(5078,), name='Left_input')
left_branch_output = Dense(64, activation='relu', name="middle_layer")(left_branch_input)
left_branch_output_2=Dense(32, activation="relu", name="second_layer")(left_branch_output)
left_branch_output_3=Dense(100, activation="relu", name="penultimate_layer")(left_branch_output_2)

right_branch_input = Input(shape=(5078,), name='right_input')
right_branch_output = Dense(64, activation='relu', name="middle_layerR")(right_branch_input)
right_branch_output_2=Dense(32, activation="relu", name="second_layerR")(right_branch_output)
right_branch_output_3=Dense(100, activation="relu", name="penultimate_layerR")(right_branch_output_2)

concat = concatenate([left_branch_output_3, right_branch_output_3], name='Concatenate')

final_model_output = Dense(24, activation='sigmoid')(concat)
final_model = Model(inputs=[left_branch_input, right_branch_input], outputs=final_model_output,
                    name='Final_output' )


final_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=["accuracy"])


sum_vector = np.array(y_train.astype(bool) + y_trainSC.astype(bool), dtype=int)

historyMerged=final_model.fit([X_train, X_trainSC], sum_vector,
          epochs=200,
          verbose=1,
          validation_split=0.15,
          callbacks=[EarlyStopping(monitor='val_loss', patience=5)], shuffle=True)

Модель компилируется и соответствует, и производительность хорошаяОднако, в качестве проверки работоспособности, я просто хотел бы спросить, подходит ли подход добавления образцов (путем дублирования [требуемая длина]? Есть ли способ игнорировать размер выборки из разных ветвей?

Как этоявляется проблемой многокомпонентной двоичной_кросентропии, порядки выборки в наборах данных не пересекаются четко.Например, строка - это орган 1 возраст 1 для левой ветви, а для правой ветви первая выборка - орган 2 возраст 2.это вопрос? или модель работает по классу согласно горячим закодированным данным, поскольку это то, что на самом деле должно иметь значение, класс, в котором он существует, а не порядок ... функция model.predict фактически получает данныесправа для обоих наборов данных, так что предположительно для данных, которые одинаковы в левой и правой ветвях, используются слои слиянияg весов от обеих ветвей, чтобы найти сходства и особенности, которые улучшают классификацию:

Наконец, у меня есть вопрос об итогах модели для объединенного слоя.

Любая помощь и совет по этому вопросу будет принята с благодарностью!До сих пор я доволен производительностью, но хочу быть абсолютно уверенным, что порядок, а также дублированные данные являются правильным способом решения этой проблемы.

Спасибо!

1 Ответ

0 голосов
/ 09 июля 2019

Похоже, ваш вопрос заключается в том, как объединить тензоры различной формы. Это простой пример, который вы можете запустить в Colab:

import tensorflow as tf
keras = tf.keras

from keras.models import Model
from keras.layers import *

in_a = Input(shape=(10,))
in_b = Input(shape=(20,))
join = Concatenate(axis=1)([in_a, in_b])
h1 = Dense(10)(join)
out = Dense(1, activation='sigmoid')(h1)
model = Model([in_a, in_b], out)
model.compile('adam', 'mse')
model.summary()

Ключ - это параметр оси для конкатенации.

Я не уверен, что понимаю ваш второй вопрос. Особенности в левой и правой ветвях не должны коррелировать вообще. Они могут быть совершенно разными.

...