Uploaded by Kucing 1

Prakt 3 Transfer Learning

advertisement
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 [ ]:
Download