{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":13836,"databundleVersionId":1718836,"sourceType":"competition"}],"dockerImageVersionId":30198,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nimport pandas as pd\nimport keras\nfrom keras.models import Sequential\nfrom keras.layers import Conv2D,MaxPooling2D,Dense,Flatten,Dropout\nimport matplotlib.pyplot as plt\nfrom tensorflow.keras.layers import BatchNormalization\nfrom keras_preprocessing import image\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator","metadata":{"id":"3wzQUWnHNY1g","executionInfo":{"status":"ok","timestamp":1654333995301,"user_tz":-180,"elapsed":2832,"user":{"displayName":"Florin Buzea","userId":"17727048524904359209"}},"execution":{"iopub.status.busy":"2024-06-05T18:42:00.622366Z","iopub.execute_input":"2024-06-05T18:42:00.622725Z","iopub.status.idle":"2024-06-05T18:42:05.955087Z","shell.execute_reply.started":"2024-06-05T18:42:00.622610Z","shell.execute_reply":"2024-06-05T18:42:05.954186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nDir = '../input/cassava-leaf-disease-classification'\nos.listdir(Dir)","metadata":{"id":"G4om1RYKNe_Z","executionInfo":{"status":"ok","timestamp":1654334016842,"user_tz":-180,"elapsed":8690,"user":{"displayName":"Florin Buzea","userId":"17727048524904359209"}},"outputId":"730a8003-c385-4e52-d368-c5965587937a","execution":{"iopub.status.busy":"2024-06-05T18:42:09.054546Z","iopub.execute_input":"2024-06-05T18:42:09.055493Z","iopub.status.idle":"2024-06-05T18:42:09.063464Z","shell.execute_reply.started":"2024-06-05T18:42:09.055452Z","shell.execute_reply":"2024-06-05T18:42:09.062618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = '../input/cassava-leaf-disease-classification/train_images/'\n#test_dir = '../input/stanford-cars-reduced/stanford-car-reduced/test'\ntrain_df = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\ntrain_df['label'] = train_df['label'].astype('str')\n\ndata_generator = ImageDataGenerator(\n     rescale=1./255,  # Normalizare\n#     rotation_range=30,  # Rotație cu un unghi\n#     width_shift_range=0.2,  # Translatare orizontală stânga-dreapta\n#     height_shift_range=0.2,  # Translatare verticală sus-jos\n#     shear_range=0.2,  # Forfecare/deformare imagine\n#     horizontal_flip=True,  # Flip orizontal/ versiuni în oglindă\n#     zoom_range=0.3,  # Zoom\n     validation_split=0.2  # Split validare\n)\n\n\n#test_generator = ImageDataGenerator(rescale=1./255)\n                               \nimsize = (224, 224)\n\ntrain_batch = 20 #20 initial\ntest_batch = 10 \n\ntrain_generator = data_generator.flow_from_dataframe(train_df, \n                                                     directory=train_dir, \n                                                     target_size=imsize, \n                                                     batch_size=train_batch, \n                                                     subset='training',\n                                                     seed = 42,\n                                                     x_col = \"image_id\",\n                                                     y_col = \"label\",\n                                                    class_mode = \"sparse\")\ntest_generator = data_generator.flow_from_dataframe(train_df, \n                                                    directory=train_dir, \n                                                    target_size=imsize, \n                                                    batch_size = test_batch, \n                                                    subset='validation',\n                                                    seed = 42,\n                                                    x_col = \"image_id\",\n                                                    y_col = \"label\",\n                                                   class_mode = \"sparse\")\n# classes = list(train_generator.class_indices.keys())\n# classes\n\ninput_shape = train_generator.image_shape\ninput_shape\n\nnum_classes = train_df['label'].nunique()\nnum_classes\n\n#x_train, y_train = next(train_generator)\n#for i in tqdm(range(int(len(train_generator)/batch_size)-1)): #1st batch is already fetched before the for loop.\n # img, label = next(train_generator)\n  #x_train = np.append(X_train, img, axis=0 )\n  #y_train = np.append(y_train, label, axis=0)\n#print(x_train.shape, y_train.shape)","metadata":{"id":"5IcbtPgfNgIX","executionInfo":{"status":"ok","timestamp":1654334030006,"user_tz":-180,"elapsed":11751,"user":{"displayName":"Florin Buzea","userId":"17727048524904359209"}},"outputId":"e9a97368-32a0-4708-dfb1-247bfbfe836d","execution":{"iopub.status.busy":"2024-06-05T18:42:12.276356Z","iopub.execute_input":"2024-06-05T18:42:12.277295Z","iopub.status.idle":"2024-06-05T18:42:57.984178Z","shell.execute_reply.started":"2024-06-05T18:42:12.277248Z","shell.execute_reply":"2024-06-05T18:42:57.983378Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install Pillow\n\nfrom PIL import Image\n\n# Replace 'path_to_image' with the path to your image file\nimage_path = '../input/cassava-leaf-disease-classification/train_images/1000201771.jpg'\n\n# Open the image file\nwith Image.open(image_path) as img:\n    # Get image resolution\n    width, height = img.size\n\nprint(f\"The resolution of the image is {width}x{height}\")\n","metadata":{"id":"x4nZKZgljFKW","executionInfo":{"status":"ok","timestamp":1654109817712,"user_tz":-180,"elapsed":565,"user":{"displayName":"Florin Buzea","userId":"17727048524904359209"}},"outputId":"55dd9aef-64c2-4a8f-d18b-26cc65e226ef","execution":{"iopub.status.busy":"2024-06-03T16:18:39.386701Z","iopub.execute_input":"2024-06-03T16:18:39.387122Z","iopub.status.idle":"2024-06-03T16:18:51.710476Z","shell.execute_reply.started":"2024-06-03T16:18:39.387088Z","shell.execute_reply":"2024-06-03T16:18:51.709462Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Implementare si antrenare XNL-CNN","metadata":{"id":"u2teHtLbn4yi"}},{"cell_type":"code","source":"# xNL_CNN MODEL \n# Returns a precompiled model with a specific optimizer included \n#-------- extended NL-CNN model (improved from https://github.com/radu-dogaru/NL-CNN-a-compact-fast-trainable-convolutional-neural-net)\n# add_layer may now range from 0 to 4 to cope with large image sizes \n# k1 is a coefficient to control de filters in the additional layers (add_layers), a value ranging from 0.7 to 1 is Ok \n#-----------------------------------------------------------------------------------------------------\n# Copright Radu & Ioana Dogaru ; Last update March 2023 \n#==============================================================================================\nfrom tensorflow.keras.models import Sequential\n\nfrom tensorflow.keras.layers  import BatchNormalization\nfrom tensorflow.keras.layers import Dense, Dropout, Flatten, Activation\nfrom tensorflow.keras.layers import Conv2D, DepthwiseConv2D, MaxPooling2D, AveragePooling2D, GlobalAveragePooling2D, SeparableConv2D  # straturi convolutionale si max-pooling \nfrom tensorflow.keras.optimizers import  SGD, Adadelta, Adam, Nadam, RMSprop\n\n\ndef create_xnlcnn_model(input_shape, num_classes, k=1.5, k1=1.5, separ=0, flat=0, width=80, nl=(3,2), add_layer=0):\n  # Arguments: k - multiplication coefficient \n  # Structure parameteres \n  kfil=k\n  filtre1=width ; filtre2=int(kfil*filtre1) ; filtre3=(kfil*filtre2)  # filters (kernels) per each layer - efic. pe primul \n  nr_conv=3 # 0, 1, 2 sau 3  (number of convolution layers)\n  csize1=3; csize2=3 ; csize3=3      # convolution kernel size (square kernel) \n  psize1=4; psize2=4 ; psize3=4      # pooling size (square)\n  str1=2; str2=2; str3=2             # stride pooling (downsampling rate) \n  pad='same'; # padding style ('valid' is also an alternative)\n  nonlinlayers1=nl[0]  # total of layers (with RELU nonlin) in the first maxpool layer  # De parametrizat asta \n  nonlinlayers2=nl[1]  # \n\n  nonlin_type='relu' # may be other as well 'tanh' 'elu' 'softsign'\n  bndrop=1 # include BatchNorm inainte de MaxPool si drop(0.3) dupa .. \n  cvdrop=1 # droput \n  drop_cv=0.5\n  \n  model = Sequential()\n  # convolution layer1  ==========================================================================\n  # Initially first layer was always a Conv2D one\n  if separ==1:\n    model.add( SeparableConv2D(filtre1, padding=pad, kernel_size=(csize1, csize1), input_shape=input_shape) )\n  elif separ==0: \n    model.add( Conv2D(filtre1, padding=pad, kernel_size=(csize1, csize1), input_shape=input_shape) )\n\n  # next are the additional layers \n  for nl in range(nonlinlayers1-1):\n    model.add(Activation(nonlin_type))  # Activ NL-CNN-1\n    if separ==1:\n      model.add(SeparableConv2D(filtre1, padding=pad, kernel_size=(csize1, csize1) ) ) # Activ NL-CNN-2\n    elif separ==0:\n      model.add(Conv2D(filtre1, padding=pad, kernel_size=(csize1, csize1)) ) # Activ NL-CNN-2\n  #  MaxPool in the end of the module \n  if bndrop==1:\n    model.add(BatchNormalization())\n  model.add(MaxPooling2D(pool_size=(psize1, psize1),strides=(str1,str1),padding=pad))\n  if cvdrop==1:\n    model.add(Dropout(drop_cv))\n  \n  # NL LAYER 2 =======================================================================================================\n \n  if separ==1:\n    model.add(SeparableConv2D(filtre2, padding=pad, kernel_size=(csize2, csize2)) )\n  elif separ==0:\n    model.add(Conv2D(filtre2, padding=pad, kernel_size=(csize2, csize2)) )\n  # aici se adauga un neliniar \n    \n  #=========== unul extra NL=2 pe strat 2 =====================\n  for nl in range(nonlinlayers2-1):\n    model.add(Activation(nonlin_type))  # Activ NL-CNN-1\n    if separ==1:\n        model.add(SeparableConv2D(filtre2, padding=pad, kernel_size=(csize2, csize2)) ) # Activ NL-CNN-2\n    elif separ==0:\n        model.add(Conv2D(filtre2, padding=pad, kernel_size=(csize2, csize2)) ) # Activ NL-CNN-2\n        \n  # OUTPUT OF LAYER 2 (MAX-POOL)\n  if bndrop==1:\n      model.add(BatchNormalization())\n  model.add(MaxPooling2D(pool_size=(psize2, psize2),strides=(str2,str2),padding=pad))\n  if cvdrop==1:\n      model.add(Dropout(drop_cv))\n  #-------------------------------------------------------------------------------------------\n  # LAYER 3 \n      \n  if separ==1:\n      model.add(SeparableConv2D(filtre3, padding=pad, kernel_size=(csize3, csize3)) )  # SeparableConv\n  elif separ==0:\n      model.add(Conv2D(filtre3, padding=pad, kernel_size=(csize3, csize3)) ) # Activ NL-CNN-2\n  # OUTPUT OF LAYER 3 \n  if bndrop==1:\n      model.add(BatchNormalization())\n  model.add(MaxPooling2D(pool_size=(psize3, psize3),strides=(str3,str3),padding=pad))\n  if cvdrop==1:\n      model.add(Dropout(drop_cv))\n  #------------------- \n  # \n  # LAYER 4  (only if requested - for large images ?? )\n  if add_layer>=1:    \n    if separ==1:\n      model.add(SeparableConv2D(k1*filtre3, padding=pad, kernel_size=(csize3, csize3)) )  # SeparableConv\n    elif separ==0:\n      model.add(Conv2D(k1*filtre3, padding=pad, kernel_size=(csize3, csize3)) ) # Activ NL-CNN-2\n    # OUTPUT OF LAYER 4\n    if bndrop==1:\n      model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size=(psize3, psize3),strides=(str3,str3),padding=pad))\n    if cvdrop==1:\n      model.add(Dropout(drop_cv))\n  if add_layer>=2:\n    if separ==1:\n      model.add(SeparableConv2D(k1*k1*filtre3, padding=pad, kernel_size=(csize3, csize3)) )  # SeparableConv\n    elif separ==0:\n      model.add(Conv2D(k1*k1*filtre3, padding=pad, kernel_size=(csize3, csize3)) ) # Activ NL-CNN-2\n    # OUTPUT OF LAYER 5\n    if bndrop==1:\n      model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size=(psize3, psize3),strides=(str3,str3),padding=pad))\n    if cvdrop==1:\n      model.add(Dropout(drop_cv))\n  if add_layer>=3:\n    if separ==1:\n      model.add(SeparableConv2D(k1*k1*k1*filtre3, padding=pad, kernel_size=(csize3, csize3)) )  # SeparableConv\n    elif separ==0:\n      model.add(Conv2D(k1*k1*k1*filtre3, padding=pad, kernel_size=(csize3, csize3)) ) # Activ NL-CNN-2\n    # OUTPUT OF LAYER 5\n    if bndrop==1:\n      model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size=(psize3, psize3),strides=(str3,str3),padding=pad))\n    if cvdrop==1:\n      model.add(Dropout(drop_cv))\n  if add_layer==4:\n    if separ==1:\n      model.add(SeparableConv2D(k1*k1*k1*k1*filtre3, padding=pad, kernel_size=(csize3, csize3)) )  # SeparableConv\n    elif separ==0:\n      model.add(Conv2D(k1*k1*k1*filtre3, padding=pad, kernel_size=(csize3, csize3)) ) # Activ NL-CNN-2\n    # OUTPUT OF LAYER 5\n    if bndrop==1:\n      model.add(BatchNormalization())\n    model.add(MaxPooling2D(pool_size=(psize3, psize3),strides=(str3,str3),padding=pad))\n    if cvdrop==1:\n      model.add(Dropout(drop_cv))\n  #========================================================================================\n  # INPUT TO DENSE LAYER (FLATTEN - more data can overfit / GLOBAL - less data - may be a good choice ) \n  if flat==1:\n      model.add(Flatten())  # \n  elif flat==0:\n      model.add(GlobalAveragePooling2D()) # Global average \n  #model.add(Dense(500,activation='relu')) \n  model.add(Dense(num_classes, activation='softmax'))\n  # END OF MODEL DESCRIPTION \n\n  return model\n\n\n# Constructing a XNL-CNN model \n# with strategy.scope():\n\nmodel=create_xnlcnn_model(input_shape=[*input_shape], num_classes=5, k=2, k1=1, separ=0, flat=0, width=50, nl=(2,2), add_layer=4)\n\n# - cele de mai sus se comenteaza daca s-a invocat modelul de mai sus (fara apel functie)\n\n \n\nmodel.compile(\n    optimizer=tf.keras.optimizers.Adam(),\n    loss = 'sparse_categorical_crossentropy',\n    metrics=['sparse_categorical_accuracy'],\n    #steps_per_execution=16  \n)\nmodel.summary()","metadata":{"id":"eqFzJLT3J8OY","executionInfo":{"status":"ok","timestamp":1654334068362,"user_tz":-180,"elapsed":253,"user":{"displayName":"Florin Buzea","userId":"17727048524904359209"}},"execution":{"iopub.status.busy":"2024-06-05T19:54:19.127610Z","iopub.execute_input":"2024-06-05T19:54:19.128039Z","iopub.status.idle":"2024-06-05T19:54:19.395387Z","shell.execute_reply.started":"2024-06-05T19:54:19.128008Z","shell.execute_reply":"2024-06-05T19:54:19.394527Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **efficientnet**","metadata":{}},{"cell_type":"code","source":"from keras.models import Sequential\nfrom keras.layers import GlobalAveragePooling2D, Flatten, Dense, Dropout, BatchNormalization\nfrom tensorflow.keras.optimizers import RMSprop, Adam\nfrom keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau\nfrom tensorflow.keras.applications import EfficientNetB3\n\n\ndef create_model():\n    \n    model = Sequential()\n    # initialize the model with input shape\n    model.add(\n        EfficientNetB3(\n            input_shape = (224,224, 3), \n            include_top = False,\n            weights='imagenet',\n            drop_connect_rate=0.6,\n        )\n    )\n    model.add(GlobalAveragePooling2D())\n    model.add(Flatten())\n    model.add(Dense(\n        256, \n        activation='relu', \n        bias_regularizer=tf.keras.regularizers.L1L2(l1=0.01, l2=0.001)\n    ))\n    model.add(Dropout(0.5))\n    model.add(Dense(num_classes, activation = 'softmax'))\n    \n    my_loss='sparse_categorical_crossentropy'    \n    model.compile(\n        optimizer = Adam(),\n        loss = my_loss,\n        metrics = ['accuracy']\n    )\n    return model\n\nmodel = create_model()\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2024-06-05T19:12:29.585201Z","iopub.execute_input":"2024-06-05T19:12:29.585603Z","iopub.status.idle":"2024-06-05T19:12:33.156266Z","shell.execute_reply.started":"2024-06-05T19:12:29.585567Z","shell.execute_reply":"2024-06-05T19:12:33.155309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **MOBILENET**","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nimport keras\nimport numpy as np # linear algebra\nimport keras.backend as K \n\nimport time as ti \nimport scipy.io as sio\n\nfrom tensorflow.keras.models import Sequential\n#from keras.layers.normalization import BatchNormalization\nfrom tensorflow.keras.layers import Dense, Dropout, Flatten, Activation\nfrom tensorflow.keras.layers import Conv2D, DepthwiseConv2D, MaxPooling2D, AveragePooling2D, GlobalAveragePooling2D, SeparableConv2D  # straturi convolutionale si max-pooling \n#from keras.optimizers import RMSprop, SGD, Adadelta, Adam, Nadam\nfrom tensorflow.keras.layers  import BatchNormalization\nfrom tensorflow.keras.optimizers import  SGD, Adadelta, Adam, Nadam\n\nimport matplotlib.pyplot as plt\n\ndef create_model():\n  \n  #pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[input_shape[0], input_shape[1], 3], include_top=False)\n  pretrained_model = tf.keras.applications.MobileNetV2(alpha=0.75, input_shape=[input_shape[0], input_shape[1], 3], include_top=False)\n  pretrained_model.trainable = True   \n  # True - all weights are trained; False: only the output layer is trained \n\n  model = tf.keras.Sequential([\n    pretrained_model,\n    tf.keras.layers.GlobalAveragePooling2D(),\n    #tf.keras.layers.Dense(1000,activation='relu'),  # Numai daca se doreste un strat dens suplimentar \n    tf.keras.layers.Dense(num_classes, activation='softmax')\n  ])\n  myopt = Adam()\n  #myopt = Nadam()\n  # --------------------------   LOSS function  ------------------------------------\n#   my_loss='categorical_crossentropy'\n  my_loss='sparse_categorical_crossentropy'\n  model.compile(loss=my_loss, \n              optimizer=myopt,   \n              metrics=['accuracy'])\n  return model\n\nmodel = create_model()\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2024-05-27T09:36:50.666690Z","iopub.status.idle":"2024-05-27T09:36:50.667161Z","shell.execute_reply.started":"2024-05-27T09:36:50.666924Z","shell.execute_reply":"2024-05-27T09:36:50.666950Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# DenseNet121","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nimport keras\nimport numpy as np # linear algebra\nimport keras.backend as K \n\nimport time as ti \nimport scipy.io as sio\n\nfrom tensorflow.keras.models import Sequential\n#from keras.layers.normalization import BatchNormalization\nfrom tensorflow.keras.layers import Dense, Dropout, Flatten, Activation\nfrom tensorflow.keras.layers import Conv2D, DepthwiseConv2D, MaxPooling2D, AveragePooling2D, GlobalAveragePooling2D, SeparableConv2D  # straturi convolutionale si max-pooling \n#from keras.optimizers import RMSprop, SGD, Adadelta, Adam, Nadam\nfrom tensorflow.keras.layers  import BatchNormalization\nfrom tensorflow.keras.optimizers import  SGD, Adadelta, Adam, Nadam\n\nimport matplotlib.pyplot as plt\n\ndef create_model():\n  \n  \n  pretrained_model = tf.keras.applications.DenseNet121(\n    include_top=False,\n    #weights=\"imagenet\",\n    input_shape=[input_shape[0], input_shape[1], 3],\n)\n  pretrained_model.trainable = True   \n  # True - all weights are trained; False: only the output layer is trained \n\n  model = tf.keras.Sequential([\n    pretrained_model,\n    tf.keras.layers.GlobalAveragePooling2D(),\n    #tf.keras.layers.Dense(1000,activation='relu'),  # Numai daca se doreste un strat dens suplimentar \n    tf.keras.layers.Dense(num_classes, activation='softmax')\n  ])\n  myopt = Adam()\n  #myopt = Nadam()\n  # --------------------------   LOSS function  ------------------------------------\n#   my_loss='categorical_crossentropy'\n  my_loss='sparse_categorical_crossentropy'\n  model.compile(loss=my_loss, \n              optimizer=myopt,   \n              metrics=['accuracy'])\n  return model\n\nmodel = create_model()\nmodel.summary()\n","metadata":{"execution":{"iopub.status.busy":"2024-05-27T09:36:50.668279Z","iopub.status.idle":"2024-05-27T09:36:50.668628Z","shell.execute_reply.started":"2024-05-27T09:36:50.668466Z","shell.execute_reply":"2024-05-27T09:36:50.668483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# TRAINING OF THE NL-CNN MODEL  \n#-----------------  for reproductibility  ----------------------\nimport tensorflow as tf \nfrom numpy.random import seed\nseed(1)\ntf.random.set_seed(2)\n#----------------------------------------------------\n\nimport keras\nimport numpy as np # linear algebra\nimport keras.backend as K \n\nimport time as ti \nimport scipy.io as sio\nimport matplotlib.pyplot as plt\n\n#=====================================================================\nbatch_size = 20  # Ranging betwee 10 (small datasets) to 100 (larger datasets)\nepoci = 40 # maximal number of training epochs (the best result may be obtained earlier)\n#----------------------------------------------------------------------------------------\n\nerr_test=np.zeros(epoci)   # For plotting test error evolution  \nbest_acc=0.0\nbest_ep=0\nt1=ti.time()\nfor k in range(epoci):\n      tx=ti.time()\n      model.fit(train_generator,\n              batch_size=batch_size,\n              epochs=1,\n              verbose=1  # aici 0 (nu afiseaza nimic) 1 (detaliat) 2(numai epocile)\n              ) #SE OPRESTE AICI\n      \n      ty=ti.time()\n      print('/',k,'epoch lasted ',ty-tx,' seconds')\n      \n      score = model.evaluate(test_generator, verbose=1)\n      \n      err_test[k]=score[1]\n      if score[1]>best_acc : \n            print('Improved in epoch:', k, ' New accuracy: ', 100*score[1],'%')\n            best_acc=score[1]\n            best_ep=k\n            bp=model.get_weights()\nt2=ti.time()\nprint('Best accuracy:', best_acc*100, '% reached in epoch: ',best_ep, ' running  ',epoci,' epochs lasts ',t2-t1,' seconds')\nplt.plot(err_test)\nmodel.set_weights((bp)) # evaluete prediction time on all test samples\nt1=ti.time()\n\nscore = model.evaluate(test_generator, verbose=0)\n\nt2=ti.time()\nprint ('Total number of parameters: ',model.count_params())\nprint('Test accuracy:', score[1])\nprint ('Time to predict on the test set : ',t2-t1)\nprint('Latency (per input sample):', 1000*(t2-t1)/test_generator.samples, 'ms')\n","metadata":{"id":"44rzAe7w9Iof","outputId":"569c1130-9b91-476f-c698-a68a9b985992","execution":{"iopub.status.busy":"2024-06-05T19:54:44.127314Z","iopub.execute_input":"2024-06-05T19:54:44.128067Z","iopub.status.idle":"2024-06-05T22:08:33.375204Z","shell.execute_reply.started":"2024-06-05T19:54:44.128031Z","shell.execute_reply":"2024-06-05T22:08:33.374361Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"acc=str(int(np.floor(best_acc*100)))\nnume_dorit='cassava_acc=' + acc  # desired name for your model \nmodel.save(nume_dorit+'.h5')  \n\nfrom keras.utils.vis_utils import plot_model\nplot_model(model, to_file=nume_dorit+'.png', show_shapes=True, show_layer_names=True, dpi=96)","metadata":{"id":"sZYqbCYY8ijA","executionInfo":{"status":"ok","timestamp":1654187084717,"user_tz":-180,"elapsed":1367,"user":{"displayName":"Florin Buzea","userId":"17727048524904359209"}},"outputId":"6cfac860-ad22-42c9-c41c-ec780bb5187e","execution":{"iopub.status.busy":"2024-06-05T22:08:50.141739Z","iopub.execute_input":"2024-06-05T22:08:50.142541Z","iopub.status.idle":"2024-06-05T22:08:51.504108Z","shell.execute_reply.started":"2024-06-05T22:08:50.142503Z","shell.execute_reply":"2024-06-05T22:08:51.502985Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.models import load_model\nmodel=load_model('cassava_acc=' + acc + '.h5')\nmodel.summary()","metadata":{"id":"ost9z8GB1AC8","execution":{"iopub.status.busy":"2024-06-05T22:09:04.885997Z","iopub.execute_input":"2024-06-05T22:09:04.886416Z","iopub.status.idle":"2024-06-05T22:09:05.300050Z","shell.execute_reply.started":"2024-06-05T22:09:04.886378Z","shell.execute_reply":"2024-06-05T22:09:05.299029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# EVALUATE MODEL (BE CAREFUL TO LOAD THE SPECIFIC DATASET )\n#t1=ti.time()\n#score = model.evaluate(x_test, y_test, verbose=0)\n#t2=ti.time()\n#print('Test accuracy:', score[1])\n#print ('Time for test set : ',t2-t1)\n#cfg=model.get_config()\n#cfg","metadata":{"id":"PIJe7bPo1Azb","execution":{"iopub.status.busy":"2024-05-27T09:36:50.674145Z","iopub.status.idle":"2024-05-27T09:36:50.674493Z","shell.execute_reply.started":"2024-05-27T09:36:50.674323Z","shell.execute_reply":"2024-05-27T09:36:50.674346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# from tensorflow.keras.callbacks import ModelCheckpoint\n# from tensorflow.keras.models import load_model\n# import time as ti \n\n\n# #-----------------  for reproductibility  ----------------------\n# import tensorflow as tf \n# from numpy.random import seed\n# seed(1)\n# tf.random.set_seed(2)\n# augment=0\n# batch_size = 10  # Ranging between 10 (small datasets) to 100 (larger datasets)\n# epoci = 5 # maximal number of training epochs (the best result may be obtained earlier)\n\n# #---------------------------------------------\n\n# checkpoint = ModelCheckpoint('best_model_DenseNet12.h5', monitor= 'val_accuracy', mode= 'max', save_best_only = True, verbose=1)\n# t1=ti.time()\n# if augment==0:\n#   history = model.fit(train_generator,epochs=epoci, validation_data=(test_generator), batch_size=batch_size, verbose=1,\n#                     callbacks = checkpoint)\n# elif augment>0:\n#   history = model.fit(data_generator.flow(train_generator,\n#               batch_size=batch_size), epochs=epoci, validation_data=(test_generator), verbose=2,\n#                     callbacks = checkpoint)\n# t2=ti.time()\n# print('====================================================')\n# print('Training in ',epoci,' epochs, lasted ',t2-t1,' seconds')\n# t1=ti.time()\n# model=load_model('best_model_DenseNet121.h5')\n# bp=model.get_weights()  # Parameter weights giving the best val. accuracy  \n# score = model.evaluate(test_generator, verbose=1)\n# t2=ti.time()\n# print ('Total number of parameters: ',model.count_params())\n# print('Validation set accuracy :', 100*score[1],'%')\n# #print ('Timp predictie pe tot setul de test: ',t2-t1)\n# print('Latency (using GPU):', 1000*(t2-t1)/test_generator.samples, 'ms')","metadata":{"execution":{"iopub.status.busy":"2024-05-27T09:36:50.675457Z","iopub.status.idle":"2024-05-27T09:36:50.675824Z","shell.execute_reply.started":"2024-05-27T09:36:50.675624Z","shell.execute_reply":"2024-05-27T09:36:50.675640Z"},"trusted":true},"execution_count":null,"outputs":[]}]}