Объедините вектор признаков изображения (размер 3x1) с вектором признаков изображения (размер Nx1) на плоском слое CNN и передайте его в плотный слой - PullRequest
0 голосов
/ 14 июля 2020

Я работаю с набором данных рентгеновского снимка грудной клетки, содержащим 15 классов. Имена файлов изображений зарезервированы в файле CSV с некоторыми значениями, отличными от изображений. Набор данных изображения разделен на поезд, тест и проверку. Я использовал imagedatagenerator для увеличения изображений.

|---------------------|------------------|---------------|
|      Image Index    |  Patient Gender  | View Position |
|---------------------|------------------|---------------|
|   00008236_001.png  |         1        |       0       |
|---------------------|------------------|---------------|
|   00016410_014.png  |         0        |       1       |
|---------------------|------------------|---------------|
|   00014751_001.png  |         1        |       0       |
|---------------------|------------------|---------------|
|   00020318_012.png  |         1        |       1       |
|---------------------|------------------|---------------|

[[CSV-файл, не содержащий функций изображения (пол пациента и положение просмотра рентгеновского изображения грудной клетки кодируются как {0,1})]

Я хочу объединить значения этих двух столбцов со сплющенным слоем CNN.

Я пробовал следующий код, но он показал ошибку.

train_set_features = train_set[['View Position','Patient Gender']]
input_features =train_set_att.values # Shape=(90771, 2)

from keras.applications import *
from keras.layers import GlobalAveragePooling2D, Dense, Dropout, Flatten,Concatenate
from keras.models import Sequential

base_model = MobileNet( include_top=False,input_shape=(224,224,3))
x = base_model.output
x = Flatten()(x)  #output shape = (None,7168)
non_image_features = Input(shape=[2,], name="non_image") #output shape = (None,2)
x= concatenate([x, non_image_features]) #output shape = (None,7170)

# and a logistic layer
predictions = Dense(15, activation="sigmoid",name='visualized_layer')(x)

model = Model(inputs=[base_model.input,non_image_features], outputs=predictions)
opt = Adam(learning_rate=0.001)
model.compile(optimizer=opt, loss='binary_crossentropy',metrics=['binary_accuracy','mae'])
history = model.fit_generator([train_generator,input_features ],
                              validation_data=valid_generator,
                              steps_per_epoch=100, 
                              validation_steps=25,
                              epochs =64,)

predicted_values = model.predict_generator(test_generator, steps = len(test_generator))

Это правильный способ объединения значений с сплющенный слой?

Ответы [ 2 ]

0 голосов
/ 18 июля 2020

Прежде всего, как уже указывалось, это Concatenate, а не concatenate.

Из документации fit_generator ожидает генератор, а не список [train_generator,input_features ]. Ожидается, что генератор будет выдавать кортеж - (inputs, targets) на каждой итерации. Каждый пакет (сгенерированный на каждой итерации) обычно содержит примерно 64 или 128 обучающих примеров.

В вашем случае первый аргумент, скорее всего, train_generator, а не [train_generator,input_features ]

0 голосов
/ 14 июля 2020

есть несколько проблем с вашим кодом. Сначала вы пытаетесь вызвать concatenate, но такой функции нет. Обратите внимание на то, что импортируемая функция называется Concatenate.

Во-вторых, если вы попытаетесь вызвать эту функцию, вам нужно будет сделать это по-другому. Ознакомьтесь с документацией, чтобы узнать, как это работает (поищите примеры использования): https://keras.io/api/layers/merging_layers/concatenate/

Наконец, если вы все еще будете испытывать проблемы, сообщите нам об ошибке, которую вы получаете, чтобы мы может попытаться выяснить, что именно не так.

...