transfer_learning/
transfer_learning.rs1#![allow(clippy::pedantic, clippy::unnecessary_wraps)]
2use quantrs2_ml::autodiff::optimizers::Adam;
8use quantrs2_ml::prelude::*;
9use quantrs2_ml::qnn::QNNLayerType;
10use scirs2_core::ndarray::{Array1, Array2};
11
12fn main() -> Result<()> {
13 println!("=== Quantum Transfer Learning Demo ===\n");
14
15 println!("1. Loading pre-trained image classifier...");
17 let pretrained = QuantumModelZoo::get_image_classifier()?;
18
19 println!(" Pre-trained model info:");
20 println!(" - Task: {}", pretrained.task_description);
21 println!(
22 " - Original accuracy: {:.2}%",
23 pretrained
24 .performance_metrics
25 .get("accuracy")
26 .unwrap_or(&0.0)
27 * 100.0
28 );
29 println!(" - Number of qubits: {}", pretrained.qnn.num_qubits);
30
31 println!("\n2. Creating new layers for text classification task...");
33 let new_layers = vec![
34 QNNLayerType::VariationalLayer { num_params: 6 },
35 QNNLayerType::MeasurementLayer {
36 measurement_basis: "Pauli-Z".to_string(),
37 },
38 ];
39
40 println!("\n3. Testing different transfer learning strategies:");
42
43 println!("\n a) Fine-tuning strategy (train last 2 layers only)");
45 let mut transfer_finetune = QuantumTransferLearning::new(
46 pretrained.clone(),
47 new_layers.clone(),
48 TransferStrategy::FineTuning {
49 num_trainable_layers: 2,
50 },
51 )?;
52
53 println!(" b) Feature extraction strategy (freeze all pre-trained layers)");
55 let transfer_feature = QuantumTransferLearning::new(
56 pretrained.clone(),
57 new_layers.clone(),
58 TransferStrategy::FeatureExtraction,
59 )?;
60
61 println!(" c) Progressive unfreezing (unfreeze one layer every 5 epochs)");
63 let transfer_progressive = QuantumTransferLearning::new(
64 pretrained,
65 new_layers,
66 TransferStrategy::ProgressiveUnfreezing { unfreeze_rate: 5 },
67 )?;
68
69 println!("\n4. Generating synthetic training data...");
71 let num_samples = 50;
72 let num_features = 4;
73 let training_data = Array2::from_shape_fn((num_samples, num_features), |(i, j)| {
74 (i as f64).mul_add(0.1, j as f64 * 0.2).sin()
75 });
76 let labels = Array1::from_shape_fn(num_samples, |i| if i % 2 == 0 { 0.0 } else { 1.0 });
77
78 println!("\n5. Training with fine-tuning strategy...");
80 let mut optimizer = Adam::new(0.01);
81
82 let result = transfer_finetune.train(
83 &training_data,
84 &labels,
85 &mut optimizer,
86 20, 10, )?;
89
90 println!(" Training complete!");
91 println!(" - Final loss: {:.4}", result.final_loss);
92 println!(" - Accuracy: {:.2}%", result.accuracy * 100.0);
93
94 println!("\n6. Extracting features from pre-trained layers...");
96 let features = transfer_feature.extract_features(&training_data)?;
97 println!(" Extracted feature dimensions: {:?}", features.dim());
98
99 println!("\n7. Available pre-trained models in the zoo:");
101 println!(" - Image classifier (4 qubits, MNIST subset)");
102 println!(" - Chemistry model (6 qubits, molecular energy)");
103
104 let chemistry_model = QuantumModelZoo::get_chemistry_model()?;
106 println!("\n Chemistry model info:");
107 println!(" - Task: {}", chemistry_model.task_description);
108 println!(
109 " - MAE: {:.4}",
110 chemistry_model
111 .performance_metrics
112 .get("mae")
113 .unwrap_or(&0.0)
114 );
115 println!(
116 " - R² score: {:.4}",
117 chemistry_model
118 .performance_metrics
119 .get("r2_score")
120 .unwrap_or(&0.0)
121 );
122
123 println!("\n=== Transfer Learning Demo Complete ===");
124
125 Ok(())
126}
127
128fn print_layer_configs(configs: &[LayerConfig]) {
130 for (i, config) in configs.iter().enumerate() {
131 println!(
132 " Layer {}: frozen={}, lr_multiplier={:.2}",
133 i, config.frozen, config.learning_rate_multiplier
134 );
135 }
136}