Prakt 3 Transfer Learning dari VGG Import library yang diperlukan In [1]: import numpy as np import tensorflow from tensorflow.keras.layers import Dense from tensorflow.keras.models import Sequential from tensorflow import random Menginisiasi Model In [2]: vgg_model = tensorflow.keras.applications.vgg16.VGG16() Memeriksa model summary In [3]: vgg_model.summary() Model: "vgg16" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 224, 224, 3)] 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc1 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc2 (Dense) (None, 4096) 16781312 _________________________________________________________________ predictions (Dense) (None, 1000) 4097000 ================================================================= Total params: 138,357,544 Trainable params: 138,357,544 Non-trainable params: 0 _________________________________________________________________ Menghapus lapisan terakhir Kode berikut untuk mengapus 1 lapisan terakhir. Pertanyaan: Apa yang diubah jika hendak mengubah 2 atau 3 lapisan terakhir? JAWABAN: variable number_last_removed_layer In [4]: ind_last_layer = len(vgg_model.layers)-1 number_last_removed_layer = 1 np.random.seed(42) random.set_seed(42) classifier= Sequential() for count,layer in enumerate(vgg_model.layers): if count<=ind_last_layer-number_last_removed_layer: classifier.add(layer) Periksa kembali ringkasan & lapisan terakhir In [5]: classifier.summary() Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc1 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc2 (Dense) (None, 4096) 16781312 ================================================================= Total params: 134,260,544 Trainable params: 134,260,544 Non-trainable params: 0 _________________________________________________________________ Membekukan layer sehingga bobotnya tidak bisa diupdate In [6]: for layer in classifier.layers: layer.trainable=False Tambahkan lapisan baru & Periksa ringkasan & lapisan terakhir In [7]: classifier.add(Dense(1, activation='sigmoid')) classifier.summary() Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= block1_conv1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 block3_conv3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc1 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc2 (Dense) (None, 4096) 16781312 _________________________________________________________________ dense (Dense) (None, 1) 4097 ================================================================= Total params: 134,264,641 Trainable params: 4,097 Non-trainable params: 134,260,544 _________________________________________________________________ Kompilasi jaringan In [8]: classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) Proses gambar dan sesuaikan Buat generator data pelatihan dan pengujian In [9]: from keras.preprocessing.image import ImageDataGenerator generate_train_data = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True) generate_test_data = ImageDataGenerator(rescale =1./255) In [10]: from google.colab import drive drive.mount('/content/drive') Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True). In [11]: folder = '/content/drive/MyDrive/KMMI/Tugas 11' Buat set data pelatihan dan pengujian In [12]: training_dataset = generate_train_data.flow_from_directory(folder+'/Dataset/training_set', target_size = (224, 224), batch_size = 32, class_mode = 'binary') test_datasetset = generate_test_data.flow_from_directory(folder+'/Dataset/test_set', target_size = (224, 224), batch_size = 32, class_mode = 'binary') Found 10764 images belonging to 2 classes. Found 2674 images belonging to 2 classes. Sesuaikan model dengan data pelatihan In [ ]: classifier.fit(training_dataset, steps_per_epoch = 100, epochs = 10, validation_data = test_datasetset, validation_steps = 30, shuffle=False) Epoch 1/10 12/100 [==>...........................] - ETA: 24:57 - loss: 0.5770 - accuracy: 0.7240 Memprediksi gambar baru Muat gambar dan tampilkan gambar In [ ]: In [ ]: import numpy as np from keras.preprocessing import image new_image = image.load_img('../Data/Prediction/test_image_2.jpg', target_size = (224, 224)) new_image Tampilkan label kelas In [ ]: training_dataset.class_indices Buat prediksinya In [ ]: new_image = image.img_to_array(new_image) new_image = np.expand_dims(new_image, axis = 0) result = classifier.predict(new_image) if result[0][0] == 1: prediction = 'It is a flower' else: prediction = 'It is a car' print(prediction) Menyimpan Model hasil Transfer Learning In [ ]: classifier.save('car-flower-classifier.h5') TUGAS TAMBAHAN JADIKAN TUGAS INI SEBAGAI TUGAS TAMBAHAN DAN DIKUMPULKAN DI MENU TUGAS TAMBAHAN Jadikanlah yang dihapus dua layer terakhir. Ganti lagi dengan dua layer anda. Kemudian lakukan hal yang sama dengan di atas. Bandingkan hasilnya dengan yang diganti hanya satu layer. In [ ]: