以下是針對你提供的 TensorFlow 和 Keras 程式碼的簡要說明: --- # 使用 ResNet50 進行圖像分類 (CPU版本) ## 簡介 這個程式碼使用了 TensorFlow 和 Keras,以 ResNet50 預訓練模型為基礎,建立了一個圖像分類模型。該模型在指定的資料集上進行訓練,並最終儲存為 "resnet50_model.h5"。 ## 程式結構 ### 1. 設定參數 ```python EPOCHS = 400 # 訓練次數 BATCH_SIZE = 20 # 批數量 # 資料路徑 train_data_path = './train' validation_data_path = './test' num_classes = 10 # 分類數量 ``` 這部分設定了訓練的參數,包括訓練次數、批次大小、資料集路徑和分類數量。 ### 2. 定義模型 ```python base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) model = tf.keras.Sequential([ base_model, tf.keras.layers.GlobalAveragePooling2D(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(num_classes, activation='softmax') ]) ``` 這裡使用 ResNet50 作為預訓練模型的基礎,並在其上添加了全局平均池化層和密集連接層,最後是輸出層。 ### 3. 凍結預訓練模型的權重 ```python base_model.trainable = False ``` 這部分凍結了預訓練模型的權重,以防止在訓練過程中更新。 ### 4. 編譯模型 ```python model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) ``` 模型編譯,使用 Adam 優化器和分類交叉熵損失。 ### 5. 定義資料生成器 ```python train_datagen = ImageDataGenerator(rescale=1./255) validation_datagen = ImageDataGenerator(rescale=1./255) ``` 使用 Keras 的 ImageDataGenerator 來進行資料增強。 ### 6. 訓練模型 ```python model.fit(train_generator, steps_per_epoch=len(train_generator), epochs=EPOCHS, validation_data=validation_generator, batch_size=BATCH_SIZE) ``` 這裡使用了 `fit` 方法來訓練模型,並使用資料生成器來產生批次的資料。 ### 7. 儲存模型 ```python model.save('resnet50_model.h5') ``` 最後,模型被儲存為 "resnet50_model.h5"。 ## 結論 這個程式碼實現了一個使用 ResNet50 預訓練模型進行圖像分類的流程。你可以根據自己的需求調整參數、資料路徑和模型結構,以滿足特定的應用場景。 ```python import tensorflow as tf from tensorflow import keras from keras.applications import ResNet50 from keras.preprocessing.image import ImageDataGenerator import scipy from scipy.ndimage import rotate EPOCHS = 400 #訓練次數 BATCH_SIZE = 20 #批數量 # 資料路徑 train_data_path = './train' validation_data_path = './test' num_classes = 10 # 定義模型 base_model = ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) model = tf.keras.Sequential([ base_model, tf.keras.layers.GlobalAveragePooling2D(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(num_classes, activation='softmax') # 請替換成你的分類數量 ]) # 凍結預訓練模型的權重 base_model.trainable = False # 編譯模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 定義資料生成器 train_datagen = ImageDataGenerator(rescale=1./255) validation_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( train_data_path, target_size=(224, 224), batch_size=32, class_mode='categorical' # 請根據你的資料集調整 ) print(train_generator.classes) validation_generator = validation_datagen.flow_from_directory( validation_data_path, target_size=(224, 224), batch_size=32, class_mode='categorical' # 請根據你的資料集調整 ) # 訓練模型 model.fit(train_generator, steps_per_epoch=len(train_generator), epochs=EPOCHS, validation_data=validation_generator, batch_size=BATCH_SIZE) # 儲存模型 model.save('resnet50_model.h5') ```