Модель преобразователя зрения не тренируется должным образом ⇐ Python
Модель преобразователя зрения не тренируется должным образом
Вот код преобразователя зрения, который я создал с помощью Pytorch. Модель показывает перекрестную энтропию 2,31 и точность около 10%. Это остается неизменным во все эпохи. Следовательно, модель не может обучаться. Пожалуйста, дайте мне знать, что я делаю неправильно, и, если возможно, пришлите исправленный код. Заранее спасибо!
PS: Модель обучена на MNIST
# -*- кодировка: utf-8 --*- """ Создано вс 2 июля 14:04:19 2023 @author: Пункты """ импортный фонарь из импорта фонарика nn из преобразований импорта torchvision импортировать torchvision.datasets как наборы данных импортировать torch.nn.functional как F импортировать torch.optim как optim импортировать numpy как np импорт математики Глава класса (nn.Module): def __init__(self,num_heads,weight_dimension): супер(Голова, я).__init__() self.w1 = nn.Parameter(torch.randn((weight_dimension*num_heads,weight_dimension))).to(device) self.w2 = nn.Parameter(torch.randn((weight_dimension*num_heads,weight_dimension))).to(устройство) self.w3 = nn.Parameter(torch.randn((weight_dimension*num_heads,weight_dimension))).to(device) защита вперед (сам, x): x = x.to(устройство) self.Q = torch.matmul(x,self.w1).to(устройство) self.K = torch.matmul(x,self.w2).to(устройство) self.V = torch.matmul(x,self.w3).to(устройство) lnq = nn.LayerNorm(self.Q.size()[1:]).to(устройство) lnk = nn.LayerNorm(self.K.size()[1:]).to(устройство) lnv = nn.LayerNorm(self.V.size()[1:]).to(устройство) self.Q = lnq(self.Q) self.K = lnk(self.K) self.V = lnv(self.V) self.K = torch.transpose(self.K, -2, -1) out = torch.matmul(self.Q,self.K) out = out/np.sqrt(self.Q.shape[1]) выход = F.softmax(out,dim=-1) out = torch.matmul(out,self.V) вернуться класс MHA(nn.Module): def __init__(self,num_heads,weight_dimension): супер(MHA, self).__init__() self.num_heads = num_heads self.weight_dimension = весовой_размер головы = [] для меня в диапазоне (self.num_heads): head = Head(self.num_heads,self.weight_dimension) heads.append(голова) self.heads = головы защита вперед (сам, x): флаг=Истина для меня в диапазоне (self.num_heads): если флаг: out_multihead = self.heads(x) флаг = Ложь еще: out_multihead = torch.cat((out_multihead,self.heads(x)),axis=2) вернуть out_multihead класс vit_model(nn.Module): def __init__(self,img_size,patch_size,embedding_dim,n_heads,hidden_dims_mlp,n_classes,batch_size): супер().__init__() self.patch_size = размер_патча self.n_heads = n_heads self.hidden_dims_mlp = скрытый_dims_mlp self.img_size = img_size self.n_classes = n_classes self.device = torch.device("cuda" если torch.cuda.is_available() иначе «процессор») self.embedding_dim = embedding_dim self.batch_size = размер_пакета embedding_rows = self.patch_size*self.patch_size embedding_cols = self.embedding_dim embedding_cols = int(embedding_cols) self.embedding_matrix = nn.Parameter(torch.randn((embedding_rows,embedding_cols))) self.embedding_matrix.requires_grad_(True) self.added_class_head = nn.Parameter(torch.randn((1,embedding_cols))) #Обычно распространяется как nn.init.normal_ (std 10-6) self.added_class_head.requires_grad_(True) self.positional_embeddings = nn.Parameter(self.get_positional_encodings((img_size//patch_size)**2,embedding_cols)) #Trunc Нормальное распределение self.positional_embeddings.requires_grad_(True) self.weight_dimension = embedding_cols//self.n_heads self.mha = MHA(self.n_heads,self.weight_dimension) self.mlp_inside_encoder = nn.Sequential( nn.Linear(self.embedding_dim*(self.positional_embeddings.shape[0]+1), self.hidden_dims_mlp), nn.ГЕЛУ(), nn.Dropout(0,5), nn.Linear(self.hidden_dims_mlp, self.embedding_dim*(self.positional_embeddings.shape[0]+1)), nn.ГЕЛУ(), nn.Dropout(0,5) ) self.mlp_classification = nn.Sequential( nn.Linear(self.embedding_dim, self.n_classes), nn.ГЕЛУ(), nn.Dropout(0,5), nn.Linear(self.n_classes, self.n_classes), nn.ГЕЛУ(), nn.Dropout(0,5) ) def dive_image_into_patches(self,imgs,patch_size): изображения = изображения/255 стартх, старт = 0,0 пакетный_размер, каналы, высота, ширина = imgs.shape флаг = Истина для startx в диапазоне (0, высота, patch_size): для начала в диапазоне (0, ширина, patch_size): tmat = imgs[:,:,startx:startx+patch_size,starty:starty+patch_size] tmat = tmat.reshape((batch_size,1,tmat.shape[1]*tmat.shape[2]*tmat.shape[3])) если флаг: patches_list = tmat флаг = Ложь еще: patches_list = torch.cat((patches_list,tmat),1) вернуть список_патчей Защиту get_positional_encodings (self, seq_length, Hidden_size): позиция = torch.arange(seq_length).unsqueeze(1) div_term = torch.exp(torch.arange(0, скрытый_размер, 2) * (-math.log(10000.0) / скрытый_размер)) кодировки = torch.zeros(seq_length, скрытый_размер) кодировки[:, 0::2] = torch.sin(позиция * div_term) кодировки[:, 1::2] = torch.cos(позиция * div_term) возвращать кодировки защита вперед (я, изображения): out = self.divide_image_into_patches(изображения,self.patch_size) out = torch.matmul(out,self.embedding_matrix) out = out + self.positional_embeddings.unsqueeze(0).expand(self.batch_size, -1, -1) out = torch.cat((out,self.added_class_head.expand(self.batch_size, 1, -1)),1) out = out.to(self.device) ln = nn.LayerNorm(out.size()[1:]).to(self.device) выход = ln(выход) Layer_norm1 = out.clone() выход = self.mha(выход) выход = выход + Layer_norm1 пропустить = out.clone() out = out.to(self.device) ln = nn.LayerNorm(out.size()[1:]).to(self.device) выход = ln(выход) out = self.mlp_inside_encoder(out.reshape(out.shape[0],out.shape[1]*out.shape[2])) out = пропустить + out.reshape(self.batch_size,layer_norm1.shape[1],self.embedding_dim) выход = выход[:,-1,:] out = self.mlp_classification(out) вернуться # Определите преобразование для нормализации данных Transform = Transforms.Compose([transforms.ToTensor(), Transforms.Normalize((0.1307,), (0.3081,))]) # Загрузите наборы обучающих и тестовых данных train_dataset = datasets.MNIST(root='./data', train=True, Transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, Transform=transform) # Создаем загрузчики данных train_loader = torch.utils.data.DataLoader(train_dataset, shuffle=True, Batch_size=1000) test_loader = torch.utils.data.DataLoader (test_dataset, shuffle = False, Batch_size = 1000) устройство = torch.device("cuda" если torch.cuda.is_available() иначе «процессор») torch.autograd.set_detect_anomaly(True) модель = vit_model(28, 4, 512, 8, 2048, 10, 1000) модель = model.to(устройство) печать (модель) #num_params = sum(p.numel() для p в model.named_parameters()) для p в model.named_parameters(): распечатать(п) #print('Количество параметров:',num_params) критерий = nn.CrossEntropyLoss() оптимизатор = optim.SGD(model.parameters(), lr=0,01) epoch_losses = [] epoch_accuracies = [] for epoch in range(100): # Количество эпох обучения эпоха_лосс = [] эпоха_acc = [] модель.поезд() для i (изображения, метки) в перечислении (train_loader): изображения = images.to(устройство) labels = labels.to(устройство) c = модель (изображения) потеря = критерий (c, метки) с torch.no_grad(): предсказания = torch.argmax(c, dim=-1) acc = torch.sum(прогнозы == метки)/1000 оптимизатор.zero_grad() потеря.назад() оптимизатор.шаг() epoch_loss.append(loss.item()) epoch_acc.append(acc.cpu().numpy()) модель.eval() epoch_losses.append(np.average(epoch_loss)) epoch_accuracies.append(np.average(epoch_acc)) print('Потеря эпохи:',epoch_losses[-1]) print('Точность эпохи:',epoch_accuracies[-1]) Я пробовал варьировать скорость обучения, размеры патчей и т. д. гиперпараметры, но это не сработало.
Вот код преобразователя зрения, который я создал с помощью Pytorch. Модель показывает перекрестную энтропию 2,31 и точность около 10%. Это остается неизменным во все эпохи. Следовательно, модель не может обучаться. Пожалуйста, дайте мне знать, что я делаю неправильно, и, если возможно, пришлите исправленный код. Заранее спасибо!
PS: Модель обучена на MNIST
# -*- кодировка: utf-8 --*- """ Создано вс 2 июля 14:04:19 2023 @author: Пункты """ импортный фонарь из импорта фонарика nn из преобразований импорта torchvision импортировать torchvision.datasets как наборы данных импортировать torch.nn.functional как F импортировать torch.optim как optim импортировать numpy как np импорт математики Глава класса (nn.Module): def __init__(self,num_heads,weight_dimension): супер(Голова, я).__init__() self.w1 = nn.Parameter(torch.randn((weight_dimension*num_heads,weight_dimension))).to(device) self.w2 = nn.Parameter(torch.randn((weight_dimension*num_heads,weight_dimension))).to(устройство) self.w3 = nn.Parameter(torch.randn((weight_dimension*num_heads,weight_dimension))).to(device) защита вперед (сам, x): x = x.to(устройство) self.Q = torch.matmul(x,self.w1).to(устройство) self.K = torch.matmul(x,self.w2).to(устройство) self.V = torch.matmul(x,self.w3).to(устройство) lnq = nn.LayerNorm(self.Q.size()[1:]).to(устройство) lnk = nn.LayerNorm(self.K.size()[1:]).to(устройство) lnv = nn.LayerNorm(self.V.size()[1:]).to(устройство) self.Q = lnq(self.Q) self.K = lnk(self.K) self.V = lnv(self.V) self.K = torch.transpose(self.K, -2, -1) out = torch.matmul(self.Q,self.K) out = out/np.sqrt(self.Q.shape[1]) выход = F.softmax(out,dim=-1) out = torch.matmul(out,self.V) вернуться класс MHA(nn.Module): def __init__(self,num_heads,weight_dimension): супер(MHA, self).__init__() self.num_heads = num_heads self.weight_dimension = весовой_размер головы = [] для меня в диапазоне (self.num_heads): head = Head(self.num_heads,self.weight_dimension) heads.append(голова) self.heads = головы защита вперед (сам, x): флаг=Истина для меня в диапазоне (self.num_heads): если флаг: out_multihead = self.heads(x) флаг = Ложь еще: out_multihead = torch.cat((out_multihead,self.heads(x)),axis=2) вернуть out_multihead класс vit_model(nn.Module): def __init__(self,img_size,patch_size,embedding_dim,n_heads,hidden_dims_mlp,n_classes,batch_size): супер().__init__() self.patch_size = размер_патча self.n_heads = n_heads self.hidden_dims_mlp = скрытый_dims_mlp self.img_size = img_size self.n_classes = n_classes self.device = torch.device("cuda" если torch.cuda.is_available() иначе «процессор») self.embedding_dim = embedding_dim self.batch_size = размер_пакета embedding_rows = self.patch_size*self.patch_size embedding_cols = self.embedding_dim embedding_cols = int(embedding_cols) self.embedding_matrix = nn.Parameter(torch.randn((embedding_rows,embedding_cols))) self.embedding_matrix.requires_grad_(True) self.added_class_head = nn.Parameter(torch.randn((1,embedding_cols))) #Обычно распространяется как nn.init.normal_ (std 10-6) self.added_class_head.requires_grad_(True) self.positional_embeddings = nn.Parameter(self.get_positional_encodings((img_size//patch_size)**2,embedding_cols)) #Trunc Нормальное распределение self.positional_embeddings.requires_grad_(True) self.weight_dimension = embedding_cols//self.n_heads self.mha = MHA(self.n_heads,self.weight_dimension) self.mlp_inside_encoder = nn.Sequential( nn.Linear(self.embedding_dim*(self.positional_embeddings.shape[0]+1), self.hidden_dims_mlp), nn.ГЕЛУ(), nn.Dropout(0,5), nn.Linear(self.hidden_dims_mlp, self.embedding_dim*(self.positional_embeddings.shape[0]+1)), nn.ГЕЛУ(), nn.Dropout(0,5) ) self.mlp_classification = nn.Sequential( nn.Linear(self.embedding_dim, self.n_classes), nn.ГЕЛУ(), nn.Dropout(0,5), nn.Linear(self.n_classes, self.n_classes), nn.ГЕЛУ(), nn.Dropout(0,5) ) def dive_image_into_patches(self,imgs,patch_size): изображения = изображения/255 стартх, старт = 0,0 пакетный_размер, каналы, высота, ширина = imgs.shape флаг = Истина для startx в диапазоне (0, высота, patch_size): для начала в диапазоне (0, ширина, patch_size): tmat = imgs[:,:,startx:startx+patch_size,starty:starty+patch_size] tmat = tmat.reshape((batch_size,1,tmat.shape[1]*tmat.shape[2]*tmat.shape[3])) если флаг: patches_list = tmat флаг = Ложь еще: patches_list = torch.cat((patches_list,tmat),1) вернуть список_патчей Защиту get_positional_encodings (self, seq_length, Hidden_size): позиция = torch.arange(seq_length).unsqueeze(1) div_term = torch.exp(torch.arange(0, скрытый_размер, 2) * (-math.log(10000.0) / скрытый_размер)) кодировки = torch.zeros(seq_length, скрытый_размер) кодировки[:, 0::2] = torch.sin(позиция * div_term) кодировки[:, 1::2] = torch.cos(позиция * div_term) возвращать кодировки защита вперед (я, изображения): out = self.divide_image_into_patches(изображения,self.patch_size) out = torch.matmul(out,self.embedding_matrix) out = out + self.positional_embeddings.unsqueeze(0).expand(self.batch_size, -1, -1) out = torch.cat((out,self.added_class_head.expand(self.batch_size, 1, -1)),1) out = out.to(self.device) ln = nn.LayerNorm(out.size()[1:]).to(self.device) выход = ln(выход) Layer_norm1 = out.clone() выход = self.mha(выход) выход = выход + Layer_norm1 пропустить = out.clone() out = out.to(self.device) ln = nn.LayerNorm(out.size()[1:]).to(self.device) выход = ln(выход) out = self.mlp_inside_encoder(out.reshape(out.shape[0],out.shape[1]*out.shape[2])) out = пропустить + out.reshape(self.batch_size,layer_norm1.shape[1],self.embedding_dim) выход = выход[:,-1,:] out = self.mlp_classification(out) вернуться # Определите преобразование для нормализации данных Transform = Transforms.Compose([transforms.ToTensor(), Transforms.Normalize((0.1307,), (0.3081,))]) # Загрузите наборы обучающих и тестовых данных train_dataset = datasets.MNIST(root='./data', train=True, Transform=transform) test_dataset = datasets.MNIST(root='./data', train=False, Transform=transform) # Создаем загрузчики данных train_loader = torch.utils.data.DataLoader(train_dataset, shuffle=True, Batch_size=1000) test_loader = torch.utils.data.DataLoader (test_dataset, shuffle = False, Batch_size = 1000) устройство = torch.device("cuda" если torch.cuda.is_available() иначе «процессор») torch.autograd.set_detect_anomaly(True) модель = vit_model(28, 4, 512, 8, 2048, 10, 1000) модель = model.to(устройство) печать (модель) #num_params = sum(p.numel() для p в model.named_parameters()) для p в model.named_parameters(): распечатать(п) #print('Количество параметров:',num_params) критерий = nn.CrossEntropyLoss() оптимизатор = optim.SGD(model.parameters(), lr=0,01) epoch_losses = [] epoch_accuracies = [] for epoch in range(100): # Количество эпох обучения эпоха_лосс = [] эпоха_acc = [] модель.поезд() для i (изображения, метки) в перечислении (train_loader): изображения = images.to(устройство) labels = labels.to(устройство) c = модель (изображения) потеря = критерий (c, метки) с torch.no_grad(): предсказания = torch.argmax(c, dim=-1) acc = torch.sum(прогнозы == метки)/1000 оптимизатор.zero_grad() потеря.назад() оптимизатор.шаг() epoch_loss.append(loss.item()) epoch_acc.append(acc.cpu().numpy()) модель.eval() epoch_losses.append(np.average(epoch_loss)) epoch_accuracies.append(np.average(epoch_acc)) print('Потеря эпохи:',epoch_losses[-1]) print('Точность эпохи:',epoch_accuracies[-1]) Я пробовал варьировать скорость обучения, размеры патчей и т. д. гиперпараметры, но это не сработало.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Модель обучения с подкреплением не тренируется на графическом процессоре Pytorch
Anonymous » » в форуме Python - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Модель обучения с подкреплением не тренируется на графическом процессоре Pytorch
Anonymous » » в форуме Python - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-