Два параллельных, но разных набора данных в Keras как несколько входов? - PullRequest
0 голосов
/ 09 марта 2019

Я весь день гуглял, пытаясь найти пример функционального ввода для двух параллельных наборов данных в Keras, но я не могу найти один.

Моя проблема в том, что у меня есть набор данных 1, набор изображений людей, выполняющих различные действия. Он отформатирован в формате csv следующим образом:

image_url,class
example1.png,BRUSH_TEETH
example2,BRUSH_TEETH
...
example10000.png,DANCING

Я предварительно обработаю их и сделаю их размером 64x64. Моим вторым набором данных будут данные о скачках движения, где каждая строка представляет собой информацию, захваченную одновременно с соответствующей строкой в ​​наборе данных 1

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

x,y,z,a,b,c,d,class
1,2,3,4,5,6,7,BRUSH_TEETH
8,9,10,3,1,3,4,BRUSH_TEETH
...
1,2,3,4,5,6,7,DANCING

Я читал о функциональном API, и мне кажется, что я могу запустить объект данных из набора данных через CNN, в то же время выполняя тот же объект данных из набора данных через, например, глубокую MLP. Затем, используя объединение или объединение, перенесите два выходных сигнала из их последних слоев в другой глубокий MLP и затем, наконец, свяжите эту окончательную объединенную модель с выходным сигналом

Забыв про CNN на минуту, API дает простой пример слияния:

import keras

input1 = keras.layers.Input(shape=(16,))
x1 = keras.layers.Dense(8, activation='relu')(input1)
input2 = keras.layers.Input(shape=(32,))
x2 = keras.layers.Dense(8, activation='relu')(input2)
# equivalent to added = keras.layers.add([x1, x2])
added = keras.layers.Add()([x1, x2])

out = keras.layers.Dense(4)(added)
model = keras.models.Model(inputs=[input1, input2], outputs=out)

Моя проблема заключается в том, что мне нужно подать input1 (в форме CNN) изображение, содержащееся в csv, и в то же время подать input2 с коррелирующей строкой во втором наборе данных, содержащем данные Leap Motion. PS: как в вышеупомянутом я продолжу модель после слияния с двумя плотными слоями перед выводом? Было бы просто так:

x3 = keras.layers.Dense(100)(added)
x3 = keras.layers.Dense(50)(x3)
out = keras.layers.Dense(4)(x3)

Возможно ли это выполнить? Если это так, я бы по достоинству оценил бы руку помощи, я схожу с ума, пытаясь понять, как эти два набора данных будут синхронизированы друг с другом!

Пример сценария, с которым я могу попробовать и поиграть, был бы превосходен, так как я относительно новичок в среде Keras

Большое спасибо!

1 Ответ

1 голос
/ 09 марта 2019

Пожалуйста, проверьте, если это полезно.Протестировано с Keras 2.2.4.

from keras.layers import Conv2D, MaxPooling2D, Input, Dense, Flatten, concatenate
from keras.models import Model
import numpy as np

img_input = Input(shape=(64, 64, 1))  ## branch 1 with image input
x = Conv2D(64, (3, 3))(img_input)
x = Conv2D(64, (3, 3))(x)
x = MaxPooling2D((2, 2))(x)
x = Flatten()(x)
out_a = Dense(64)(x)

num_input = Input(shape=(7,))        ## branch 2 with numerical input
x1 = Dense(8, activation='relu')(num_input)
out_b = Dense(16, activation='relu')(x1)

concatenated = concatenate([out_a, out_b])    ## concatenate the two branches
out = Dense(4, activation='softmax')(concatenated)
model = Model([img_input, num_input], out)
print(model.summary())
model.compile('sgd', 'categorical_crossentropy', ['accuracy'])

### Just for sanity check
X = [np.zeros((1,64,64,1)), np.zeros((1,7))]
y = np.ones((1,4))
model.fit(X, y)
print(model.predict(X))

Вы можете прочитать входные данные, используя Pandas

from PIL import Image
import pandas as pd

def get_num_input():
    df = pd.read_csv('num.csv')
    columns = list(df.columns)
    features = columns[:-1]
    cls_name = columns[-1]
    X = np.zeros((len(df), len(features)))
    Y = list()
    for i, row in df.iterrows():
        X[i] = row[features]
        Y.append(row[cls_name])

    return (X, Y)

def get_img_input():
    df = pd.read_csv('img.csv')
    X_img = np.zeros((len(df), 28, 28)) # change as per image size
    Y = list()
    for i, row in df.iterrows():
        X_img[i] = np.array(Image.open(row['image_url']))
        Y.append(row['class'])

    return (X_img, Y)


X_num, Y = get_num_input()
X_img, _ = get_img_input() # use one of the Ys
# X feature normalization, convert Y to one-hot representation

model.fit () имеет параметр 'validation_split' который может быть установлен на 0,3, чтобы создать разделение 70:30.model.fit () возвращает объект History, который можно использовать для построения кривых точности или обратного вызова TensorBoard для отслеживания в реальном времени.

https://chrisalbon.com/deep_learning/keras/visualize_loss_history/ https://keras.io/callbacks/#tensorboard

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...