You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Keras CNN模型与决策树结合实现情绪预测?

Connecting CNN Feature Extractor to Scikit-Learn Decision Tree

Got it, let's walk through how to hook up your CNN feature extractor to scikit-learn's Decision Tree Classifier. It's all about converting the CNN's 3D feature output into a format the decision tree can understand, then feeding those features into the classifier. Here's your step-by-step solution:

Step 1: Build Your CNN Feature Extractor

First, we need to repurpose your existing CNN to act as a feature extractor by removing the final Dense(3, softmax) classification layer. You have two easy options here:

Option 1: Truncate Your Trained CNN

If you've already trained the full CNN model (with the Dense layer), you can create a new model that outputs features from the Flatten layer (right before the Dense layer):

from tensorflow.keras.models import Model

# Assume your pre-trained CNN is stored in the `model` variable
feature_extractor = Model(inputs=model.input, outputs=model.layers[-2].output)
# model.layers[-2] targets the Flatten layer (since model.layers[-1] is the Dense output layer)

Option 2: Reconstruct the Feature Extractor (with optional weight loading)

If you want to build the extractor from scratch (or load weights later), replicate your CNN layers up to the Flatten layer:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, MaxPooling1D, Dropout, BatchNormalization, Flatten, GlobalAveragePooling1D
from tensorflow.keras import regularizers

feature_extractor = Sequential()
feature_extractor.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)))
feature_extractor.add(MaxPooling1D(2, data_format='channels_last'))
feature_extractor.add(Dropout(0.6))
feature_extractor.add(BatchNormalization())
feature_extractor.add(Conv1D(30, 60, padding='valid', activation='relu', 
                             kernel_regularizer=regularizers.l1_l2(l1=0.1, l2=0.1), strides=1))
feature_extractor.add(MaxPooling1D(4, data_format='channels_last'))
feature_extractor.add(Dropout(0.6))
feature_extractor.add(BatchNormalization())
# Convert 3D CNN output to 2D (required for scikit-learn)
feature_extractor.add(Flatten())

# If you have pre-trained weights from your original CNN, load them here:
feature_extractor.set_weights([layer.get_weights() for layer in model.layers[:-1]])

Pro Tip: Instead of Flatten, use GlobalAveragePooling1D() to reduce the feature dimension drastically (from (8971, 30) to (30,) per sample). This makes training the decision tree much faster and lowers the risk of overfitting:

# Replace the Flatten layer with this:
feature_extractor.add(GlobalAveragePooling1D())

Step 2: Extract Features from Your Data

Now use the feature extractor to transform your training and test datasets into 2D arrays—this is the format scikit-learn classifiers require ((n_samples, n_features)):

# Extract features for your training set
X_train_features = feature_extractor.predict(X_train)
# Extract features for your test set
X_test_features = feature_extractor.predict(X_test)

Step 3: Train the Decision Tree Classifier

Finally, pass the extracted features and your labeled data to the decision tree's fit() method:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report

# Initialize the decision tree with your chosen criterion
dtc = DecisionTreeClassifier(criterion='entropy')

# Train the classifier using extracted features and training labels
dtc.fit(X_train_features, y_train)

# Make predictions on the test set
y_pred = dtc.predict(X_test_features)

# Evaluate performance
print("Test Accuracy:", accuracy_score(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred))

Key Things to Remember

  • 3D → 2D Conversion: Your original CNN's intermediate output (from model.layers[-6].output) is a 3D tensor ((n_samples, 8971, 30)). Scikit-learn models can't handle 3D input, so flattening or pooling is mandatory to get a 2D feature array.
  • Train the CNN First: If you haven't trained your CNN yet, start by training the full original model (with the Dense layer) to learn meaningful feature representations. This ensures your feature extractor produces high-quality features for the decision tree.

内容的提问来源于stack exchange,提问作者Ozan Yurtsever

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:38:32