using System.Collections.Generic; using Tensorflow; using Tensorflow.Keras; using static Tensorflow.Binding; using static Tensorflow.KerasApi; using Tensorflow.Keras.Utils; using System.IO; using Tensorflow.Keras.Engine; namespace TensorFlowNET.Examples; /// /// This tutorial shows how to classify images of flowers. /// https://www.tensorflow.org/tutorials/images/classification /// public class ImageClassificationKeras : SciSharpExample, IExample { int batch_size = 32; int epochs = 10; Shape img_dim = (64, 64); IDatasetV2 train_ds, val_ds; Model model; public ExampleConfig InitConfig() => Config = new ExampleConfig { Name = "Image Classification (Keras)", Enabled = true }; public bool Run() { tf.enable_eager_execution(); PrepareData(); BuildModel(); Train(); return true; } public override void BuildModel() { int num_classes = 5; // var normalization_layer = tf.keras.layers.Rescaling(1.0f / 255); var layers = keras.layers; var myLayers = new List { layers.Rescaling(1.0f / 255, input_shape: (img_dim.dims[0], img_dim.dims[1], 3)), layers.Conv2D(16, 3, padding: "same", activation: keras.activations.Relu), layers.MaxPooling2D(), /*layers.Conv2D(32, 3, padding: "same", activation: "relu"), layers.MaxPooling2D(), layers.Conv2D(64, 3, padding: "same", activation: "relu"), layers.MaxPooling2D(),*/ layers.Flatten(), layers.Dense(128, activation: keras.activations.Relu), layers.Dense(num_classes) }; model = keras.Sequential(myLayers); model.compile(optimizer: keras.optimizers.Adam(), loss: keras.losses.SparseCategoricalCrossentropy(from_logits: true), metrics: new[] { "accuracy" }); model.summary(); } public override void Train() { model.fit(train_ds, validation_data: val_ds, epochs: epochs); } public override void PrepareData() { string fileName = "flower_photos.tgz"; string url = $"https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz"; string data_dir = Path.Combine(Path.GetTempPath(), "flower_photos"); Web.Download(url, data_dir, fileName); Compress.ExtractTGZ(Path.Join(data_dir, fileName), data_dir); data_dir = Path.Combine(data_dir, "flower_photos"); // convert to tensor train_ds = keras.preprocessing.image_dataset_from_directory(data_dir, validation_split: 0.2f, subset: "training", seed: 123, image_size: img_dim, batch_size: batch_size); val_ds = keras.preprocessing.image_dataset_from_directory(data_dir, validation_split: 0.2f, subset: "validation", seed: 123, image_size: img_dim, batch_size: batch_size); train_ds = train_ds.shuffle(1000).prefetch(buffer_size: -1); val_ds = val_ds.prefetch(buffer_size: -1); } }