当有多个输入(包括矩阵)时如何使用网格搜索?

How to use Grid Search when there are multiple inputs, including a matrix?

我正在尝试调整神经元模型,但由于输入是多个且形状不同,因此似乎无法将其堆叠在一起。

我做模型的时候有两种输入。

其中之一是:

cats = [train.time_signature,train.key,train.mode_cat,train.loudness_cat,train.tempo_cat,train.duration_cat]

它们的形状都是(7678,)

另一个输入是:

num_train

它的形状是(7678,30),是一个矩阵

拟合Keras模型的时候,直接拼接成训练集就可以了:

final_model.fit([cats,num_train],train.genre_cat,batch_size=50,epochs=1000,verbose=1,validation_split=.1)

但是,当我使用 GridSearch 时,它不允许我使用与在模型中相同的输入。

grid_result = grid.fit([cats,num_train],train.genre_cat)

它显示错误:ValueError: Found input variables with inconsistent numbers of samples: [2, 7678],这意味着 num_train 是不允许的,因为我在索引 1 上得到了其他 30 个样本。

有什么办法可以解决这个问题吗?谢谢。

参考:

  1. https://github.com/keras-team/keras/issues/2748

我认为诀窍总是一样的:将多个输入连接起来进行单一输入。

在这种特殊情况下,我们有 N 个输入 dim (n_sample,1) 和一个输入 dim (n_sample,30)。新的串联输入将具有维度(n_sample、n_stacked_columns)。

我们对模型内部的列进行分离

n_sample = 100

x1 = np.random.uniform(0,1, (n_sample,1)) # (n_sample,1)
x2 = np.random.uniform(0,1, (n_sample,1)) # (n_sample,1)
x3 = np.random.uniform(0,1, (n_sample,1)) # (n_sample,1)
x = np.random.uniform(0,1, (n_sample,30)) # (n_sample,30)
X = np.column_stack([x1,x2,x3,x])  # (n_sample,1+1+1+30)
y = np.random.uniform(0,1, n_sample)


inp = Input((X.shape[-1],))

inp1 = Lambda(lambda x: tf.expand_dims(x[:,0],-1))(inp) # (None,1)
inp2 = Lambda(lambda x: tf.expand_dims(x[:,1],-1))(inp) # (None,1)
inp3 = Lambda(lambda x: tf.expand_dims(x[:,2],-1))(inp) # (None,1)
inp_matrix = Lambda(lambda x: x[:,3:])(inp) # (None,30)

d1 = Dense(8)(inp1)
d2 = Dense(8)(inp2)
d3 = Dense(8)(inp3)
d_matrix = Dense(8)(inp_matrix)

concat = Concatenate()([d1,d2,d3,d_matrix])
out = Dense(1)(concat)

model = Model(inp, out)
model.compile('adam','mse')

model.fit(X,y, epochs=3)