Untitled

mail@pastecode.io avatar
unknown
python
2 years ago
2.6 kB
5
Indexable
import os
import numpy as np
from PIL import Image
import pandas as pd
import tensorflow as tf
from tensorflow.keras.applications.vgg16 import VGG16, preprocess_input
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.optimizers import Adam, RMSprop
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.layers import ELU
from tensorflow.keras.regularizers import l1, l2
import matplotlib.pyplot as plt

# 從檔案中載入 X_train 和 Y_train
X_train = np.load('/content/drive/MyDrive/training/X_train.npy')
Y_train = np.load('/content/drive/MyDrive/training/Y_train.npy')

# 對Y_train進行One-Hot編碼
Y_train_encoded = tf.keras.utils.to_categorical(Y_train, num_classes=4)

# 載入VGG16模型
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# 創建模型
model = Sequential()
model.add(base_model)
model.add(Flatten())
model.add(Dense(128))
model.add(ELU(alpha=1))
model.add(Dense(64, activation='relu', kernel_regularizer=l1(0.1)))
model.add(Dense(32, activation='relu', kernel_regularizer=l2(0.1)))
model.add(Dropout(0.7))
model.add(Dense(4, activation='softmax'))

# 凍結VGG16的權重
base_model.trainable = False

# 編譯模型
optimizer = RMSprop(learning_rate=0.00015, rho=0.95, momentum=0.1, epsilon=1e-07)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

# 將 X_train 轉換為二維陣列
X_train_2d = X_train.reshape(X_train.shape[0], -1)

# 創建歸一化器
scaler = MinMaxScaler()

# 對 X_train_2d 進行歸一化
X_train_normalized = scaler.fit_transform(X_train_2d)

# 將歸一化後的資料重新轉換為原本的形狀
X_train_normalized = X_train_normalized.reshape(X_train.shape)

# 訓練模型並獲取 history 物件
history = model.fit(X_train_normalized, Y_train_encoded, batch_size=64, epochs=100, validation_split=0.2)

# 記錄訓練和驗證的損失和準確度
train_loss = history.history['loss']
val_loss = history.history['val_loss']
train_acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

# 繪製學習曲線
plt.plot(train_loss, label='train_loss')
plt.plot(val_loss, label='val_loss')
plt.title('training')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend()
plt.show()

# 繪製驗證曲線
plt.plot(train_acc, label='train_acc')
plt.plot(val_acc, label='val_acc')
plt.title('validation')
plt.xlabel('epoch')
plt.ylabel('acc')
plt.legend()
plt.show()