Я впервые изучаю ИИ, но у меня вопрос по поводу ошибки загрузки после сохранения. ⇐ Python
Я впервые изучаю ИИ, но у меня вопрос по поводу ошибки загрузки после сохранения.
%cd /content/drive !pip установить фонарик torchvision импортировать ОС импортный фонарь импорт импортировать torch.nn как nn импортировать torch.optim как optim из torch.utils.data импорт набора данных, DataLoader из torchvision импортирует преобразования, модели импортировать панд как pd из изображения импорта PIL класс CustomDataset(Набор данных): def __init__(self, csv_file, root_dir, target_part, Transform=None): self.data = pd.read_csv(csv_file) self.root_dir = корневой_каталог self.transform = трансформировать self.class_mapping = {'S': 0, 'A': 1, 'B': 2} self.target_part = target_part защита __len__(сам): вернуть len(self.data) def __getitem__(self, idx): img_name = os.path.join(self.root_dir, str(self.data.iloc[idx, 0]), f"{self.data.iloc[idx, 0]}_{self.data.iloc[idx, 1]}.jpg") часть = self.data.iloc[idx, 1] если часть != self.target_part: вернуть Нет, Нет изображение = Image.open(img_name) ранг = self.data.iloc[idx, 2] метка = self.class_mapping.get(ранг, -1) если метка == -1: поднять ValueError(f"알파벳 랭크 '{rank}'를 매핑할 수 없습니다.") если self.transform: изображение = self.transform(изображение) вернуть изображение, метку Transform = Transforms.Compose([ Transforms.Resize((512, 512)), преобразует.ToTensor(), ]) размер_пакета = 20 target_parts = ["сзади", "спереди", "клавиатура", "монитор"] models_dict = {} part_epochs = { «назад»: 50, «фронт»: 50, «клавиатура»: 50, "монитор": 50 } для части в target_parts: num_epochs = part_epochs.get(часть, 10) если num_epochs == 0: print(f"Пропуск обучения для части {part}...") продолжать train_dataset = CustomDataset('/content/drive/MyDrive/train2.csv', '/content/drive/MyDrive/train2', target_part=part, Transform=transform) train_dataset = [данные для данных в train_dataset, если data[0] не имеет значения None] train_loader = DataLoader (train_dataset,atch_size=batch_size, shuffle=True) модель = models.vgg16(предварительно обученный=True) num_features = model.classifier[6].in_features model.classifier[6] = nn.Linear(num_features, 3) устройство = torch.device("cuda", если torch.cuda.is_available(), иначе "процессор") модель.to(устройство) критерий = nn.CrossEntropyLoss() оптимизатор = optim.SGD(model.parameters(), lr=0,001, импульс=0,9) models_dict[часть] = модель для эпохи в диапазоне (num_epochs): модель.поезд() бег_потеря = 0,0 для пакета в train_loader: входы, метки = партия входы = inputs.to(устройство) labels = labels.to(устройство) оптимизатор.zero_grad() выходы = модель (входы) потеря = критерий (выходы, метки) потеря.назад() оптимизатор.шаг() Running_loss += loss.item() print(f"Обучающая модель для части {part} - 에포크 {epoch + 1}/{num_epochs}, 손실: {running_loss / len(train_loader)}") из изображения импорта PIL импортный фонарь импортировать torchvision.transforms как преобразования # 이미지 파일 경로 설정 пути_изображения = { "назад": '/content/drive/MyDrive/testinput/170612495/170612495_back.jpg', "front": '/content/drive/MyDrive/testinput/170612495/170612495_front.jpg', "клавиатура": '/content/drive/MyDrive/testinput/170612495/170612495_keyboard.jpg', "монитор": '/content/drive/MyDrive/testinput/170612495/170612495_monitor.jpg', } # 이미지를 텐서로 변환 Transform = Transforms.Compose([ Transforms.Resize((512,512)), преобразует.ToTensor(), ]) результаты = {} например, image_path в image_paths.items(): изображение = Image.open(путь_изображения) изображение = преобразование (изображение) model = models_dict[part] # 이미 학습된 해당 부위의 모델 선택 model.eval() # Загрузка данных image = image.unsqueeze(0) # 배치 차원 추가 изображение = image.to(устройство) с torch.no_grad(): выходы = модель (изображение) _, прогноз = torch.max(выходы, 1) Rank_mapping = {0: 'S', 1: 'A', 2: 'B'} # 모델 학습 시 사용한 랭크 매핑 предсказанный_ранг = ранг_маппинг[predicted.item()] результаты[часть] = прогнозируемый_ранг print("각 부위별 랭크 결과:", результаты) Мы изучили и протестировали модель искусственного интеллекта, которая возвращает уровень повреждения для каждой части при вводе изображения каждой части ноутбука. После обучения и тестирования я возвращаю значения ранга на основе изображений, чего и хочу.
# Сохранить модель checkpoint_path = f'/content/drive/MyDrive/vggnettestmodel2.pth' model.fc = nn.Linear(num_features, 3) контрольно-пропускной пункт = { 'model_state_dict': model.state_dict(), 'optimizer_state_dict':оптимизатор.state_dict(), 'classifier.6.weight': model.classifier[6].weight, 'classifier.6.bias': model.classifier[6].bias } torch.save(контрольная точка, путь к контрольной точке) Итак, я сохранил модель.
импортировать факел импортировать torchvision.models как модели # Создаём архитектуру модели loading_model = models.vgg16(pretrained=False) # Создавать только архитектуру, не загружать веса # Загрузить состояние модели контрольная точка = torch.load("/content/drive/MyDrive/vggnettestmodel50.pth") # Измените состояние модели, чтобы оно соответствовало количеству классов num_features = загруженная_модель.классификатор[6].in_features loading_model.classifier[6] = torch.nn.Linear(num_features, 3) # Измените количество классов на 3 # Инициализируем веса слоя «classifier.6» если «classifier.6.weight» в контрольной точке и «classifier.6.bias» в контрольной точке: загруженная_модель.классификатор[6].вес = nn.Параметр(контрольная точка["классификатор.6.вес"]) загруженная_модель.классификатор[6].bias = nn.Parameter(контрольная точка["classifier.6.bias"]) еще: print("Вес для слоя 'classifier.6' не найден в контрольной точке.") # Скопируйте веса сохраненной модели в модифицированную модель loading_model.load_state_dict(контрольная точка, строгий = False) loading_model.eval() # Переводим модель в режим оценки # Переносим модель на устройство загруженная_модель = загруженная_модель.to(устройство) # Далее идет тестовая часть для части в target_parts: model = loading_model # Использовать загруженную модель model.eval() # Переводим модель в режим оценки models_dict[part] = model # Добавить модель в models_dict из изображения импорта PIL импортный фонарь импортировать torchvision.transforms как преобразования # Установить путь к файлу изображения пути_изображения = { "назад": '/content/drive/MyDrive/testinput/170612495/170612495_back.jpg', "front": '/content/drive/MyDrive/testinput/170612495/170612495_front.jpg', "клавиатура": '/content/drive/MyDrive/testinput/170612495/170612495_keyboard.jpg', "монитор": '/content/drive/MyDrive/testinput/170612495/170612495_monitor.jpg', } # Преобразуем изображение в тензор Transform = Transforms.Compose([ Transforms.Resize((512,512)); преобразует.ToTensor(); ]) результаты = {} например, image_path в image_paths.items(): изображение = Image.open(путь_изображения) изображение = преобразование (изображение) model = models_dict[part] # Выберите модель для уже изученной части model.eval() # Переводим модель в режим оценки image = image.unsqueeze(0) # Добавить размер пакета изображение = image.to(устройство) с torch.no_grad(): выходы = модель (изображение) _, прогноз = torch.max(выходы, 1) Rank_mapping = {0: 'S', 1: 'A', 2: 'B'} # Сопоставление рангов, используемое при обучении модели предсказанный_ранг = ранг_маппинг[predicted.item()] результаты[часть] = прогнозируемый_ранг print("Оранжируйте результаты для каждой части:", results) Однако, когда я загружаю и тестирую модель в новом блокноте, она возвращает рейтинг S независимо от того, какое изображение я ввожу. В чем причина?
Кажется, проблем не с обучением, а скорее с сохранением или загрузкой, но я впервые занимаюсь моделированием ИИ, поэтому сложно выяснить причину. помогите.
%cd /content/drive !pip установить фонарик torchvision импортировать ОС импортный фонарь импорт импортировать torch.nn как nn импортировать torch.optim как optim из torch.utils.data импорт набора данных, DataLoader из torchvision импортирует преобразования, модели импортировать панд как pd из изображения импорта PIL класс CustomDataset(Набор данных): def __init__(self, csv_file, root_dir, target_part, Transform=None): self.data = pd.read_csv(csv_file) self.root_dir = корневой_каталог self.transform = трансформировать self.class_mapping = {'S': 0, 'A': 1, 'B': 2} self.target_part = target_part защита __len__(сам): вернуть len(self.data) def __getitem__(self, idx): img_name = os.path.join(self.root_dir, str(self.data.iloc[idx, 0]), f"{self.data.iloc[idx, 0]}_{self.data.iloc[idx, 1]}.jpg") часть = self.data.iloc[idx, 1] если часть != self.target_part: вернуть Нет, Нет изображение = Image.open(img_name) ранг = self.data.iloc[idx, 2] метка = self.class_mapping.get(ранг, -1) если метка == -1: поднять ValueError(f"알파벳 랭크 '{rank}'를 매핑할 수 없습니다.") если self.transform: изображение = self.transform(изображение) вернуть изображение, метку Transform = Transforms.Compose([ Transforms.Resize((512, 512)), преобразует.ToTensor(), ]) размер_пакета = 20 target_parts = ["сзади", "спереди", "клавиатура", "монитор"] models_dict = {} part_epochs = { «назад»: 50, «фронт»: 50, «клавиатура»: 50, "монитор": 50 } для части в target_parts: num_epochs = part_epochs.get(часть, 10) если num_epochs == 0: print(f"Пропуск обучения для части {part}...") продолжать train_dataset = CustomDataset('/content/drive/MyDrive/train2.csv', '/content/drive/MyDrive/train2', target_part=part, Transform=transform) train_dataset = [данные для данных в train_dataset, если data[0] не имеет значения None] train_loader = DataLoader (train_dataset,atch_size=batch_size, shuffle=True) модель = models.vgg16(предварительно обученный=True) num_features = model.classifier[6].in_features model.classifier[6] = nn.Linear(num_features, 3) устройство = torch.device("cuda", если torch.cuda.is_available(), иначе "процессор") модель.to(устройство) критерий = nn.CrossEntropyLoss() оптимизатор = optim.SGD(model.parameters(), lr=0,001, импульс=0,9) models_dict[часть] = модель для эпохи в диапазоне (num_epochs): модель.поезд() бег_потеря = 0,0 для пакета в train_loader: входы, метки = партия входы = inputs.to(устройство) labels = labels.to(устройство) оптимизатор.zero_grad() выходы = модель (входы) потеря = критерий (выходы, метки) потеря.назад() оптимизатор.шаг() Running_loss += loss.item() print(f"Обучающая модель для части {part} - 에포크 {epoch + 1}/{num_epochs}, 손실: {running_loss / len(train_loader)}") из изображения импорта PIL импортный фонарь импортировать torchvision.transforms как преобразования # 이미지 파일 경로 설정 пути_изображения = { "назад": '/content/drive/MyDrive/testinput/170612495/170612495_back.jpg', "front": '/content/drive/MyDrive/testinput/170612495/170612495_front.jpg', "клавиатура": '/content/drive/MyDrive/testinput/170612495/170612495_keyboard.jpg', "монитор": '/content/drive/MyDrive/testinput/170612495/170612495_monitor.jpg', } # 이미지를 텐서로 변환 Transform = Transforms.Compose([ Transforms.Resize((512,512)), преобразует.ToTensor(), ]) результаты = {} например, image_path в image_paths.items(): изображение = Image.open(путь_изображения) изображение = преобразование (изображение) model = models_dict[part] # 이미 학습된 해당 부위의 모델 선택 model.eval() # Загрузка данных image = image.unsqueeze(0) # 배치 차원 추가 изображение = image.to(устройство) с torch.no_grad(): выходы = модель (изображение) _, прогноз = torch.max(выходы, 1) Rank_mapping = {0: 'S', 1: 'A', 2: 'B'} # 모델 학습 시 사용한 랭크 매핑 предсказанный_ранг = ранг_маппинг[predicted.item()] результаты[часть] = прогнозируемый_ранг print("각 부위별 랭크 결과:", результаты) Мы изучили и протестировали модель искусственного интеллекта, которая возвращает уровень повреждения для каждой части при вводе изображения каждой части ноутбука. После обучения и тестирования я возвращаю значения ранга на основе изображений, чего и хочу.
# Сохранить модель checkpoint_path = f'/content/drive/MyDrive/vggnettestmodel2.pth' model.fc = nn.Linear(num_features, 3) контрольно-пропускной пункт = { 'model_state_dict': model.state_dict(), 'optimizer_state_dict':оптимизатор.state_dict(), 'classifier.6.weight': model.classifier[6].weight, 'classifier.6.bias': model.classifier[6].bias } torch.save(контрольная точка, путь к контрольной точке) Итак, я сохранил модель.
импортировать факел импортировать torchvision.models как модели # Создаём архитектуру модели loading_model = models.vgg16(pretrained=False) # Создавать только архитектуру, не загружать веса # Загрузить состояние модели контрольная точка = torch.load("/content/drive/MyDrive/vggnettestmodel50.pth") # Измените состояние модели, чтобы оно соответствовало количеству классов num_features = загруженная_модель.классификатор[6].in_features loading_model.classifier[6] = torch.nn.Linear(num_features, 3) # Измените количество классов на 3 # Инициализируем веса слоя «classifier.6» если «classifier.6.weight» в контрольной точке и «classifier.6.bias» в контрольной точке: загруженная_модель.классификатор[6].вес = nn.Параметр(контрольная точка["классификатор.6.вес"]) загруженная_модель.классификатор[6].bias = nn.Parameter(контрольная точка["classifier.6.bias"]) еще: print("Вес для слоя 'classifier.6' не найден в контрольной точке.") # Скопируйте веса сохраненной модели в модифицированную модель loading_model.load_state_dict(контрольная точка, строгий = False) loading_model.eval() # Переводим модель в режим оценки # Переносим модель на устройство загруженная_модель = загруженная_модель.to(устройство) # Далее идет тестовая часть для части в target_parts: model = loading_model # Использовать загруженную модель model.eval() # Переводим модель в режим оценки models_dict[part] = model # Добавить модель в models_dict из изображения импорта PIL импортный фонарь импортировать torchvision.transforms как преобразования # Установить путь к файлу изображения пути_изображения = { "назад": '/content/drive/MyDrive/testinput/170612495/170612495_back.jpg', "front": '/content/drive/MyDrive/testinput/170612495/170612495_front.jpg', "клавиатура": '/content/drive/MyDrive/testinput/170612495/170612495_keyboard.jpg', "монитор": '/content/drive/MyDrive/testinput/170612495/170612495_monitor.jpg', } # Преобразуем изображение в тензор Transform = Transforms.Compose([ Transforms.Resize((512,512)); преобразует.ToTensor(); ]) результаты = {} например, image_path в image_paths.items(): изображение = Image.open(путь_изображения) изображение = преобразование (изображение) model = models_dict[part] # Выберите модель для уже изученной части model.eval() # Переводим модель в режим оценки image = image.unsqueeze(0) # Добавить размер пакета изображение = image.to(устройство) с torch.no_grad(): выходы = модель (изображение) _, прогноз = torch.max(выходы, 1) Rank_mapping = {0: 'S', 1: 'A', 2: 'B'} # Сопоставление рангов, используемое при обучении модели предсказанный_ранг = ранг_маппинг[predicted.item()] результаты[часть] = прогнозируемый_ранг print("Оранжируйте результаты для каждой части:", results) Однако, когда я загружаю и тестирую модель в новом блокноте, она возвращает рейтинг S независимо от того, какое изображение я ввожу. В чем причина?
Кажется, проблем не с обучением, а скорее с сохранением или загрузкой, но я впервые занимаюсь моделированием ИИ, поэтому сложно выяснить причину. помогите.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Вход в систему веб -сайта с помощью вывода и сохранения вывода и сохранения вывода и сеанса?
Anonymous » » в форуме Php - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Вход в систему веб -сайта с помощью вывода и сохранения вывода и сохранения вывода и сеанса?
Anonymous » » в форуме Php - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-