Keras中两个平行但不同的数据集作为多个输入?

时间:2019-03-09 18:12:20

标签: python tensorflow keras

我整日忙于搜索,试图在Keras中找到两个并行数据集的功能输入示例,但我找不到一个。

我的问题是我有数据集1,这是一组执行不同操作的人的图像。格式如下:

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运行来自dataset1的数据对象,而同时可以通过深度MLP运行来自dataset2的相同数据对象。然后,使用合并或连接,将两个输出从它们的最后一层带到另一个深层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 个答案:

答案 0 :(得分:1)

请检查这是否有用。经过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))

您可以使用熊猫读取输入数据

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