fork download
  1. import tensorflow as tf
  2. from tensorflow import keras
  3. from tensorflow.keras import layers
  4. from tensorflow.keras.preprocessing.image import ImageDataGenerator
  5. import matplotlib.pyplot as plt
  6.  
  7. # ตั้งค่าไดเรกทอรีของข้อมูล
  8. train_dir = "train"
  9. validation_dir = "val"
  10. test_dir = "test"
  11.  
  12. # เพิ่ม Data Augmentation
  13. train_datagen = ImageDataGenerator(
  14. rescale=1./255,
  15. rotation_range=30,
  16. width_shift_range=0.2,
  17. height_shift_range=0.2,
  18. shear_range=0.2,
  19. zoom_range=0.2,
  20. horizontal_flip=True,
  21. vertical_flip=True, # เพิ่มการพลิกในแนวตั้ง
  22. brightness_range=[0.8, 1.2], # ปรับความสว่าง
  23. fill_mode='nearest'
  24. )
  25.  
  26. validation_datagen = ImageDataGenerator(rescale=1./255)
  27.  
  28. # โหลดข้อมูล
  29. train_generator = train_datagen.flow_from_directory(
  30. train_dir,
  31. target_size=(150, 150),
  32. batch_size=32,
  33. class_mode='binary'
  34. )
  35.  
  36. validation_generator = validation_datagen.flow_from_directory(
  37. validation_dir,
  38. target_size=(150, 150),
  39. batch_size=32,
  40. class_mode='binary'
  41. )
  42.  
  43. # ปรับปรุงโครงสร้างโมเดล
  44. model = keras.Sequential([
  45. layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
  46. layers.BatchNormalization(), # เพิ่ม Batch Normalization
  47. layers.MaxPooling2D(2, 2),
  48. layers.Dropout(0.25), # เพิ่ม Dropout
  49.  
  50. layers.Conv2D(64, (3, 3), activation='relu'),
  51. layers.BatchNormalization(),
  52. layers.MaxPooling2D(2, 2),
  53. layers.Dropout(0.25),
  54.  
  55. layers.Conv2D(128, (3, 3), activation='relu'),
  56. layers.BatchNormalization(),
  57. layers.MaxPooling2D(2, 2),
  58. layers.Dropout(0.25),
  59.  
  60. layers.Flatten(),
  61. layers.Dense(128, activation='relu'),
  62. layers.BatchNormalization(),
  63. layers.Dropout(0.5), # เพิ่ม Dropout ใน Fully Connected Layer
  64. layers.Dense(1, activation='sigmoid')
  65. ])
  66.  
  67. # กำหนดออปติไมเซอร์และค่าพารามิเตอร์
  68. model.compile(
  69. optimizer=keras.optimizers.Adam(learning_rate=0.001),
  70. loss='binary_crossentropy',
  71. metrics=['accuracy']
  72. )
  73.  
  74. # ใช้ ReduceLROnPlateau เพื่อลด Learning Rate เมื่อโมเดลเริ่มหยุดพัฒนา
  75. reduce_lr = keras.callbacks.ReduceLROnPlateau(
  76. monitor='val_loss',
  77. factor=0.5,
  78. patience=3,
  79. min_lr=1e-6
  80. )
  81.  
  82. # ฝึกโมเดล
  83. history = model.fit(
  84. train_generator,
  85. validation_data=validation_generator,
  86. epochs=30,
  87. callbacks=[reduce_lr]
  88. )
  89.  
  90. # แสดงกราฟผลลัพธ์
  91. plt.figure(figsize=(12, 4))
  92. plt.subplot(1, 2, 1)
  93. plt.plot(history.history['accuracy'], label='Train Accuracy')
  94. plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
  95. plt.legend()
  96. plt.title('Accuracy')
  97.  
  98. plt.subplot(1, 2, 2)
  99. plt.plot(history.history['loss'], label='Train Loss')
  100. plt.plot(history.history['val_loss'], label='Validation Loss')
  101. plt.legend()
  102. plt.title('Loss')
  103.  
  104. plt.show()
Success #stdin #stdout 0.02s 25904KB
stdin
Standard input is empty
stdout
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt

# ตั้งค่าไดเรกทอรีของข้อมูล
train_dir = "train"
validation_dir = "val"
test_dir = "test"

# เพิ่ม Data Augmentation
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=30,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    vertical_flip=True,  # เพิ่มการพลิกในแนวตั้ง
    brightness_range=[0.8, 1.2],  # ปรับความสว่าง
    fill_mode='nearest'
)

validation_datagen = ImageDataGenerator(rescale=1./255)

# โหลดข้อมูล
train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(150, 150),
    batch_size=32,
    class_mode='binary'
)

validation_generator = validation_datagen.flow_from_directory(
    validation_dir,
    target_size=(150, 150),
    batch_size=32,
    class_mode='binary'
)

# ปรับปรุงโครงสร้างโมเดล
model = keras.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
    layers.BatchNormalization(),  # เพิ่ม Batch Normalization
    layers.MaxPooling2D(2, 2),
    layers.Dropout(0.25),  # เพิ่ม Dropout

    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.BatchNormalization(),
    layers.MaxPooling2D(2, 2),
    layers.Dropout(0.25),

    layers.Conv2D(128, (3, 3), activation='relu'),
    layers.BatchNormalization(),
    layers.MaxPooling2D(2, 2),
    layers.Dropout(0.25),

    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.BatchNormalization(),
    layers.Dropout(0.5),  # เพิ่ม Dropout ใน Fully Connected Layer
    layers.Dense(1, activation='sigmoid')
])

# กำหนดออปติไมเซอร์และค่าพารามิเตอร์
model.compile(
    optimizer=keras.optimizers.Adam(learning_rate=0.001),
    loss='binary_crossentropy',
    metrics=['accuracy']
)

# ใช้ ReduceLROnPlateau เพื่อลด Learning Rate เมื่อโมเดลเริ่มหยุดพัฒนา
reduce_lr = keras.callbacks.ReduceLROnPlateau(
    monitor='val_loss',
    factor=0.5,
    patience=3,
    min_lr=1e-6
)

# ฝึกโมเดล
history = model.fit(
    train_generator,
    validation_data=validation_generator,
    epochs=30,
    callbacks=[reduce_lr]
)

# แสดงกราฟผลลัพธ์
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.legend()
plt.title('Accuracy')

plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.title('Loss')

plt.show()