20250213 commit: To added list to Dataset Script

This commit is contained in:
whitekirin 2025-02-13 03:11:54 +08:00
parent bb1ab2b541
commit c9d9e7882e
32 changed files with 277 additions and 163 deletions

Binary file not shown.

View File

@ -1,8 +1,8 @@
from Read_and_process_image.ReadAndProcess import Read_image_and_Process_image from Read_and_process_image.ReadAndProcess import Read_image_and_Process_image
from _validation.ValidationTheEnterData import validation_the_enter_data from _validation.ValidationTheEnterData import validation_the_enter_data
from Load_process.file_processing import Process_File from Load_process.file_processing import Process_File
from keras.preprocessing.image import ImageDataGenerator
from Load_process.LoadData import Load_Data_Prepare from Load_process.LoadData import Load_Data_Prepare
from torchvision import transforms
class Image_generator(): class Image_generator():
'''製作資料強化''' '''製作資料強化'''
@ -155,47 +155,35 @@ class Image_generator():
dtype : 生成數組使用的數據類型 dtype : 生成數組使用的數據類型
''' '''
if judge == 1: if judge == 1:
datagen = ImageDataGenerator( return transforms.Compose([
rotation_range=30, # 旋轉影像 transforms.RandomRotation(30),
width_shift_range=0.1, # 圖像隨機水平移動,位移距離為圖像長度乘以參數(0.1) transforms.RandomResizedCrop(224, scale=(0.8, 1.0)),
height_shift_range=0.1, # 圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.1) transforms.RandomHorizontalFlip(),
zoom_range=0.2, # 隨機縮放範圍,[lower, upper] = [1-zoom_range, 1+zoom_range] transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
horizontal_flip=False, # 水平翻轉 ])
vertical_flip=False, # 垂直翻轉 elif judge == 2:
fill_mode='nearest' # 在旋轉或平移造成空隙時,則空隙補常數 return transforms.Compose([
) transforms.RandomRotation(180),
if judge == 2: transforms.RandomResizedCrop(224, scale=(0.7, 1.0)),
datagen = ImageDataGenerator( transforms.RandomHorizontalFlip(),
rotation_range=180, transforms.RandomVerticalFlip(),
width_shift_range=0.2, ])
height_shift_range=0.1, elif judge == 3:
zoom_range=0.1, return transforms.Compose([
horizontal_flip=True, transforms.RandomRotation(45),
vertical_flip=True, transforms.RandomResizedCrop(224, scale=(0.9, 1.0)),
fill_mode='nearest' transforms.RandomAffine(degrees=20, shear=0.2),
) transforms.ColorJitter(brightness=0.2, contrast=0.2),
if judge == 3: transforms.RandomHorizontalFlip(),
datagen = ImageDataGenerator( ])
rotation_range=45, # 旋轉影像 elif judge == 4:
width_shift_range=0.02, # 圖像隨機水平移動,位移距離為圖像長度乘以參數(0.1) return transforms.Compose([
height_shift_range=0.02, # 圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.1) transforms.RandomRotation(50),
shear_range = 0.02, transforms.RandomResizedCrop(224, scale=(0.75, 1.0)),
zoom_range=0.02, # 隨機縮放範圍,[lower, upper] = [1-zoom_range, 1+zoom_range] transforms.RandomAffine(degrees=30, shear=0.25),
horizontal_flip = True, transforms.ColorJitter(brightness=0.3, contrast=0.3, saturation=0.3, hue=0.2),
fill_mode = "reflect" transforms.RandomHorizontalFlip(),
) transforms.RandomVerticalFlip(),
])
if judge == 4: # 第二份paper的資料強化 else:
datagen = ImageDataGenerator( return transforms.ToTensor() # 將數值歸一化到[0, 1]之間
rotation_range=50, # 旋轉影像
width_shift_range=0.2, # 圖像隨機水平移動,位移距離為圖像長度乘以參數(0.1)
height_shift_range=0.2, # 圖像隨機垂直移動,位移距離為圖像長度乘以參數(0.1)
shear_range = 0.25,
zoom_range=0.1, # 隨機縮放範圍,[lower, upper] = [1-zoom_range, 1+zoom_range]
channel_shift_range = 20 # 隨機通道轉換的範圍
)
if judge == 5: # 第一份paper的資料強化
datagen = ImageDataGenerator(rescale = 1 / 255)
return datagen

View File

@ -47,3 +47,7 @@ class Process_File():
modelfiles = self.Make_Save_Root(File_Name + ".txt", model_dir) # 將檔案名稱及路徑字串合併成完整路徑 modelfiles = self.Make_Save_Root(File_Name + ".txt", model_dir) # 將檔案名稱及路徑字串合併成完整路徑
with open(modelfiles, mode = 'a') as file: with open(modelfiles, mode = 'a') as file:
file.write(content) file.write(content)
def Save_PIL_File(self, FileName, save_root, image): # 存CSV檔
save_root = self.Make_Save_Root(FileName, save_root)
image.save(save_root)

View File

@ -1,5 +1,6 @@
from torch import nn from torch import nn
from torch.nn import functional from torch.nn import functional
import torch
class Entropy_Loss(nn.Module): class Entropy_Loss(nn.Module):
@ -9,7 +10,10 @@ class Entropy_Loss(nn.Module):
def forward(self, outputs, labels): def forward(self, outputs, labels):
# 範例: 使用均方誤差作為損失計算 # 範例: 使用均方誤差作為損失計算
# outputs = torch.argmax(outputs, 1) # outputs = torch.argmax(outputs, 1)
# outputs = outputs.float() outputs = outputs.float()
# input shape has a question
# print(f"Label result: {labels}, result: {outputs}")
labels = labels.float() labels = labels.float()
loss = functional.binary_cross_entropy(outputs, labels) loss = functional.binary_cross_entropy(outputs[0], labels)
return loss return loss

Binary file not shown.

View File

@ -1,5 +1,6 @@
import cv2 import cv2
import numpy as np import numpy as np
import torch
class Read_image_and_Process_image: class Read_image_and_Process_image:
def __init__(self) -> None: def __init__(self) -> None:

View File

@ -1,6 +1,20 @@
import pandas as pd import pandas as pd
from sklearn.preprocessing import OneHotEncoder
from torch.nn import functional from torch.nn import functional
import torch
from torch.utils.data import Dataset, DataLoader
class ListDataset(Dataset):
def __init__(self, data_list, labels_list):
self.data = data_list
self.labels = labels_list
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
sample = self.data[idx]
label = self.labels[idx]
return sample, label
class Tool: class Tool:
def __init__(self) -> None: def __init__(self) -> None:
@ -48,17 +62,23 @@ class Tool:
self.__Normal_ImageGenerator_Data_Root = "../Dataset/Training/Normal_ImageGenerator" self.__Normal_ImageGenerator_Data_Root = "../Dataset/Training/Normal_ImageGenerator"
self.__Comprehensive_Generator_Root = "../Dataset/Training/Comprehensive_ImageGenerator" self.__Comprehensive_Generator_Root = "../Dataset/Training/Comprehensive_ImageGenerator"
def Set_OneHotEncording(self, content, Number_Of_Classes): def Set_OneHotEncording(self, content):
OneHot_labels = functional.one_hot(content, Number_Of_Classes) Counter = []
return OneHot_labels for i in range(len(content)):
Counter.append(i)
Counter = torch.tensor(Counter)
self.__OneHot_Encording = functional.one_hot(Counter, len(content))
pass
def Set_Data_To_DataSet(self, Datas : list, Labels : list, Batch_Size : int):
# 創建 Dataset
dataset = ListDataset(Datas, Labels)
return DataLoader(dataset = dataset, batch_size = Batch_Size, shuffle=True, num_workers = 0, pin_memory=True)
def Set_Zips(self, Datas, Labels, Address_Name):
if Address_Name == "Training":
self.Training_Zip = zip(Datas, Labels)
if Address_Name == "Validation":
self.Validation_Zip = zip(Datas, Labels)
if Address_Name == "Testing":
self.Testing_Zip = zip(Datas, Labels)
def Get_Data_Label(self): def Get_Data_Label(self):
''' '''

Binary file not shown.

Binary file not shown.

View File

@ -50,7 +50,7 @@ def call_back(model_name, index, optimizer):
model_dir = '../Result/save_the_best_model/' + model_name model_dir = '../Result/save_the_best_model/' + model_name
File.JudgeRoot_MakeDir(model_dir) File.JudgeRoot_MakeDir(model_dir)
modelfiles = File.Make_Save_Root('best_model( ' + str(datetime.date.today()) + " )-" + str(index) + ".weights.h5", model_dir) modelfiles = File.Make_Save_Root('best_model( ' + str(datetime.date.today()) + " )-" + str(index) + ".weights.pt", model_dir)
# model_mckp = ModelCheckpoint(modelfiles, monitor='val_loss', save_best_only=True, save_weights_only = True, mode='auto') # model_mckp = ModelCheckpoint(modelfiles, monitor='val_loss', save_best_only=True, save_weights_only = True, mode='auto')

View File

@ -4,7 +4,7 @@ import torch
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from torchmetrics.functional import auroc from torchmetrics.functional import auroc
import torch.optim as optim import torch.optim as optim
import numpy as np
from all_models_tools.all_model_tools import call_back from all_models_tools.all_model_tools import call_back
from Model_Loss.Loss import Entropy_Loss from Model_Loss.Loss import Entropy_Loss
@ -21,6 +21,10 @@ class All_Step:
self.Epoch = Epoch self.Epoch = Epoch
self.Number_Of_Classes = Number_Of_Classes self.Number_Of_Classes = Number_Of_Classes
self.Training_Data_Length = len(list(zip(*Training_Data_And_Label))[1])
self.Testing_Data_Length = len(list(zip(*Test_Data_And_Label))[1])
self.Validation_Data_Length = len(list(zip(*Validation_Data_And_Label))[1])
pass pass
def Training_Step(self, model_name, counter): def Training_Step(self, model_name, counter):
@ -34,42 +38,45 @@ class All_Step:
train_accuracies = [] train_accuracies = []
val_accuracies = [] val_accuracies = []
for epoch in range(self.Epoch): for epoch in range(self.Epoch): # 訓練迴圈
self.Model.train() self.Model.train() # 開始訓練
running_loss = 0.0 running_loss = 0.0
all_train_preds = [] all_train_preds = []
all_train_labels = [] all_train_labels = []
epoch_iterator = tqdm(self.Training_Data_And_Label, desc= "Training (Epoch %d)" % epoch) epoch_iterator = tqdm(self.Training_Data_And_Label, desc= "Training (Epoch %d)" % epoch) # 使用進度條
for inputs, labels in epoch_iterator: for inputs, labels in epoch_iterator:
# labels = np.reshape(labels, (int(labels.shape[0]), 1)) # print(inputs.shape)
inputs, OneHot_labels = inputs.to(self.device), OneHot_labels.to(self.device) # 輸入的維度為3維 但模型要的是4維 所以要再多加一維
# inputs, labels = inputs.cuda(), labels.cuda() inputs = np.expand_dims(inputs, axis = 0)
# print(inputs.shape)
inputs, labels = torch.tensor(inputs).to(self.device), torch.tensor(labels).to(self.device)
Optimizer.zero_grad() Optimizer.zero_grad()
outputs = self.Model(inputs) outputs = self.Model(inputs)
loss = criterion(outputs, OneHot_labels) loss = criterion(outputs, labels)
loss.backward() loss.backward()
Optimizer.step() Optimizer.step()
running_loss += loss.item() running_loss += loss.item()
# 收集訓練預測和標籤 # 收集訓練預測和標籤
_, preds = torch.max(outputs, 1) _, preds = torch.max(outputs, 1)
all_train_preds.extend(preds.cpu().numpy()) labels = np.argmax(labels.cpu().numpy())
all_train_labels.extend(labels.cpu().numpy()) # all_train_preds.extend(preds.cpu().numpy())
# all_train_labels.extend(labels.cpu().numpy())
Training_Loss = running_loss/len(self.Training_Data_And_Label) all_train_preds.append(preds.cpu().numpy())
all_train_labels.append(labels)
# all_train_labels = torch.FloatTensor(all_train_labels) Training_Loss = running_loss / self.Training_Data_Length
# all_train_labels = torch.argmax(all_train_labels, 1)
train_accuracy = accuracy_score(all_train_labels, all_train_preds) train_accuracy = accuracy_score(all_train_labels, all_train_preds)
train_losses.append(Training_Loss) train_losses.append(Training_Loss)
train_accuracies.append(train_accuracy) train_accuracies.append(train_accuracy)
print(f"Epoch [{epoch+1}/{self.epoch}], Loss: {Training_Loss:.4f}, Accuracy: {train_accuracy:0.2f}", end = ' ') print(f"Epoch [{epoch+1}/{self.Epoch}], Loss: {Training_Loss:.4f}, Accuracy: {train_accuracy:0.2f}", end = ' ')
self.Model.eval() self.Model.eval()
val_loss = 0.0 val_loss = 0.0
@ -78,24 +85,30 @@ class All_Step:
with torch.no_grad(): with torch.no_grad():
for inputs, labels in self.Validation_Data_And_Label: for inputs, labels in self.Validation_Data_And_Label:
inputs, OneHot_labels = inputs.to(self.device), labels.to(self.device) inputs = np.expand_dims(inputs, axis = 0)
inputs, labels = torch.tensor(inputs).to(self.device), torch.tensor(labels).to(self.device)
outputs = self.Model(inputs) outputs = self.Model(inputs)
loss = criterion(outputs, OneHot_labels) loss = criterion(outputs, labels)
val_loss += loss.item() val_loss += loss.item()
# 驗證預測與標籤 # 驗證預測與標籤
_, preds = torch.max(outputs, 1) _, preds = torch.max(outputs, 1)
all_val_preds.extend(preds.cpu().numpy()) labels = np.argmax(labels.cpu().numpy())
all_val_labels.extend(labels.cpu().numpy())
# all_val_preds.extend(preds.cpu().numpy())
# all_val_labels.extend(labels.cpu().numpy())a
all_val_preds.append(preds.cpu().numpy())
all_val_labels.append(labels)
# 計算驗證損失與準確率 # 計算驗證損失與準確率
val_loss /= len(list(self.Validation_Data_And_Label)) val_loss /= self.Validation_Data_Length
val_accuracy = accuracy_score(all_val_labels, all_val_preds) val_accuracy = accuracy_score(all_val_labels, all_val_preds)
val_losses.append(val_loss) val_losses.append(val_loss)
val_accuracies.append(val_accuracy) val_accuracies.append(val_accuracy)
print(f"Epoch [{epoch+1}/{self.epoch}], Loss: {val_loss:.4f}, Accuracy: {val_accuracy:0.2f}") print(f"Val_loss: {val_loss:.4f}, Val_accuracy: {val_accuracy:0.2f}")
early_stopping(val_loss, self.Model, model_path) early_stopping(val_loss, self.Model, model_path)
if early_stopping.early_stop: if early_stopping.early_stop:
@ -114,18 +127,25 @@ class All_Step:
loss = 0.0 loss = 0.0
with torch.no_grad(): with torch.no_grad():
for images, labels in self.Test_Data_And_Label: for images, labels in self.Test_Data_And_Label:
images, OneHot_labels = images.to(self.device), OneHot_labels.to(self.device) images = np.expand_dims(images, axis = 0)
images, labels = torch.tensor(images).to(self.device), torch.tensor(labels).to(self.device)
outputs = cnn_model(images) outputs = cnn_model(images)
_, predicted = torch.max(outputs, 1)
Predict_Label.extend(predicted.cpu().numpy())
True_Label.extend(labels.cpu().numpy())
loss /= len(self.Test_Data_And_Label) _, predicted = torch.max(outputs, 1)
labels = np.argmax(labels.cpu().numpy())
Predict_Label.append(predicted.cpu().numpy())
True_Label.append(labels)
# Predict_Label.extend(predicted.cpu().numpy())
# True_Label.extend(labels.cpu().numpy())
loss /= self.Testing_Data_Length
accuracy = accuracy_score(True_Label, Predict_Label) accuracy = accuracy_score(True_Label, Predict_Label)
precision = precision_score(True_Label, Predict_Label) precision = precision_score(True_Label, Predict_Label)
recall = recall_score(True_Label, Predict_Label) recall = recall_score(True_Label, Predict_Label)
AUC = auroc(True_Label, Predict_Label, task = ["Stomatch_Cancer", "Normal"]) AUC = auroc(True_Label, Predict_Label, task = "binary")
f1 = f1_score(True_Label, Predict_Label) f1 = f1_score(True_Label, Predict_Label)
return loss, accuracy, precision, recall, AUC, f1, True_Label, Predict_Label return loss, accuracy, precision, recall, AUC, f1, True_Label, Predict_Label

Binary file not shown.

Binary file not shown.

View File

@ -5,11 +5,10 @@ from Load_process.Load_Indepentend import Load_Indepentend_Data
from _validation.ValidationTheEnterData import validation_the_enter_data from _validation.ValidationTheEnterData import validation_the_enter_data
from Load_process.file_processing import Process_File from Load_process.file_processing import Process_File
from merge_class.merge import merge from merge_class.merge import merge
from draw_tools.Grad_cam import Grad_CAM
from sklearn.metrics import confusion_matrix from sklearn.metrics import confusion_matrix
from experiments.pytorch_Model import ModifiedXception from experiments.pytorch_Model import ModifiedXception
from Image_Process.Image_Generator import Image_generator from Image_Process.Image_Generator import Image_generator
from Model_All_Step import All_Step from experiments.Model_All_Step import All_Step
import pandas as pd import pandas as pd
import numpy as np import numpy as np
import torch import torch
@ -51,11 +50,11 @@ class experiments():
self.validation_obj = validation_the_enter_data() # 呼叫驗證物件 self.validation_obj = validation_the_enter_data() # 呼叫驗證物件
self.cut_image = Load_Indepentend_Data(self.Topic_Tool.Get_Data_Label(), self.Topic_Tool.Get_OneHot_Encording_Label()) # 呼叫切割影像物件 self.cut_image = Load_Indepentend_Data(self.Topic_Tool.Get_Data_Label(), self.Topic_Tool.Get_OneHot_Encording_Label()) # 呼叫切割影像物件
self.image_processing = Read_image_and_Process_image() self.image_processing = Read_image_and_Process_image()
self.ImageGenerator = Image_generator("", "")
self.merge = merge() self.merge = merge()
self.model_name = "Xception" # 取名,告訴我我是用哪個模型(可能是預處理模型/自己設計的模型) self.model_name = "Xception" # 取名,告訴我我是用哪個模型(可能是預處理模型/自己設計的模型)
self.experiment_name = "Xception Skin to train Normal stomach cancer" self.experiment_name = "Xception Skin to train Normal stomach cancer"
# self.file_name = "Remove background of Chickenpox with normal image"
self.generator_batch_size = 50 self.generator_batch_size = 50
self.epoch = 10000 self.epoch = 10000
self.train_batch_size = 128 self.train_batch_size = 128
@ -82,9 +81,14 @@ class experiments():
# 將處理好的test Data 與 Validation Data 丟給這個物件的變數 # 將處理好的test Data 與 Validation Data 丟給這個物件的變數
self.test, self.test_label = self.cut_image.test, self.cut_image.test_label self.test, self.test_label = self.cut_image.test, self.cut_image.test_label
self.validation, self.validation_label = self.cut_image.validation, self.cut_image.validation_label self.validation, self.validation_label = self.cut_image.validation, self.cut_image.validation_label
self.Topic_Tool.Set_Zips(train, train_label, "Training")
self.Topic_Tool.Set_Zips(self.test, self.test_label, "Testing") train = self.Preprocess_Image_Data(train)
self.Topic_Tool.Set_Zips(self.validation, self.validation_label, "Validation") self.test = self.Preprocess_Image_Data(self.test)
self.validation = self.Preprocess_Image_Data(self.validation)
self.Topic_Tool.Set_Data_To_DataSet(train, train_label, "Training")
self.Topic_Tool.Set_Data_To_DataSet(self.test, self.test_label, "Testing")
self.Topic_Tool.Set_Data_To_DataSet(self.validation, self.validation_label, "Validation")
self.Training_Zip, self.Testing_Zip, self.Validation_Zip = self.Topic_Tool.Get_Zip() self.Training_Zip, self.Testing_Zip, self.Validation_Zip = self.Topic_Tool.Get_Zip()
@ -114,7 +118,7 @@ class experiments():
def construct_model(self): def construct_model(self):
'''決定我這次訓練要用哪個model''' '''決定我這次訓練要用哪個model'''
cnn_model = ModifiedXception() cnn_model = ModifiedXception(self.Number_Of_Classes)
if torch.cuda.device_count() > 1: if torch.cuda.device_count() > 1:
cnn_model = nn.DataParallel(cnn_model) cnn_model = nn.DataParallel(cnn_model)
@ -122,6 +126,20 @@ class experiments():
cnn_model = cnn_model.to(self.device) cnn_model = cnn_model.to(self.device)
return cnn_model return cnn_model
def Preprocess_Image_Data(self, Image_Datas):
transform = self.ImageGenerator.Generator_Content(5)
Transform_Image = []
for Image in Image_Datas:
Image = transform(Image)
Transform_Image.append(Image)
# Transform_Image.append(self.ImageGenerator._apply_transform(transform, Image))
Transform_Image = torch.tensor(np.array(Transform_Image))
print(Transform_Image.shape)
return Transform_Image
def record_matrix_image(self, True_Labels, Predict_Labels, model_name, index): def record_matrix_image(self, True_Labels, Predict_Labels, model_name, index):
'''劃出混淆矩陣(熱力圖)''' '''劃出混淆矩陣(熱力圖)'''
# 計算混淆矩陣 # 計算混淆矩陣

View File

@ -2,30 +2,49 @@ import torch
import torch.nn as nn import torch.nn as nn
import torch.optim as optim import torch.optim as optim
import torchvision.transforms as transforms import torchvision.transforms as transforms
from torchvision import models
import timm import timm
class ModifiedXception(nn.Module): class ModifiedXception(nn.Module):
def __init__(self): def __init__(self, num_classes):
super(ModifiedXception, self).__init__() super(ModifiedXception, self).__init__()
# 加載 Xception 預訓練模型,去掉最後一層 (fc 層) # 加載 Xception 預訓練模型,去掉最後一層 (fc 層)
self.base_model = timm.create_model('xception', pretrained=True) self.base_model = timm.create_model(
self.base_model.fc = nn.Identity() # 移除原來的 fully connected 層 'xception',
pretrained=True,
features_only=True, # 只保留特徵提取部分
out_indices=[3] # 選擇特徵層索引(根據模型結構)
)
# 新增全局平均池化層、隱藏層和輸出層 # 自定義分類頭
self.global_avg_pool = nn.AdaptiveAvgPool2d(1) # 全局平均池化 self.custom_head = nn.Sequential(
self.hidden_layer = nn.Linear(2048, 1370) # 隱藏層,輸入大小取決於 Xception 的輸出大小 nn.AdaptiveAvgPool2d(1), # Global Average Pooling,
self.output_layer = nn.Linear(1370, 2) # 輸出層,依據分類數目設定 nn.Flatten(),
nn.Linear(728, 368), # Xception 輸出特徵維度為2048
nn.ReLU(), # 可選激活函數
nn.Linear(368, num_classes),
nn.Sigmoid()
)
# 激活函數與 dropout # self.base_model.fc = nn.Identity() # 移除原來的 fully connected 層
self.relu = nn.ReLU()
self.dropout = nn.Dropout(0.6) # # 新增全局平均池化層、隱藏層和輸出層
# self.global_avg_pool = nn.AdaptiveAvgPool2d(1) # 全局平均池化
# self.hidden_layer = nn.Linear(2048, 1370) # 隱藏層,輸入大小取決於 Xception 的輸出大小
# self.output_layer = nn.Linear(1370, 2) # 輸出層,依據分類數目設定
# # 激活函數與 dropout
# self.relu = nn.ReLU()
# self.dropout = nn.Dropout(0.6)
def forward(self, x): def forward(self, x):
x = self.base_model(x) # Xception 主體 x = self.base_model(x) # Xception 主體
x = self.global_avg_pool(x) # 全局平均池化 x = x[0]
x = self.relu(self.hidden_layer(x)) # 隱藏層 + ReLU output = self.custom_head(x)
x = self.dropout(x) # Dropout # x = self.global_avg_pool(x) # 全局平均池化
x = self.output_layer(x) # 輸出層 # x = self.relu(self.hidden_layer(x)) # 隱藏層 + ReLU
return x # x = self.dropout(x) # Dropout
# x = self.output_layer(x) # 輸出層
return output

48
main.py
View File

@ -2,7 +2,7 @@ from experiments.experiment import experiments
from Image_Process.load_and_ImageGenerator import Load_ImageGenerator from Image_Process.load_and_ImageGenerator import Load_ImageGenerator
from Read_and_process_image.ReadAndProcess import Read_image_and_Process_image from Read_and_process_image.ReadAndProcess import Read_image_and_Process_image
from Training_Tools.Tools import Tool from Training_Tools.Tools import Tool
from model_data_processing.processing import shuffle_data from model_data_processing.processing import shuffle_data, Balance_Process
from Load_process.LoadData import Load_Data_Prepare from Load_process.LoadData import Load_Data_Prepare
from Calculate_Process.Calculate import Calculate from Calculate_Process.Calculate import Calculate
from merge_class.merge import merge from merge_class.merge import merge
@ -32,11 +32,11 @@ if __name__ == "__main__":
tool.Set_OneHotEncording(Labels) tool.Set_OneHotEncording(Labels)
Encording_Label = tool.Get_OneHot_Encording_Label() Encording_Label = tool.Get_OneHot_Encording_Label()
Label_Length = len(Labels) Label_Length = len(Labels)
Classification = 2 # 分類數量
Gneerator_size = 0
Prepare = Load_Data_Prepare() Prepare = Load_Data_Prepare()
loading_data = Load_ImageGenerator(Trainig_Root, Testing_Root, Validation_Root, Generator_Root, Labels) loading_data = Load_ImageGenerator(Trainig_Root, Testing_Root, Validation_Root, Generator_Root, Labels)
experiment = experiments(tool, Status) experiment = experiments(tool, Classification, Status)
image_processing = Read_image_and_Process_image() image_processing = Read_image_and_Process_image()
Merge = merge() Merge = merge()
Calculate_Tool = Calculate() Calculate_Tool = Calculate()
@ -46,37 +46,32 @@ if __name__ == "__main__":
for i in range(0, counter, 1): # 做規定次數的訓練 for i in range(0, counter, 1): # 做規定次數的訓練
# 讀取資料 # 讀取資料
Data_Dict_Data = loading_data.process_main(Label_Length) Data_Dict_Data = loading_data.process_main(Label_Length)
Data_Dict_Data, Train_Size = Balance_Process(Data_Dict_Data, Labels)
Data_Dict_Data = shuffle_data(Data_Dict_Data, Labels, 2)
tmp = []
Train_Size = 0
if len(Data_Dict_Data[Labels[0]]) >= len(Data_Dict_Data[Labels[1]]):
Train_Size = len(Data_Dict_Data[Labels[1]])
for j in range(Train_Size):
tmp.append(Data_Dict_Data[Labels[0]][j])
Data_Dict_Data[Labels[0]] = tmp
else:
Train_Size = len(Data_Dict_Data[Labels[0]])
for j in range(Train_Size):
tmp.append(Data_Dict_Data[Labels[1]][j])
Data_Dict_Data[Labels[1]] = tmp
# 輸出內容 # 輸出內容
print("Negative Data有 " + str(len(Data_Dict_Data[Labels[1]])) + " 筆資料") print("每個類別各有 " + str(Train_Size) + " 筆資料")
print("Positive Data有 " + str(len(Data_Dict_Data[Labels[0]])) + " 筆資料") total = 0
print("總共有 " + str(len(Data_Dict_Data[Labels[0]]) + len(Data_Dict_Data[Labels[1]])) + " 筆資料") for j in range(Label_Length):
total += Train_Size
print("總共有 " + str(total) + " 筆資料")
# 做出跟資料相同數量的Label # 做出跟資料相同數量的Label
Negative_Num = image_processing.make_label_list(Train_Size, Encording_Label[1]) Classes = []
Positive_Num = image_processing.make_label_list(Train_Size, Encording_Label[0]) for encording in Encording_Label:
Classes.append(image_processing.make_label_list(Train_Size, encording))
# 將資料做成Dict的資料型態 # 將資料做成Dict的資料型態
Prepare.Set_Final_Dict_Data(Labels, Data_Dict_Data, [Positive_Num, Negative_Num], 2) Prepare.Set_Final_Dict_Data(Labels, Data_Dict_Data, Classes, Label_Length)
Final_Dict_Data = Prepare.Get_Final_Data_Dict() Final_Dict_Data = Prepare.Get_Final_Data_Dict()
keys = list(Final_Dict_Data.keys()) keys = list(Final_Dict_Data.keys())
training_data = Merge.merge_all_image_data(Final_Dict_Data[keys[0]], Final_Dict_Data[keys[1]]) # 將訓練資料合併成一個list training_data = Merge.merge_all_image_data(Final_Dict_Data[keys[0]], Final_Dict_Data[keys[1]]) # 將訓練資料合併成一個list
training_label = Merge.merge_all_image_data(Final_Dict_Data[keys[2]], Final_Dict_Data[keys[3]]) #將訓練資料的label合併成一個label的list for i in range(2, Label_Length):
training_data = Merge.merge_all_image_data(training_data, Final_Dict_Data[keys[i]]) # 將訓練資料合併成一個list
training_label = Merge.merge_all_image_data(Final_Dict_Data[keys[Label_Length]], Final_Dict_Data[keys[Label_Length + 1]]) #將訓練資料的label合併成一個label的list
for i in range(Label_Length + 2, 2 * Label_Length):
training_label = Merge.merge_all_image_data(training_label, Final_Dict_Data[keys[i]]) # 將訓練資料合併成一個list
start = time.time() start = time.time()
trains_Data_Image = image_processing.Data_Augmentation_Image(training_data) # 多執行續讀檔 trains_Data_Image = image_processing.Data_Augmentation_Image(training_data) # 多執行續讀檔
@ -85,7 +80,10 @@ if __name__ == "__main__":
print(len(training_data)) print(len(training_data))
training_data, train_label = image_processing.image_data_processing(training_data, train_label) # 將讀出來的檔做正規化。降label轉成numpy array 格式 training_data, train_label = image_processing.image_data_processing(training_data, train_label) # 將讀出來的檔做正規化。降label轉成numpy array 格式
training_data = image_processing.normalization(training_data) # training_data = image_processing.normalization(training_data)
# training_data = training_data.permute(0, 3, 1, 2)
print(training_data.shape)
end = time.time() end = time.time()
print("\n\n\n讀取訓練資料(70000)執行時間:%f\n\n" % (end - start)) print("\n\n\n讀取訓練資料(70000)執行時間:%f\n\n" % (end - start))

View File

@ -37,3 +37,16 @@ def shuffle_data(image, label, mode = 1):
random.shuffle(shuffle_image[Label]) random.shuffle(shuffle_image[Label])
return shuffle_image return shuffle_image
def Balance_Process(Data_Content, Labels):
Data_Dict_Data = shuffle_data(Data_Content, Labels, 2)
Train_Size = 0
Train_Size = min(len(Data_Dict_Data[Labels[0]]), len(Data_Dict_Data[Labels[1]]))
for i in range(1, len(Labels) - 1):
Train_Size = min(Train_Size, len(Data_Dict_Data[Labels[i + 1]]))
for i in range(len(Labels)):
Data_Dict_Data[Labels[i]] = Data_Dict_Data[Labels[i]][0 : Train_Size]
return Data_Dict_Data, Train_Size

View File

@ -1,35 +1,64 @@
import paramiko # import paramiko
from scp import SCPClient # from scp import SCPClient
import os # import os
import pexpect # import pexpect
# def createSSHClient(server, port, user, password): # # def createSSHClient(server, port, user, password):
# client = paramiko.SSHClient() # # client = paramiko.SSHClient()
# client.load_system_host_keys() # # client.load_system_host_keys()
# client.set_missing_host_key_policy(paramiko.AutoAddPolicy) # # client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
# client.connect(server, port, user, password) # # client.connect(server, port, user, password)
# return client # # return client
# ssh = createSSHClient("10.1.29.28", 31931, "root", "whitekirin") # # ssh = createSSHClient("10.1.29.28", 31931, "root", "whitekirin")
# # os.mkdir("Original_ResNet101V2_with_NPC_Augmentation_Image") # # # os.mkdir("Original_ResNet101V2_with_NPC_Augmentation_Image")
# # with open("Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt", "w") as file: # # # with open("Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt", "w") as file:
# # pass # # # pass
# with SCPClient(ssh.get_transport()) as scp: # # with SCPClient(ssh.get_transport()) as scp:
# scp.get("/mnt/c/張晉嘉/stomach_cancer/Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt", "/raid/whitekirin/stomach_cancer/Model_result/save_the_train_result(2024-10-05)/Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt") # # scp.get("/mnt/c/張晉嘉/stomach_cancer/Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt", "/raid/whitekirin/stomach_cancer/Model_result/save_the_train_result(2024-10-05)/Original_ResNet101V2_with_NPC_Augmentation_Image_train3.txt")
def upload(port, filename, user, ip, dst_path): # def upload(port, filename, user, ip, dst_path):
cmdline = "scp %s -r %s %s@%s:%s" % (port, filename, user, ip, dst_path) # cmdline = "scp %s -r %s %s@%s:%s" % (port, filename, user, ip, dst_path)
try: # try:
child = pexpect.spawn(cmdline) # child = pexpect.spawn(cmdline)
child.expect("whitekirin109316118") # child.expect("whitekirin109316118")
child.sendline() # child.sendline()
child.expect(pexpect.EOF) # child.expect(pexpect.EOF)
print("file upload Finish") # print("file upload Finish")
except Exception as e: # except Exception as e:
print("upload faild: ", e) # print("upload faild: ", e)
upload(2222, "/raid/whitekirin/stomach_cancer/Model_result/save_the_train_result(2024-10-05)", "whitekirin", "203.64.84.39", "/mnt/c/張晉嘉/stomach_cancer") # upload(2222, "/raid/whitekirin/stomach_cancer/Model_result/save_the_train_result(2024-10-05)", "whitekirin", "203.64.84.39", "/mnt/c/張晉嘉/stomach_cancer")
from torch.utils.data import Dataset
from torch.utils.data import Subset, DataLoader
class ListDataset(Dataset):
def __init__(self, data_list, labels_list):
self.data = data_list
self.labels = labels_list
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
sample = self.data[idx]
label = self.labels[idx]
return sample, label
# 示例數據
data_list = ["image1.jpg", "image2.jpg", "image3.jpg"]
labels_list = [0, 1, 0]
# 創建 Dataset
dataset = ListDataset(data_list, labels_list)
# 測試
# print(type(dataset[0])) # ('image1.jpg', 0)
dataloader = DataLoader(dataset = dataset, batch_size = 1, shuffle=True, num_workers = 0, pin_memory=True)
print(dataloader)