Python Keras:如何将CNN模型与决策树联系起来

Python Keras:如何将CNN模型与决策树联系起来,python,tensorflow,keras,scikit-learn,decision-tree,Python,Tensorflow,Keras,Scikit Learn,Decision Tree,我想训练一个模型,从物理信号预测一个人的情绪。我有一个物理信号,并使用它作为输入功能 心电图(心电图) 我想使用CNN架构从数据中提取特征,然后使用这些提取的特征为经典的“决策树分类器”提供信息。下面,你可以看到我的CNN aproach,没有决策树 model = Sequential() model.add(Conv1D(15,60,padding='valid', activation='relu',input_shape=(18000,1), strides = 1, kernel_r

我想训练一个模型,从物理信号预测一个人的情绪。我有一个物理信号,并使用它作为输入功能

心电图(心电图)

我想使用CNN架构从数据中提取特征,然后使用这些提取的特征为经典的“决策树分类器”提供信息。下面,你可以看到我的CNN aproach,没有决策树

model = Sequential()
model.add(Conv1D(15,60,padding='valid', activation='relu',input_shape=(18000,1), strides = 1,  kernel_regularizer=regularizers.l1_l2(l1=0.1, l2=0.1)))
model.add(MaxPooling1D(2,data_format='channels_last'))
model.add(Dropout(0.6))
model.add(BatchNormalization())
model.add(Conv1D(30, 60, padding='valid', activation='relu',kernel_regularizer = regularizers.l1_l2(l1=0.1, l2=0.1), strides=1))
model.add(MaxPooling1D(4,data_format='channels_last'))
model.add(Dropout(0.6))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(3, activation = 'softmax'))
我想编辑此代码,以便在输出层中有工作的决策树,而不是
model.add(密集(3,激活='softmax'))
。我试着像这样保存最后一个卷积层的输出

output = model.layers[-6].output
当我打印出
输出
变量时,结果是这样的

输出:张量(“conv1d_56/Relu:0”,形状=(?,8971,30), dtype=32)

我猜,
输出
变量保存提取的特征。现在,我如何将存储在
输出
变量中的数据提供给我的决策树分类器模型?这是scikit learn的决策树

from sklearn.tree import DecisionTreeClassifier

dtc = DecisionTreeClassifier(criterion = 'entropy')
dtc.fit()

我应该如何输入
fit()
方法?提前感谢。

要提取可以传递给另一个算法的特征向量,在softmax层之前需要一个完全连接的层。类似的内容将在softmax层之前添加128维层:

model = Sequential()
model.add(Conv1D(15,60,padding='valid', activation='relu',input_shape=(18000,1), strides = 1,  kernel_regularizer=regularizers.l1_l2(l1=0.1, l2=0.1)))
model.add(MaxPooling1D(2,data_format='channels_last'))
model.add(Dropout(0.6))
model.add(BatchNormalization())
model.add(Conv1D(30, 60, padding='valid', activation='relu',kernel_regularizer = regularizers.l1_l2(l1=0.1, l2=0.1), strides=1))
model.add(MaxPooling1D(4,data_format='channels_last'))
model.add(Dropout(0.6))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation = 'softmax'))
如果然后运行
model.summary()
,则可以看到层的名称:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_9 (Conv1D)            (None, 17941, 15)         915       
_________________________________________________________________
max_pooling1d_9 (MaxPooling1 (None, 8970, 15)          0         
_________________________________________________________________
dropout_10 (Dropout)         (None, 8970, 15)          0         
_________________________________________________________________
batch_normalization_9 (Batch (None, 8970, 15)          60        
_________________________________________________________________
conv1d_10 (Conv1D)           (None, 8911, 30)          27030     
_________________________________________________________________
max_pooling1d_10 (MaxPooling (None, 2227, 30)          0         
_________________________________________________________________
dropout_11 (Dropout)         (None, 2227, 30)          0         
_________________________________________________________________
batch_normalization_10 (Batc (None, 2227, 30)          120       
_________________________________________________________________
flatten_6 (Flatten)          (None, 66810)             0         
_________________________________________________________________
dense_7 (Dense)              (None, 128)               8551808   
_________________________________________________________________
dropout_12 (Dropout)         (None, 128)               0         
_________________________________________________________________
dense_8 (Dense)              (None, 3)                 387       
=================================================================
Total params: 8,580,320
Trainable params: 8,580,230
Non-trainable params: 90
_________________________________________________________________
一旦您的网络经过培训,您就可以创建一个新模型,其中输出层变为“稠密7”,它将生成128维特征向量:

feature_vectors_model = Model(model.input, model.get_layer('dense_7').output)
dtc_features = feature_vectors_model.predict(your_X_data)  # fit your decision tree on this data

要提取可以传递到另一个算法的特征向量,在softmax层之前需要一个完全连接的层。类似的内容将在softmax层之前添加128维层:

model = Sequential()
model.add(Conv1D(15,60,padding='valid', activation='relu',input_shape=(18000,1), strides = 1,  kernel_regularizer=regularizers.l1_l2(l1=0.1, l2=0.1)))
model.add(MaxPooling1D(2,data_format='channels_last'))
model.add(Dropout(0.6))
model.add(BatchNormalization())
model.add(Conv1D(30, 60, padding='valid', activation='relu',kernel_regularizer = regularizers.l1_l2(l1=0.1, l2=0.1), strides=1))
model.add(MaxPooling1D(4,data_format='channels_last'))
model.add(Dropout(0.6))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation = 'softmax'))
如果然后运行
model.summary()
,则可以看到层的名称:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_9 (Conv1D)            (None, 17941, 15)         915       
_________________________________________________________________
max_pooling1d_9 (MaxPooling1 (None, 8970, 15)          0         
_________________________________________________________________
dropout_10 (Dropout)         (None, 8970, 15)          0         
_________________________________________________________________
batch_normalization_9 (Batch (None, 8970, 15)          60        
_________________________________________________________________
conv1d_10 (Conv1D)           (None, 8911, 30)          27030     
_________________________________________________________________
max_pooling1d_10 (MaxPooling (None, 2227, 30)          0         
_________________________________________________________________
dropout_11 (Dropout)         (None, 2227, 30)          0         
_________________________________________________________________
batch_normalization_10 (Batc (None, 2227, 30)          120       
_________________________________________________________________
flatten_6 (Flatten)          (None, 66810)             0         
_________________________________________________________________
dense_7 (Dense)              (None, 128)               8551808   
_________________________________________________________________
dropout_12 (Dropout)         (None, 128)               0         
_________________________________________________________________
dense_8 (Dense)              (None, 3)                 387       
=================================================================
Total params: 8,580,320
Trainable params: 8,580,230
Non-trainable params: 90
_________________________________________________________________
一旦您的网络经过培训,您就可以创建一个新模型,其中输出层变为“稠密7”,它将生成128维特征向量:

feature_vectors_model = Model(model.input, model.get_layer('dense_7').output)
dtc_features = feature_vectors_model.predict(your_X_data)  # fit your decision tree on this data

你在做监督分类吗?是否要联合训练DL模型和决策树(这是不可能的…)?您可以做的一件事是使用FC层训练DL模型,然后将其替换为决策树…@ma3oun,是的,这是一种监督分类。我希望CNN模型从我的数据中提取特征,然后我将使用这些提取的特征来提供决策树模型。一种方法是添加一些FC层并训练网络,然后使用经过训练的网络提取特征并将其提供给决策树(从而替换FC层)。另一种方法是训练一个自动编码器来提取特征,然后使用压缩的数据向量作为决策树的输入……你在做监督分类吗?是否要联合训练DL模型和决策树(这是不可能的…)?您可以做的一件事是使用FC层训练DL模型,然后将其替换为决策树…@ma3oun,是的,这是一种监督分类。我希望CNN模型从我的数据中提取特征,然后我将使用这些提取的特征来提供决策树模型。一种方法是添加一些FC层并训练网络,然后使用经过训练的网络提取特征并将其提供给决策树(从而替换FC层)。另一种方法是训练自动编码器提取特征,然后使用压缩的数据向量作为决策树的输入…
你的数据
意味着训练?此外,这对我正在运行多少个时代很重要吗?是的,训练、测试等。用于生成特征的新模型不需要训练,因为它使用的是从拟合“模型”中学到的权重。对于原始模型,最好使用回调,在验证丢失停止改善时结束训练。但我想问,这是最好的方法吗?比方说,在我的
conv1d
节点中,我使用了10个过滤器,这就是为什么应该提取10个特征。在此之后,我将应用一个密度为128的完全连接层,并使用它为我的决策树提供数据。因此,我有128个功能,而不是10个。
您的\ux\u数据
意味着列车\ux?此外,这对我正在运行多少个时代很重要吗?是的,训练、测试等。用于生成特征的新模型不需要训练,因为它使用的是从拟合“模型”中学到的权重。对于原始模型,最好使用回调,在验证丢失停止改善时结束训练。但我想问,这是最好的方法吗?比方说,在我的
conv1d
节点中,我使用了10个过滤器,这就是为什么应该提取10个特征。在此之后,我将应用一个密度为128的完全连接层,并使用它为我的决策树提供数据。因此,我有128个功能,而不是10个。