Derste kullanılan slayt için tıklayınız.
from tensorflow.keras import applications as apps
dir(apps)
['ConvNeXtBase',
'ConvNeXtLarge',
'ConvNeXtSmall',
'ConvNeXtTiny',
'ConvNeXtXLarge',
'DenseNet121',
'DenseNet169',
'DenseNet201',
'EfficientNetB0',
'EfficientNetB1',
'EfficientNetB2',
'EfficientNetB3',
'EfficientNetB4',
'EfficientNetB5',
'EfficientNetB6',
'EfficientNetB7',
'EfficientNetV2B0',
'EfficientNetV2B1',
'EfficientNetV2B2',
'EfficientNetV2B3',
'EfficientNetV2L',
'EfficientNetV2M',
'EfficientNetV2S',
'InceptionResNetV2',
'InceptionV3',
'MobileNet',
'MobileNetV2',
'MobileNetV3Large',
'MobileNetV3Small',
'NASNetLarge',
'NASNetMobile',
'ResNet101',
'ResNet101V2',
'ResNet152',
'ResNet152V2',
'ResNet50',
'ResNet50V2',
'VGG16',
'VGG19',
'Xception',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__path__',
'__spec__',
'convnext',
'densenet',
'efficientnet',
'efficientnet_v2',
'imagenet_utils',
'inception_resnet_v2',
'inception_v3',
'mobilenet',
'mobilenet_v2',
'mobilenet_v3',
'nasnet',
'resnet',
'resnet50',
'resnet_v2',
'vgg16',
'vgg19',
'xception']
Tüm VGG16 modelini kullanmak
import tensorflow as tf
from tensorflow.keras.applications import VGG16
from tensorflow.keras import layers, models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# 1. MNIST verisini yükle
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 2. Veriyi ön işleme
# - 3 kanal haline getir
# - 224x224 boyutuna çıkar
x_train = tf.image.grayscale_to_rgb(tf.expand_dims(x_train, -1)) # (batch, 28, 28, 1) -> (batch, 28, 28, 3)
x_test = tf.image.grayscale_to_rgb(tf.expand_dims(x_test, -1))
x_train = tf.image.resize(x_train, [224, 224])
x_test = tf.image.resize(x_test, [224, 224])
# - Normalizasyon (0-255 -> 0-1)
x_train = x_train / 255.0
x_test = x_test / 255.0
# - Etiketleri one-hot encode yap
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
- Yukarıdaki yöntemde bellek yetersiz geldi. Alternatif olarak aşağıdaki gibi sadece modele girecek veriler uygun hale getirilebilir.
# 1. MNIST verisini yükle
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 2. Veriyi ön işleme fonksiyonu
def preprocess(image, label):
# Gri resmi RGB'ye çevir
image = tf.expand_dims(image, -1) # (28,28) -> (28,28,1)
image = tf.image.grayscale_to_rgb(image) # (28,28,1) -> (28,28,3)
image = tf.image.resize(image, [224, 224]) # (224,224,3)
image = image / 255.0 # Normalize
label = tf.one_hot(label, 10)
return image, label
# 3. Dataset oluştur
batch_size = 32
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_ds = train_ds.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)
train_ds = train_ds.shuffle(buffer_size=1000).batch(batch_size).prefetch(tf.data.AUTOTUNE)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_ds = test_ds.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)
test_ds = test_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE)
- Eğitilmiş VGG16 modeli (son katman hariç)
# 4. VGG16 modelini yükle (önceden eğitilmiş, ImageNet ağırlıkları ile)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# - Tüm katmanları dondur (feature extractor gibi kullanacağız)
base_model.trainable = False
base_model.summary()
Model: "vgg16"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ input_layer_2 (InputLayer) │ (None, 224, 224, 3) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_conv1 (Conv2D) │ (None, 224, 224, 64) │ 1,792 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_conv2 (Conv2D) │ (None, 224, 224, 64) │ 36,928 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_pool (MaxPooling2D) │ (None, 112, 112, 64) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_conv1 (Conv2D) │ (None, 112, 112, 128) │ 73,856 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_conv2 (Conv2D) │ (None, 112, 112, 128) │ 147,584 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_pool (MaxPooling2D) │ (None, 56, 56, 128) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv1 (Conv2D) │ (None, 56, 56, 256) │ 295,168 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv2 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv3 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_pool (MaxPooling2D) │ (None, 28, 28, 256) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block4_conv1 (Conv2D) │ (None, 28, 28, 512) │ 1,180,160 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block4_conv2 (Conv2D) │ (None, 28, 28, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block4_conv3 (Conv2D) │ (None, 28, 28, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block4_pool (MaxPooling2D) │ (None, 14, 14, 512) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block5_conv1 (Conv2D) │ (None, 14, 14, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block5_conv2 (Conv2D) │ (None, 14, 14, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block5_conv3 (Conv2D) │ (None, 14, 14, 512) │ 2,359,808 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block5_pool (MaxPooling2D) │ (None, 7, 7, 512) │ 0 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 14,714,688 (56.13 MB)
Trainable params: 0 (0.00 B)
Non-trainable params: 14,714,688 (56.13 MB)
# 5. Üstüne kendi sınıflandırıcı katmanlarımızı ekleyelim
model = models.Sequential([
base_model,
layers.Flatten(),
layers.Dense(256, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax') # 10 sınıf (0-9 arası rakamlar)
])
model.summary()
Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ vgg16 (Functional) │ (None, 7, 7, 512) │ 14,714,688 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ flatten_1 (Flatten) │ (None, 25088) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_2 (Dense) │ (None, 256) │ 6,422,784 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dropout_1 (Dropout) │ (None, 256) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_3 (Dense) │ (None, 10) │ 2,570 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 21,140,042 (80.64 MB)
Trainable params: 6,425,354 (24.51 MB)
Non-trainable params: 14,714,688 (56.13 MB)
# 6. Modeli derleyelim
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 7. Modeli eğitelim
model.fit(train_ds, epochs=5, validation_data=test_ds)
# 8. Test seti üzerinde değerlendir
test_loss, test_acc = model.evaluate(test_ds)
print(f"Test doğruluğu: {test_acc:.4f}")
Belirlenmiş ara katmana kadar olan kısmı kullanmak
import tensorflow as tf
from tensorflow.keras.applications import VGG16
from tensorflow.keras import layers, models, Model
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# 1. MNIST verisini yükle
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 2. Ön işleme fonksiyonu
def preprocess(image, label):
image = tf.expand_dims(image, -1) # (28,28) -> (28,28,1)
image = tf.image.grayscale_to_rgb(image) # (28,28,1) -> (28,28,3)
image = tf.image.resize(image, [224, 224]) # (224,224,3)
image = image / 255.0 # Normalize
label = tf.one_hot(label, 10)
return image, label
# 3. Dataset oluştur
batch_size = 32
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_ds = train_ds.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)
train_ds = train_ds.shuffle(1000).batch(batch_size).prefetch(tf.data.AUTOTUNE)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_ds = test_ds.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)
test_ds = test_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE)
# 4. VGG16 Modelini Yükle
vgg = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
vgg.trainable = False # İstersen bazı katmanları açarız sonra
# 5. Ara katmanı seçelim
# Örneğin 'block3_pool' çıkışını kullanalım (block3 bitince)
selected_layer_output = vgg.get_layer('block3_pool').output
# 6. Üstüne kendi katmanlarımızı ekleyelim
x = layers.Flatten()(selected_layer_output)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.5)(x)
output = layers.Dense(10, activation='softmax')(x)
# 7. Yeni Modeli Tanımla
model = Model(inputs=vgg.input, outputs=output)
model.summary()
Model: "functional"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ input_layer_1 (InputLayer) │ (None, 224, 224, 3) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_conv1 (Conv2D) │ (None, 224, 224, 64) │ 1,792 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_conv2 (Conv2D) │ (None, 224, 224, 64) │ 36,928 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_pool (MaxPooling2D) │ (None, 112, 112, 64) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_conv1 (Conv2D) │ (None, 112, 112, 128) │ 73,856 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_conv2 (Conv2D) │ (None, 112, 112, 128) │ 147,584 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_pool (MaxPooling2D) │ (None, 56, 56, 128) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv1 (Conv2D) │ (None, 56, 56, 256) │ 295,168 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv2 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv3 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_pool (MaxPooling2D) │ (None, 28, 28, 256) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ flatten_1 (Flatten) │ (None, 200704) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_2 (Dense) │ (None, 256) │ 51,380,480 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dropout_1 (Dropout) │ (None, 256) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_3 (Dense) │ (None, 10) │ 2,570 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 53,118,538 (202.63 MB)
Trainable params: 51,383,050 (196.01 MB)
Non-trainable params: 1,735,488 (6.62 MB)
# 8. Derle
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
# 9. Eğit
model.fit(train_ds, epochs=5, validation_data=test_ds)
# 10. Değerlendir
test_loss, test_acc = model.evaluate(test_ds)
print(f"Test doğruluğu: {test_acc:.4f}")
Belirlenmiş bir katmanı eğitilebilir yaparak kullanmak
import tensorflow as tf
from tensorflow.keras.applications import VGG16
from tensorflow.keras import layers, models, Model
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# 1. MNIST verisini yükle
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 2. Ön işleme fonksiyonu
def preprocess(image, label):
image = tf.expand_dims(image, -1) # (28,28) -> (28,28,1)
image = tf.image.grayscale_to_rgb(image) # (28,28,1) -> (28,28,3)
image = tf.image.resize(image, [224, 224]) # (224,224,3)
image = image / 255.0 # Normalize
label = tf.one_hot(label, 10)
return image, label
# 3. Dataset oluştur
batch_size = 32
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_ds = train_ds.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)
train_ds = train_ds.shuffle(1000).batch(batch_size).prefetch(tf.data.AUTOTUNE)
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_ds = test_ds.map(preprocess, num_parallel_calls=tf.data.AUTOTUNE)
test_ds = test_ds.batch(batch_size).prefetch(tf.data.AUTOTUNE)
# 4. VGG16 Modelini Yükle
vgg = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# 5. Tüm VGG katmanlarını dondur
vgg.trainable = False
# 6. Sadece 'block3' kısmını aç
for layer in vgg.layers:
if 'block3' in layer.name:
layer.trainable = True
# 7. Ara katmanı seç ve üzerine yeni katmanlar koy
selected_layer_output = vgg.get_layer('block3_pool').output
x = layers.Flatten()(selected_layer_output)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.5)(x)
output = layers.Dense(10, activation='softmax')(x)
model = Model(inputs=vgg.input, outputs=output)
model.summary()
Model: "functional_6"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ input_layer_7 (InputLayer) │ (None, 224, 224, 3) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_conv1 (Conv2D) │ (None, 224, 224, 64) │ 1,792 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_conv2 (Conv2D) │ (None, 224, 224, 64) │ 36,928 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block1_pool (MaxPooling2D) │ (None, 112, 112, 64) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_conv1 (Conv2D) │ (None, 112, 112, 128) │ 73,856 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_conv2 (Conv2D) │ (None, 112, 112, 128) │ 147,584 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block2_pool (MaxPooling2D) │ (None, 56, 56, 128) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv1 (Conv2D) │ (None, 56, 56, 256) │ 295,168 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv2 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_conv3 (Conv2D) │ (None, 56, 56, 256) │ 590,080 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ block3_pool (MaxPooling2D) │ (None, 28, 28, 256) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ flatten_7 (Flatten) │ (None, 200704) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_14 (Dense) │ (None, 256) │ 51,380,480 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dropout_7 (Dropout) │ (None, 256) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_15 (Dense) │ (None, 10) │ 2,570 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 53,118,538 (202.63 MB)
Trainable params: 52,858,378 (201.64 MB)
Non-trainable params: 260,160 (1016.25 KB)
# 8. Derle
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
loss='categorical_crossentropy',
metrics=['accuracy'])
# 9. Eğit
model.fit(train_ds, epochs=5, validation_data=test_ds)
# 10. Değerlendir
test_loss, test_acc = model.evaluate(test_ds)
print(f"Test doğruluğu: {test_acc:.4f}")