Сеть не улучшается с помощью PyTorch CNN для расширенного набора данных MNISTPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Сеть не улучшается с помощью PyTorch CNN для расширенного набора данных MNIST

Сообщение Anonymous »

Я весь день искал, почему ситуация не улучшается, потери остаются на уровне 4,1 после первых двух партий. Я новичок в PyTorch. Заранее благодарим за любую помощь!
Вот набор данных

Код: Выделить всё

key = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'A':10,'B':11,'C':12,'D':13,'E':14,'F':15,'G':16,'H':17,'I':18,'J':19,'K':20,'L':21,'M':22,'N':23,'O':24,'P':25,
'Q':26,'R':27,'S':28,'T':29,'U':30,'V':31,'W':32,'X':33,'Y':34,'Z':35,'a':36,'b':37,'c':38,'d':39,'e':40,'f':41,'g':42,'h':43,'i':44,'j':45,'k':46,'l':47,'m':48,'n':49,'o':50,'p':51,
'q':52,'r':53,'s':54,'t':55,'u':56,'v':57,'w':58,'x':59,'y':60,'z':61}

# Hyperparams
learning_rate = 0.0001
batch_size = 32
epochs_num = 32

file = pd.read_csv('data/english.csv', header=0).values
filename_dict = {}
for line in file:
# ex.  ['Img/img001-002.png' '0'] .replace('Img/','')
filename_dict[line[0]] = key[line[1]]

# Prepare data
image_tensor_list = [] # List of image tensors
filename_list = [] # List of file names
for line in file:
filename = line[0]
filename_list.append(filename)
img = cv2.imread("data/" + filename,0) # Grayscale
img = img / 255.0  # Normalize to [0, 1]
img_tensor = torch.tensor(img, dtype=torch.float32).unsqueeze(0)
image_tensor_list.append(img_tensor)

# Split into to train and test
data_combined = list(zip(image_tensor_list, filename_list))
np.random.shuffle(data_combined)

# Separate shuffled data
image_tensor_list, filename_list = zip(*data_combined)

# 90% train
train_X = image_tensor_list[:int(len(image_tensor_list)*0.9)]
train_y = []
for i in range(len(train_X)):
filename = filename_list[i]
train_y.append(filename_dict[filename])

# 10% test
test_X = image_tensor_list[int(len(image_tensor_list)*0.9)+1:-1]
test_y = []
for i in range(len(test_X)):
filename = filename_list[i]
test_y.append(filename_dict[filename])

class dataset(Dataset):
def __init__(self, x_tensor, y_tensor):
self.x = x_tensor
self.y = y_tensor

def __getitem__(self, index):
return (self.x[index], self.y[index])

def __len__(self):
return len(self.x)

train_data = dataset(train_X, train_y)
train_loader = DataLoader(dataset=train_data, batch_size=batch_size, shuffle=True, drop_last=True)

# Create the Model
class ShittyNet(nn.Module):
def __init__(self):
super(ShittyNet, self).__init__()
self.conv1 = nn.Conv2d(1, 16, kernel_size=5, stride=1, padding=2)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(16, 32, kernel_size=5, stride=1, padding=2)
self.conv3 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1)
self.bn1 = nn.BatchNorm2d(16)
self.bn2 = nn.BatchNorm2d(32)
self.fc1 = nn.Linear(32*225*300, 128)
self.fc2 = nn.Linear(128, 62)
self._initialize_weights()

def _initialize_weights(self):
# Use Kaiming He initialization
init.kaiming_uniform_(self.conv1.weight, nonlinearity='relu')
init.kaiming_uniform_(self.conv2.weight, nonlinearity='relu')
init.kaiming_uniform_(self.conv3.weight, nonlinearity='relu')
init.kaiming_uniform_(self.fc1.weight, nonlinearity='relu')

# Initialize biases with zeros
init.zeros_(self.conv1.bias)
init.zeros_(self.conv2.bias)
init.zeros_(self.conv3.bias)
init.zeros_(self.fc1.bias)
init.zeros_(self.fc2.bias)

def forward(self, x):
x = self.pool(F.relu(self.bn1(self.conv1(x))))
x = self.pool(F.relu(self.bn2(self.conv2(x))))

# showTensor(x)
x = x.view(x.size(0), -1)
x = F.relu(self.fc1(x))
x = F.softmax(self.fc2(x))
return x

net = ShittyNet()
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=learning_rate, momentum=0.9, weight_decay=1e-5)

for epoch_num in range(epochs_num):
print(f"Starting epoch {epoch_num+1}")
for i, (imgs, labels) in tqdm(enumerate(train_loader), desc=f'Epoch {epoch_num}', total=len(train_loader)):
labels = torch.tensor(labels, dtype=torch.long)
# Forward
output = net(imgs)
loss = criterion(output, labels)

# Backward
optimizer.zero_grad()
loss.backward()
optimizer.step()
if i % 2 == 0:
os.system('clear')
_, predicted = torch.max(output,1)
print(f"Loss: {loss.item():.4f}\nPredicted: {predicted}\nReal: {labels}")
Я экспериментировал с упрощением сети, снижением параметров, но и то, и другое мало что дает. Добавьте код для инициализации весов с помощью инициализации kaiming, потери не изменятся. Недавно я также добавил активацию softmax к последнему слою, что ничего не меняет с точки зрения результатов, но раньше у меня сложилось впечатление, что softmax автоматически применяется к NN в pytorch. Также добавлена ​​пакетная нормализация, которая также не внесла никаких изменений в потери или их изменение.

Подробнее здесь: https://stackoverflow.com/questions/793 ... st-dataset
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»