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

时间:2019-04-29 09:37:44

标签: python tensorflow keras scikit-learn decision-tree

我想训练一个模型,根据身体信号来预测一个人的情绪。我有一个物理信号并将其用作输入功能;

  

ecg(心电图)

我想使用CNN体系结构从数据中提取特征,然后使用这些提取的特征来提供经典的“决策树分类器” 。在下面,您可以看到没有决策树的CNN方法;

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(Dense(3, activation = 'softmax'))。我试图像这样保存最后一个卷积层的输出;

output = model.layers[-6].output

当我打印出output变量时,结果就是这样;

  

输出:Tensor(“ conv1d_56 / Relu:0”,shape =(?, 8971,30),   dtype = float32)

我猜想,output变量保存提取的特征。现在,如何使用存储在output变量中的数据为决策树分类器模型提供数据?这是scikit Learn的决策树;

from sklearn.tree import DecisionTreeClassifier

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

我应该如何喂fit()方法?预先感谢。

1 个答案:

答案 0 :(得分:2)

要提取可传递给另一算法的特征向量,在softmax层之前需要一个完全连接的层。这样的事情会在您的softmax层之前添加一个128维的层:

bind_rows(mget(paste0("df", 1:247)), .id = "number")

如果您随后运行package com.jcg.csv2excel; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.ConditionalFormattingRule; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.SheetConditionalFormatting; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class Format { public static void main(String[] args) throws IOException { String excelFilePath = "C:\\Troop\\Csv_To_Excel\\config\\EXCEL_DATA.xlsx"; FileInputStream inputStream = new FileInputStream(new File(excelFilePath)); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); //workbook.getSheet(Sheet); Sheet sheet = workbook.getSheetAt(0); SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting(); ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("=IF(C5 > B5 + TIME(0,30,0),TRUE,FALSE)"); org.apache.poi.ss.usermodel.PatternFormatting pattern_Fmt = rule1.createPatternFormatting(); pattern_Fmt.setFillBackgroundColor(IndexedColors.YELLOW.index); ConditionalFormattingRule rule2 = sheetCF.createConditionalFormattingRule("=IsBlank(B7:X16)"); org.apache.poi.ss.usermodel.PatternFormatting patternFmt = rule2.createPatternFormatting(); patternFmt.setFillBackgroundColor(IndexedColors.RED.index); ConditionalFormattingRule [] cfRules = { rule1, rule2 }; CellRangeAddress[] regions = { CellRangeAddress.valueOf("B7:B16") }; sheetCF.addConditionalFormatting(regions, cfRules); inputStream.close(); FileOutputStream outputStream = new FileOutputStream(excelFilePath); workbook.write(outputStream); workbook.close(); outputStream.close(); } } ,则可以看到图层的名称:

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'))

对网络进行培训后,您可以创建一个新模型,其中输出层变为'dense_7',它将生成128维特征向量:

model.summary()