我整日忙于搜索,试图在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框架还比较陌生,所以我可以尝试使用的示例脚本将非常出色
非常感谢您!
答案 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