问题描述
我正在研究针对人体姿势问题的不同估计的不同模型。实际上,我需要从人体不同关节的回归模型中获得不同的输出。搜索完此问题后,我想到了以下两种方法:
我知道Keras具有一个称为concatenate的功能,该功能可以合并模型的两个输出。但是,如果我不想使用Keras,是否可以拥有6个模型,然后以最终训练模型可以一次估算这些不同模型的所有输出的方式合并它们?
我的模型是这样的(根据我拥有的不同数据集,它们是不同的):
import pandas as pd
df = pd.read_clipboard()
df['Date'] = pd.to_datetime(df['Date'])
s = pd.date_range(df['Date'].min(),df['Date'].max(),freq='M')
df['FullName'] = df['FirstName'] + df['MiddleName'] + df['LastName']
idx = pd.MultiIndex.from_product([df['FullName'].unique(),s],names=['FullName','Date'])
df = df.set_index(['FullName','Date']).reindex(idx,fill_value='0').reset_index()
df['FirstName'] = df.groupby('FullName')['FirstName'].transform('max')
df['MiddleName'] = df.groupby('FullName')['MiddleName'].transform('max')
df['LastName'] = df.groupby('FullName')['LastName'].transform('max')
df = df[['FirstName','MiddleName','LastName','Date','Value1','Value2','Value3']].replace('0',0)
df
Out[98]:
FirstName MiddleName LastName Date Value1 Value2 Value3
0 first1 middle1 last1 2020-01-31 51 80 19
1 first1 middle1 last1 2020-02-29 14 44 56
2 first1 middle1 last1 2020-03-31 0 0 0
3 first1 middle1 last1 2020-04-30 57 96 40
4 first1 middle1 last1 2020-05-31 0 0 0
5 first1 middle1 last1 2020-06-30 58 65 3
6 first1 middle1 last1 2020-07-31 0 0 0
7 first1 middle1 last1 2020-08-31 1 34 4
8 first1 middle1 last1 2020-09-30 0 0 0
9 first1 middle1 last1 2020-10-31 40 38 53
10 first1 middle1 last1 2020-11-30 0 0 0
11 first1 middle1 last1 2020-12-31 93 65 41
12 first1 middle1 last1 2021-01-31 0 0 0
13 first1 middle1 last1 2021-02-28 3 43 0
14 first1 middle1 last1 2021-03-31 0 0 0
15 first1 middle1 last1 2021-04-30 46 61 52
16 first1 middle1 last1 2021-05-31 0 0 0
17 first1 middle1 last1 2021-06-30 0 0 0
18 first2 middle2 last2 2020-01-31 64 19 33
19 first2 middle2 last2 2020-02-29 28 71 16
20 first2 middle2 last2 2020-03-31 0 0 0
21 first2 middle2 last2 2020-04-30 2 94 78
22 first2 middle2 last2 2020-05-31 78 99 87
23 first2 middle2 last2 2020-06-30 10 70 14
24 first2 middle2 last2 2020-07-31 30 30 59
25 first2 middle2 last2 2020-08-31 55 96 73
26 first2 middle2 last2 2020-09-30 0 0 0
27 first2 middle2 last2 2020-10-31 22 43 23
28 first2 middle2 last2 2020-11-30 12 4 84
29 first2 middle2 last2 2020-12-31 0 0 0
30 first2 middle2 last2 2021-01-31 59 93 1
31 first2 middle2 last2 2021-02-28 19 33 52
32 first2 middle2 last2 2021-03-31 46 12 97
33 first2 middle2 last2 2021-04-30 41 44 59
34 first2 middle2 last2 2021-05-31 67 84 96
35 first2 middle2 last2 2021-06-30 52 69 78
36 first3 middle3 last3 2020-01-31 0 0 0
37 first3 middle3 last3 2020-02-29 0 0 0
38 first3 middle3 last3 2020-03-31 0 0 0
39 first3 middle3 last3 2020-04-30 5 63 30
40 first3 middle3 last3 2020-05-31 45 22 7
41 first3 middle3 last3 2020-06-30 76 2 33
42 first3 middle3 last3 2020-07-31 0 0 0
43 first3 middle3 last3 2020-08-31 81 25 52
44 first3 middle3 last3 2020-09-30 55 3 32
45 first3 middle3 last3 2020-10-31 0 0 0
46 first3 middle3 last3 2020-11-30 46 45 80
47 first3 middle3 last3 2020-12-31 17 81 74
48 first3 middle3 last3 2021-01-31 98 6 55
49 first3 middle3 last3 2021-02-28 0 0 0
50 first3 middle3 last3 2021-03-31 0 0 0
51 first3 middle3 last3 2021-04-30 0 0 0
52 first3 middle3 last3 2021-05-31 0 0 0
53 first3 middle3 last3 2021-06-30 0 0 0
解决方法
您可以使用Functional API实现此目的。 我添加了一个简单的示例,您可以根据您的用例将此示例调整为更复杂的模型。
代码:
import tensorflow as tf
import numpy as np
# Here I have generated to different data and labels containing different number of features.
x1 = tf.constant(np.random.randint(50,size =(1000,13)),dtype = tf.float32)
y1 = tf.constant(np.random.randint(2,)),dtype = tf.int32)
x2 = tf.constant(np.random.randint(50,6)),dtype = tf.float32)
y2 = tf.constant(np.random.randint(2,dtype = tf.int32)
# Creation of model
def create_model3():
input1 = tf.keras.Input(shape=(13,),name = 'I1')
input2 = tf.keras.Input(shape=(6,name = 'I2')
hidden1 = tf.keras.layers.Dense(units = 4,activation='relu')(input1)
hidden2 = tf.keras.layers.Dense(units = 4,activation='relu')(input2)
hidden3 = tf.keras.layers.Dense(units = 3,activation='relu')(hidden1)
hidden4 = tf.keras.layers.Dense(units = 3,activation='relu')(hidden2)
output1 = tf.keras.layers.Dense(units = 2,activation='softmax',name ='O1')(hidden3)
output2 = tf.keras.layers.Dense(units = 2,name = 'O2')(hidden4)
model = tf.keras.models.Model(inputs = [input1,input2],outputs = [output1,output2])
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
return model
model = create_model3()
tf.keras.utils.plot_model(model,'my_first_model.png',show_shapes=True)
模型体系结构:
您可以像这样使用model.fit()训练此模型:
history = model.fit(
x = {'I1':x1,'I2':x2},y = {'O1':y1,'O2': y2},batch_size = 32,epochs = 10,verbose = 1,callbacks = None,# validation_data = [(val_data,new_val_data),(val_labels,new_val_labels)]
)
注意:要进行训练以工作,所有输入数据中的样本数应相同。即x1包含1000行,因此x2也应包含1000行。
您可以像下面这样预测使用该模型:
model.predict(x = {'I1':x1,'I2':x2})