Как я могу использовать значения вместе с изображениями в качестве входных данных для обучения классификатора изображений Keras? - PullRequest
0 голосов
/ 17 июня 2019

Я считаю, что это мой первый вопрос здесь.

Я очень новичок в нейронных сетях. Я только начал работать над одним из них на Python, который должен проверять уровень глюкозы у пациентов с риском развития диабета и оценивать их от 1 до 3 по степени риска развития заболевания. 1 - высокий риск, 3 - низкий.

Прямо сейчас у меня ~ 110 графиков, ранее ранжированных врачом (42 риска 1, 51 риск 2, 10 риска 3). Я случайным образом взял 25% каждой группы в качестве тестового набора, а остальные положил в качестве обучения, а затем отдал его Keras для обучения.

Работает просто отлично. Вот мой код:

        print("Convoluting")

        classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu'))

        print("Pooling")

        classifier.add(MaxPooling2D(pool_size = (2,2)))

        print("Flattening")

        classifier.add(Flatten())

        print("Connecting")

        classifier.add(Dense(activation = 'relu', units=128))

        classifier.add(Dense(activation = 'softmax', units=3))

        print("Compiling CNN")

        classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

        print("Generating images")

        from keras.preprocessing.image import ImageDataGenerator

        train_datagen = ImageDataGenerator()

        test_datagen = ImageDataGenerator()

        print("Setting sets")

        training_set = train_datagen.flow_from_directory(
                        'dataset/train_set',
                        target_size=(64,64),
                        batch_size=Batches,
                        class_mode='categorical')

        test_set = test_datagen.flow_from_directory(
                        'dataset/test_set',
                        target_size=(64,64),
                        batch_size=Batches,
                        class_mode='categorical')

        print("training nn...")

        from IPython.display import display
        from PIL import Image

        classifier.fit_generator(
                    training_set,
                    steps_per_epoch=StepsPerEpoch,
                    epochs=Epochs,
                    validation_data=test_set,
                    validation_steps=ValidationSteps)

Однако точность после тренировки не превысит 0,4. Теперь я знаю, что у меня сравнительно небольшой образец для обучения нейронной сети, но в настоящее время у меня нет доступа к информации от большего количества пациентов. Однако у меня есть доступ к демографическим данным этих пациентов, таким как вес, рост и возраст.

По сути, я хотел бы как-то указать вес, рост и возраст каждого пациента вместе с графиком, показывающим уровень глюкозы в крови. Так что моя программа знает, как учитывать эту информацию при вынесении суждения.

Мне не удалось найти ничего подобного при поиске в Интернете, хотя это может быть связано с моими небольшими знаниями по этому вопросу. Что мне делать?

Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Если бы мне пришлось делать что-то подобное, я бы объединял элементы изображения и числовые элементы, если они имеют одинаковую форму - вектор элементов. Для этого вы можете рассматривать сверточную часть сети как экстрактор объектов, который после последнего слоя пула превращается в список объектов, то есть он будет иметь форму, подобную [batch_size, 1, 1, N]. На этом этапе вы можете легко добавлять / объединять ваши обычные числовые элементы, прежде чем вводить их в плотный слой.

Пара вещей, за которыми я бы присматривал:

  • убедитесь, что числовые и сверточные объекты относятся к одному и тому же распределению, т. Е. BatchNorm применяется к обоим
  • убедитесь, что они имеют примерно одинаковый размер, т. Е. Если у вас есть 2048 конв-функций и только 5 числовых, это может не совсем работать как есть.

Вы можете получить больше вдохновения от Широкое и глубокое обучение для рекомендательных систем .

0 голосов
/ 17 июня 2019

Прежде всего, вы используете небольшую глубокую сеть, поэтому ваши данные должны быть больше 100 экземпляров. поэтому я предлагаю поискать «Увеличение данных», чтобы узнать, как увеличить ваши данные. во-вторых, хотя у вас мало данных для обучения вашей сети, я думаю, что 10% или менее для тестовых данных достаточно. и, наконец, для использования других функций для обучения вы можете извлекать элементы изображений с помощью сверточной сети, а затем объединять их с другими функциями и обучать более простую сеть для окончательной классификации.

...