Struct multistochgrad::mnist::MnistData
source · pub struct MnistData { /* private fields */ }
Expand description
A struct to load/store MNIST data
stores labels (i.e : digits between 0 and 9) coming from file train-labels-idx1-ubyte
and hand written characters as 28*28 images with values between 0 and 255 coming from train-images-idx3-ubyte
Implementations§
source§impl MnistData
impl MnistData
sourcepub fn new(image_filename: String, label_filename: String) -> Result<MnistData>
pub fn new(image_filename: String, label_filename: String) -> Result<MnistData>
Examples found in repository?
examples/mnist_logistic_sag.rs (line 51)
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
fn main() {
let _ = env_logger::init();
log::set_max_level(log::LevelFilter::Trace);
// check for path image and labels
let image_path = PathBuf::from(String::from(IMAGE_FNAME_STR).clone());
let image_file_res = OpenOptions::new().read(true).open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", IMAGE_FNAME_STR);
return;
}
let label_path = PathBuf::from(LABEL_FNAME_STR);
let label_file_res = OpenOptions::new().read(true).open(&label_path);
if label_file_res.is_err() {
println!("could not open label file : {:?}", LABEL_FNAME_STR);
return;
}
//
// load mnist data
//
let mnist_data =
MnistData::new(String::from(IMAGE_FNAME_STR), String::from(LABEL_FNAME_STR)).unwrap();
let images = mnist_data.get_images();
let labels = mnist_data.get_labels();
// nb_images is length of third compoenent of array dimension
let (nb_row, nb_column, nb_images) = images.dim(); // get t-uple from dim method
assert_eq!(nb_images, labels.shape()[0]); // get slice from shape method...
// transform into logisitc regression
let mut observations = Vec::<(Array1<f64>, usize)>::with_capacity(nb_images);
//
for k in 0..nb_images {
let mut image = Array1::<f64>::zeros(1 + nb_row * nb_column);
let mut index = 0;
image[index] = 1.;
index += 1;
for i in 0..nb_row {
for j in 0..nb_column {
image[index] = images[[i, j, k]] as f64 / 256.;
index += 1;
}
} // end of for i
observations.push((image, labels[k] as usize));
} // end of for k
//
let regr_l = LogisticRegression::new(10, observations);
//
// minimize
//
let sag_pb = SagDescent::new(
1000, // batch_size
0.5, // step size
);
// allocate and set to 0 an array with 9 rows(each row corresponds to a class, columns are pixels values)
let mut initial_position = Array2::<f64>::zeros((9, 1 + nb_row * nb_column));
// do a bad initialization , fill with 0 is much better!!
initial_position.fill(0.5);
let nb_iter = 2000;
let solution = sag_pb.minimize(®r_l, &initial_position, Some(nb_iter));
println!(" solution with minimized value = {:2.4E}", solution.value);
//
// get image of coefficients to see corresponding images.
//
let image_fname = String::from("classe_sag.img");
for k in 0..9 {
let mut k_image_fname: String = image_fname.clone();
k_image_fname.push_str(&k.to_string());
let image_path = PathBuf::from(k_image_fname.clone());
let image_file_res = OpenOptions::new()
.write(true)
.create(true)
.open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", k_image_fname);
return;
}
//
let mut out = io::BufWriter::new(image_file_res.unwrap());
//
// get a f64 slice to write
let f64_array_to_write: &[f64] = solution.position.slice(s![k, ..]).to_slice().unwrap();
let u8_slice = unsafe {
std::slice::from_raw_parts(
f64_array_to_write.as_ptr() as *const u8,
std::mem::size_of::<f64>() * f64_array_to_write.len(),
)
};
out.write_all(u8_slice).unwrap();
out.flush().unwrap();
}
}
More examples
examples/mnist_logistic_svrg.rs (line 49)
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
fn main() {
let _ = env_logger::init();
log::set_max_level(log::LevelFilter::Trace);
// check for path image and labels
let image_path = PathBuf::from(String::from(IMAGE_FNAME_STR).clone());
let image_file_res = OpenOptions::new().read(true).open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", IMAGE_FNAME_STR);
return;
}
let label_path = PathBuf::from(LABEL_FNAME_STR);
let label_file_res = OpenOptions::new().read(true).open(&label_path);
if label_file_res.is_err() {
println!("could not open label file : {:?}", LABEL_FNAME_STR);
return;
}
//
// load mnist data
//
let mnist_data =
MnistData::new(String::from(IMAGE_FNAME_STR), String::from(LABEL_FNAME_STR)).unwrap();
let images = mnist_data.get_images();
let labels = mnist_data.get_labels();
// nb_images is length of third compoenent of array dimension
let (nb_row, nb_column, nb_images) = images.dim(); // get t-uple from dim method
assert_eq!(nb_images, labels.shape()[0]); // get slice from shape method...
// transform into logisitc regression
let mut observations = Vec::<(Array1<f64>, usize)>::with_capacity(nb_images);
//
for k in 0..nb_images {
let mut image = Array1::<f64>::zeros(1 + nb_row * nb_column);
let mut index = 0;
image[index] = 1.;
index += 1;
for i in 0..nb_row {
for j in 0..nb_column {
image[index] = images[[i, j, k]] as f64 / 256.;
index += 1;
}
} // end of for i
observations.push((image, labels[k] as usize));
} // end of for k
//
let regr_l = LogisticRegression::new(10, observations);
//
// minimize
//
//
let nb_iter = 50;
let svrg_pb = SVRGDescent::new(
2000, // mini batch size
0.05, // batch step
);
// allocate and set to 0 an array with 9 rows(each row corresponds to a class, columns are pixels values)
let mut initial_position = Array2::<f64>::zeros((9, 1 + nb_row * nb_column));
// do a bad initialization , fill with 0 is much better!!
initial_position.fill(0.0);
let solution = svrg_pb.minimize(®r_l, &initial_position, Some(nb_iter));
println!(" solution with minimized value = {:2.4E}", solution.value);
//
// get image of coefficients to see corresponding images.
//
let image_fname = String::from("classe_svrg.img");
for k in 0..9 {
let mut k_image_fname: String = image_fname.clone();
k_image_fname.push_str(&k.to_string());
let image_path = PathBuf::from(k_image_fname.clone());
let image_file_res = OpenOptions::new()
.write(true)
.create(true)
.open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", k_image_fname);
return;
}
//
let mut out = io::BufWriter::new(image_file_res.unwrap());
//
// get a f64 slice to write
let f64_array_to_write: &[f64] = solution.position.slice(s![k, ..]).to_slice().unwrap();
let u8_slice = unsafe {
std::slice::from_raw_parts(
f64_array_to_write.as_ptr() as *const u8,
std::mem::size_of::<f64>() * f64_array_to_write.len(),
)
};
out.write_all(u8_slice).unwrap();
out.flush().unwrap();
}
}
examples/mnist_logistic_scsg.rs (line 52)
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
fn main() {
init_log();
// check for path image and labels
let image_path = PathBuf::from(String::from(IMAGE_FNAME_STR).clone());
let image_file_res = OpenOptions::new().read(true).open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", IMAGE_FNAME_STR);
return;
}
let label_path = PathBuf::from(LABEL_FNAME_STR);
let label_file_res = OpenOptions::new().read(true).open(&label_path);
if label_file_res.is_err() {
println!("could not open label file : {:?}", LABEL_FNAME_STR);
return;
}
//
// load mnist data
//
let mnist_data =
MnistData::new(String::from(IMAGE_FNAME_STR), String::from(LABEL_FNAME_STR)).unwrap();
let images = mnist_data.get_images();
let labels = mnist_data.get_labels();
// nb_images is length of third compoenent of array dimension
let (nb_row, nb_column, nb_images) = images.dim(); // get t-uple from dim method
assert_eq!(nb_images, labels.shape()[0]); // get slice from shape method...
// transform into logisitc regression
let mut observations = Vec::<(Array1<f64>, usize)>::with_capacity(nb_images);
//
for k in 0..nb_images {
let mut image = Array1::<f64>::zeros(1 + nb_row * nb_column);
let mut index = 0;
image[index] = 1.;
index += 1;
for i in 0..nb_row {
for j in 0..nb_column {
image[index] = images[[i, j, k]] as f64 / 256.;
index += 1;
}
} // end of for i
observations.push((image, labels[k] as usize));
} // end of for k
//
let regr_l = LogisticRegression::new(10, observations);
//
// minimize
//
// step, m_0, b_0 , B_0
let scgd_pb = StochasticControlledGradientDescent::new(
0.1, // gradient step at beginning
0.004, // base factor for number of mini batch
1, // base for size of mini batch
0.02,
); // base for large batch size
// allocate and set to 0 an array with 9 rows(each row corresponds to a class, columns are pixels values)
let mut initial_position = Array2::<f64>::zeros((9, 1 + nb_row * nb_column));
// do a bad initializion , fill with 0 is much better!!
initial_position.fill(0.5);
//
let nb_iter = 150;
let solution = scgd_pb.minimize(®r_l, &initial_position, Some(nb_iter));
println!(" solution with minimized value = {:2.4E}", solution.value);
//
// get image of coefficients to see corresponding images.
//
let image_fname = String::from("classe_scsg.img");
for k in 0..9 {
let mut k_image_fname: String = image_fname.clone();
k_image_fname.push_str(&k.to_string());
let image_path = PathBuf::from(k_image_fname.clone());
let image_file_res = OpenOptions::new()
.write(true)
.create(true)
.open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", k_image_fname);
return;
}
//
let mut out = io::BufWriter::new(image_file_res.unwrap());
//
// get a f64 slice to write
let f64_array_to_write: &[f64] = solution.position.slice(s![k, ..]).to_slice().unwrap();
let u8_slice = unsafe {
std::slice::from_raw_parts(
f64_array_to_write.as_ptr() as *const u8,
std::mem::size_of::<f64>() * f64_array_to_write.len(),
)
};
out.write_all(u8_slice).unwrap();
out.flush().unwrap();
// out.write(&solution.position.slice(s![k, ..])).unwrap();
}
}
sourcepub fn get_labels(&self) -> &Array1<u8>
pub fn get_labels(&self) -> &Array1<u8>
returns labels of images. lables[k] is the label of the k th image.
Examples found in repository?
examples/mnist_logistic_sag.rs (line 53)
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
fn main() {
let _ = env_logger::init();
log::set_max_level(log::LevelFilter::Trace);
// check for path image and labels
let image_path = PathBuf::from(String::from(IMAGE_FNAME_STR).clone());
let image_file_res = OpenOptions::new().read(true).open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", IMAGE_FNAME_STR);
return;
}
let label_path = PathBuf::from(LABEL_FNAME_STR);
let label_file_res = OpenOptions::new().read(true).open(&label_path);
if label_file_res.is_err() {
println!("could not open label file : {:?}", LABEL_FNAME_STR);
return;
}
//
// load mnist data
//
let mnist_data =
MnistData::new(String::from(IMAGE_FNAME_STR), String::from(LABEL_FNAME_STR)).unwrap();
let images = mnist_data.get_images();
let labels = mnist_data.get_labels();
// nb_images is length of third compoenent of array dimension
let (nb_row, nb_column, nb_images) = images.dim(); // get t-uple from dim method
assert_eq!(nb_images, labels.shape()[0]); // get slice from shape method...
// transform into logisitc regression
let mut observations = Vec::<(Array1<f64>, usize)>::with_capacity(nb_images);
//
for k in 0..nb_images {
let mut image = Array1::<f64>::zeros(1 + nb_row * nb_column);
let mut index = 0;
image[index] = 1.;
index += 1;
for i in 0..nb_row {
for j in 0..nb_column {
image[index] = images[[i, j, k]] as f64 / 256.;
index += 1;
}
} // end of for i
observations.push((image, labels[k] as usize));
} // end of for k
//
let regr_l = LogisticRegression::new(10, observations);
//
// minimize
//
let sag_pb = SagDescent::new(
1000, // batch_size
0.5, // step size
);
// allocate and set to 0 an array with 9 rows(each row corresponds to a class, columns are pixels values)
let mut initial_position = Array2::<f64>::zeros((9, 1 + nb_row * nb_column));
// do a bad initialization , fill with 0 is much better!!
initial_position.fill(0.5);
let nb_iter = 2000;
let solution = sag_pb.minimize(®r_l, &initial_position, Some(nb_iter));
println!(" solution with minimized value = {:2.4E}", solution.value);
//
// get image of coefficients to see corresponding images.
//
let image_fname = String::from("classe_sag.img");
for k in 0..9 {
let mut k_image_fname: String = image_fname.clone();
k_image_fname.push_str(&k.to_string());
let image_path = PathBuf::from(k_image_fname.clone());
let image_file_res = OpenOptions::new()
.write(true)
.create(true)
.open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", k_image_fname);
return;
}
//
let mut out = io::BufWriter::new(image_file_res.unwrap());
//
// get a f64 slice to write
let f64_array_to_write: &[f64] = solution.position.slice(s![k, ..]).to_slice().unwrap();
let u8_slice = unsafe {
std::slice::from_raw_parts(
f64_array_to_write.as_ptr() as *const u8,
std::mem::size_of::<f64>() * f64_array_to_write.len(),
)
};
out.write_all(u8_slice).unwrap();
out.flush().unwrap();
}
}
More examples
examples/mnist_logistic_svrg.rs (line 51)
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
fn main() {
let _ = env_logger::init();
log::set_max_level(log::LevelFilter::Trace);
// check for path image and labels
let image_path = PathBuf::from(String::from(IMAGE_FNAME_STR).clone());
let image_file_res = OpenOptions::new().read(true).open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", IMAGE_FNAME_STR);
return;
}
let label_path = PathBuf::from(LABEL_FNAME_STR);
let label_file_res = OpenOptions::new().read(true).open(&label_path);
if label_file_res.is_err() {
println!("could not open label file : {:?}", LABEL_FNAME_STR);
return;
}
//
// load mnist data
//
let mnist_data =
MnistData::new(String::from(IMAGE_FNAME_STR), String::from(LABEL_FNAME_STR)).unwrap();
let images = mnist_data.get_images();
let labels = mnist_data.get_labels();
// nb_images is length of third compoenent of array dimension
let (nb_row, nb_column, nb_images) = images.dim(); // get t-uple from dim method
assert_eq!(nb_images, labels.shape()[0]); // get slice from shape method...
// transform into logisitc regression
let mut observations = Vec::<(Array1<f64>, usize)>::with_capacity(nb_images);
//
for k in 0..nb_images {
let mut image = Array1::<f64>::zeros(1 + nb_row * nb_column);
let mut index = 0;
image[index] = 1.;
index += 1;
for i in 0..nb_row {
for j in 0..nb_column {
image[index] = images[[i, j, k]] as f64 / 256.;
index += 1;
}
} // end of for i
observations.push((image, labels[k] as usize));
} // end of for k
//
let regr_l = LogisticRegression::new(10, observations);
//
// minimize
//
//
let nb_iter = 50;
let svrg_pb = SVRGDescent::new(
2000, // mini batch size
0.05, // batch step
);
// allocate and set to 0 an array with 9 rows(each row corresponds to a class, columns are pixels values)
let mut initial_position = Array2::<f64>::zeros((9, 1 + nb_row * nb_column));
// do a bad initialization , fill with 0 is much better!!
initial_position.fill(0.0);
let solution = svrg_pb.minimize(®r_l, &initial_position, Some(nb_iter));
println!(" solution with minimized value = {:2.4E}", solution.value);
//
// get image of coefficients to see corresponding images.
//
let image_fname = String::from("classe_svrg.img");
for k in 0..9 {
let mut k_image_fname: String = image_fname.clone();
k_image_fname.push_str(&k.to_string());
let image_path = PathBuf::from(k_image_fname.clone());
let image_file_res = OpenOptions::new()
.write(true)
.create(true)
.open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", k_image_fname);
return;
}
//
let mut out = io::BufWriter::new(image_file_res.unwrap());
//
// get a f64 slice to write
let f64_array_to_write: &[f64] = solution.position.slice(s![k, ..]).to_slice().unwrap();
let u8_slice = unsafe {
std::slice::from_raw_parts(
f64_array_to_write.as_ptr() as *const u8,
std::mem::size_of::<f64>() * f64_array_to_write.len(),
)
};
out.write_all(u8_slice).unwrap();
out.flush().unwrap();
}
}
examples/mnist_logistic_scsg.rs (line 54)
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
fn main() {
init_log();
// check for path image and labels
let image_path = PathBuf::from(String::from(IMAGE_FNAME_STR).clone());
let image_file_res = OpenOptions::new().read(true).open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", IMAGE_FNAME_STR);
return;
}
let label_path = PathBuf::from(LABEL_FNAME_STR);
let label_file_res = OpenOptions::new().read(true).open(&label_path);
if label_file_res.is_err() {
println!("could not open label file : {:?}", LABEL_FNAME_STR);
return;
}
//
// load mnist data
//
let mnist_data =
MnistData::new(String::from(IMAGE_FNAME_STR), String::from(LABEL_FNAME_STR)).unwrap();
let images = mnist_data.get_images();
let labels = mnist_data.get_labels();
// nb_images is length of third compoenent of array dimension
let (nb_row, nb_column, nb_images) = images.dim(); // get t-uple from dim method
assert_eq!(nb_images, labels.shape()[0]); // get slice from shape method...
// transform into logisitc regression
let mut observations = Vec::<(Array1<f64>, usize)>::with_capacity(nb_images);
//
for k in 0..nb_images {
let mut image = Array1::<f64>::zeros(1 + nb_row * nb_column);
let mut index = 0;
image[index] = 1.;
index += 1;
for i in 0..nb_row {
for j in 0..nb_column {
image[index] = images[[i, j, k]] as f64 / 256.;
index += 1;
}
} // end of for i
observations.push((image, labels[k] as usize));
} // end of for k
//
let regr_l = LogisticRegression::new(10, observations);
//
// minimize
//
// step, m_0, b_0 , B_0
let scgd_pb = StochasticControlledGradientDescent::new(
0.1, // gradient step at beginning
0.004, // base factor for number of mini batch
1, // base for size of mini batch
0.02,
); // base for large batch size
// allocate and set to 0 an array with 9 rows(each row corresponds to a class, columns are pixels values)
let mut initial_position = Array2::<f64>::zeros((9, 1 + nb_row * nb_column));
// do a bad initializion , fill with 0 is much better!!
initial_position.fill(0.5);
//
let nb_iter = 150;
let solution = scgd_pb.minimize(®r_l, &initial_position, Some(nb_iter));
println!(" solution with minimized value = {:2.4E}", solution.value);
//
// get image of coefficients to see corresponding images.
//
let image_fname = String::from("classe_scsg.img");
for k in 0..9 {
let mut k_image_fname: String = image_fname.clone();
k_image_fname.push_str(&k.to_string());
let image_path = PathBuf::from(k_image_fname.clone());
let image_file_res = OpenOptions::new()
.write(true)
.create(true)
.open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", k_image_fname);
return;
}
//
let mut out = io::BufWriter::new(image_file_res.unwrap());
//
// get a f64 slice to write
let f64_array_to_write: &[f64] = solution.position.slice(s![k, ..]).to_slice().unwrap();
let u8_slice = unsafe {
std::slice::from_raw_parts(
f64_array_to_write.as_ptr() as *const u8,
std::mem::size_of::<f64>() * f64_array_to_write.len(),
)
};
out.write_all(u8_slice).unwrap();
out.flush().unwrap();
// out.write(&solution.position.slice(s![k, ..])).unwrap();
}
}
sourcepub fn get_images(&self) -> &Array3<u8>
pub fn get_images(&self) -> &Array3<u8>
returns images. images are stored in Array3 with Array3[[.., .., k]] being the k images! Each image is stored as it is in the Mnist files, Array3[[i, .., k]] is the i row of the k image
Examples found in repository?
examples/mnist_logistic_sag.rs (line 52)
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
fn main() {
let _ = env_logger::init();
log::set_max_level(log::LevelFilter::Trace);
// check for path image and labels
let image_path = PathBuf::from(String::from(IMAGE_FNAME_STR).clone());
let image_file_res = OpenOptions::new().read(true).open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", IMAGE_FNAME_STR);
return;
}
let label_path = PathBuf::from(LABEL_FNAME_STR);
let label_file_res = OpenOptions::new().read(true).open(&label_path);
if label_file_res.is_err() {
println!("could not open label file : {:?}", LABEL_FNAME_STR);
return;
}
//
// load mnist data
//
let mnist_data =
MnistData::new(String::from(IMAGE_FNAME_STR), String::from(LABEL_FNAME_STR)).unwrap();
let images = mnist_data.get_images();
let labels = mnist_data.get_labels();
// nb_images is length of third compoenent of array dimension
let (nb_row, nb_column, nb_images) = images.dim(); // get t-uple from dim method
assert_eq!(nb_images, labels.shape()[0]); // get slice from shape method...
// transform into logisitc regression
let mut observations = Vec::<(Array1<f64>, usize)>::with_capacity(nb_images);
//
for k in 0..nb_images {
let mut image = Array1::<f64>::zeros(1 + nb_row * nb_column);
let mut index = 0;
image[index] = 1.;
index += 1;
for i in 0..nb_row {
for j in 0..nb_column {
image[index] = images[[i, j, k]] as f64 / 256.;
index += 1;
}
} // end of for i
observations.push((image, labels[k] as usize));
} // end of for k
//
let regr_l = LogisticRegression::new(10, observations);
//
// minimize
//
let sag_pb = SagDescent::new(
1000, // batch_size
0.5, // step size
);
// allocate and set to 0 an array with 9 rows(each row corresponds to a class, columns are pixels values)
let mut initial_position = Array2::<f64>::zeros((9, 1 + nb_row * nb_column));
// do a bad initialization , fill with 0 is much better!!
initial_position.fill(0.5);
let nb_iter = 2000;
let solution = sag_pb.minimize(®r_l, &initial_position, Some(nb_iter));
println!(" solution with minimized value = {:2.4E}", solution.value);
//
// get image of coefficients to see corresponding images.
//
let image_fname = String::from("classe_sag.img");
for k in 0..9 {
let mut k_image_fname: String = image_fname.clone();
k_image_fname.push_str(&k.to_string());
let image_path = PathBuf::from(k_image_fname.clone());
let image_file_res = OpenOptions::new()
.write(true)
.create(true)
.open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", k_image_fname);
return;
}
//
let mut out = io::BufWriter::new(image_file_res.unwrap());
//
// get a f64 slice to write
let f64_array_to_write: &[f64] = solution.position.slice(s![k, ..]).to_slice().unwrap();
let u8_slice = unsafe {
std::slice::from_raw_parts(
f64_array_to_write.as_ptr() as *const u8,
std::mem::size_of::<f64>() * f64_array_to_write.len(),
)
};
out.write_all(u8_slice).unwrap();
out.flush().unwrap();
}
}
More examples
examples/mnist_logistic_svrg.rs (line 50)
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
fn main() {
let _ = env_logger::init();
log::set_max_level(log::LevelFilter::Trace);
// check for path image and labels
let image_path = PathBuf::from(String::from(IMAGE_FNAME_STR).clone());
let image_file_res = OpenOptions::new().read(true).open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", IMAGE_FNAME_STR);
return;
}
let label_path = PathBuf::from(LABEL_FNAME_STR);
let label_file_res = OpenOptions::new().read(true).open(&label_path);
if label_file_res.is_err() {
println!("could not open label file : {:?}", LABEL_FNAME_STR);
return;
}
//
// load mnist data
//
let mnist_data =
MnistData::new(String::from(IMAGE_FNAME_STR), String::from(LABEL_FNAME_STR)).unwrap();
let images = mnist_data.get_images();
let labels = mnist_data.get_labels();
// nb_images is length of third compoenent of array dimension
let (nb_row, nb_column, nb_images) = images.dim(); // get t-uple from dim method
assert_eq!(nb_images, labels.shape()[0]); // get slice from shape method...
// transform into logisitc regression
let mut observations = Vec::<(Array1<f64>, usize)>::with_capacity(nb_images);
//
for k in 0..nb_images {
let mut image = Array1::<f64>::zeros(1 + nb_row * nb_column);
let mut index = 0;
image[index] = 1.;
index += 1;
for i in 0..nb_row {
for j in 0..nb_column {
image[index] = images[[i, j, k]] as f64 / 256.;
index += 1;
}
} // end of for i
observations.push((image, labels[k] as usize));
} // end of for k
//
let regr_l = LogisticRegression::new(10, observations);
//
// minimize
//
//
let nb_iter = 50;
let svrg_pb = SVRGDescent::new(
2000, // mini batch size
0.05, // batch step
);
// allocate and set to 0 an array with 9 rows(each row corresponds to a class, columns are pixels values)
let mut initial_position = Array2::<f64>::zeros((9, 1 + nb_row * nb_column));
// do a bad initialization , fill with 0 is much better!!
initial_position.fill(0.0);
let solution = svrg_pb.minimize(®r_l, &initial_position, Some(nb_iter));
println!(" solution with minimized value = {:2.4E}", solution.value);
//
// get image of coefficients to see corresponding images.
//
let image_fname = String::from("classe_svrg.img");
for k in 0..9 {
let mut k_image_fname: String = image_fname.clone();
k_image_fname.push_str(&k.to_string());
let image_path = PathBuf::from(k_image_fname.clone());
let image_file_res = OpenOptions::new()
.write(true)
.create(true)
.open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", k_image_fname);
return;
}
//
let mut out = io::BufWriter::new(image_file_res.unwrap());
//
// get a f64 slice to write
let f64_array_to_write: &[f64] = solution.position.slice(s![k, ..]).to_slice().unwrap();
let u8_slice = unsafe {
std::slice::from_raw_parts(
f64_array_to_write.as_ptr() as *const u8,
std::mem::size_of::<f64>() * f64_array_to_write.len(),
)
};
out.write_all(u8_slice).unwrap();
out.flush().unwrap();
}
}
examples/mnist_logistic_scsg.rs (line 53)
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
fn main() {
init_log();
// check for path image and labels
let image_path = PathBuf::from(String::from(IMAGE_FNAME_STR).clone());
let image_file_res = OpenOptions::new().read(true).open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", IMAGE_FNAME_STR);
return;
}
let label_path = PathBuf::from(LABEL_FNAME_STR);
let label_file_res = OpenOptions::new().read(true).open(&label_path);
if label_file_res.is_err() {
println!("could not open label file : {:?}", LABEL_FNAME_STR);
return;
}
//
// load mnist data
//
let mnist_data =
MnistData::new(String::from(IMAGE_FNAME_STR), String::from(LABEL_FNAME_STR)).unwrap();
let images = mnist_data.get_images();
let labels = mnist_data.get_labels();
// nb_images is length of third compoenent of array dimension
let (nb_row, nb_column, nb_images) = images.dim(); // get t-uple from dim method
assert_eq!(nb_images, labels.shape()[0]); // get slice from shape method...
// transform into logisitc regression
let mut observations = Vec::<(Array1<f64>, usize)>::with_capacity(nb_images);
//
for k in 0..nb_images {
let mut image = Array1::<f64>::zeros(1 + nb_row * nb_column);
let mut index = 0;
image[index] = 1.;
index += 1;
for i in 0..nb_row {
for j in 0..nb_column {
image[index] = images[[i, j, k]] as f64 / 256.;
index += 1;
}
} // end of for i
observations.push((image, labels[k] as usize));
} // end of for k
//
let regr_l = LogisticRegression::new(10, observations);
//
// minimize
//
// step, m_0, b_0 , B_0
let scgd_pb = StochasticControlledGradientDescent::new(
0.1, // gradient step at beginning
0.004, // base factor for number of mini batch
1, // base for size of mini batch
0.02,
); // base for large batch size
// allocate and set to 0 an array with 9 rows(each row corresponds to a class, columns are pixels values)
let mut initial_position = Array2::<f64>::zeros((9, 1 + nb_row * nb_column));
// do a bad initializion , fill with 0 is much better!!
initial_position.fill(0.5);
//
let nb_iter = 150;
let solution = scgd_pb.minimize(®r_l, &initial_position, Some(nb_iter));
println!(" solution with minimized value = {:2.4E}", solution.value);
//
// get image of coefficients to see corresponding images.
//
let image_fname = String::from("classe_scsg.img");
for k in 0..9 {
let mut k_image_fname: String = image_fname.clone();
k_image_fname.push_str(&k.to_string());
let image_path = PathBuf::from(k_image_fname.clone());
let image_file_res = OpenOptions::new()
.write(true)
.create(true)
.open(&image_path);
if image_file_res.is_err() {
println!("could not open image file : {:?}", k_image_fname);
return;
}
//
let mut out = io::BufWriter::new(image_file_res.unwrap());
//
// get a f64 slice to write
let f64_array_to_write: &[f64] = solution.position.slice(s![k, ..]).to_slice().unwrap();
let u8_slice = unsafe {
std::slice::from_raw_parts(
f64_array_to_write.as_ptr() as *const u8,
std::mem::size_of::<f64>() * f64_array_to_write.len(),
)
};
out.write_all(u8_slice).unwrap();
out.flush().unwrap();
// out.write(&solution.position.slice(s![k, ..])).unwrap();
}
}
Auto Trait Implementations§
impl RefUnwindSafe for MnistData
impl Send for MnistData
impl Sync for MnistData
impl Unpin for MnistData
impl UnwindSafe for MnistData
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more