以下是針對你提供的 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')
```