Das Netzwerk verbessert sich mit PyTorch CNN für den erweiterten MNIST-Datensatz nichtPython

Python-Programme
Anonymous
 Das Netzwerk verbessert sich mit PyTorch CNN für den erweiterten MNIST-Datensatz nicht

Post by Anonymous »

Ich habe den ganzen Tag darüber nachgedacht, warum sich das nicht verbessert. Der Verlust bleibt nach den ersten paar Chargen bei etwa 4,1. Ich bin neu bei PyTorch. Vielen Dank im Voraus für jede Hilfe!
Hier ist der Datensatz

Code: Select all

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}")
Ich habe damit experimentiert, das Netzwerk zu vereinfachen und die Parameter zu senken, beides bringt nicht viel. Fügen Sie den Code hinzu, um die Gewichte mit der Kaiming-Initialisierung zu initialisieren. Der Verlust ändert sich nicht. Ich habe der letzten Ebene kürzlich auch eine Softmax-Aktivierung hinzugefügt, die sich an den Ergebnissen nicht ändert, aber ich hatte zuvor den Eindruck, dass in Pytorch automatisch Softmax mit NNs angewendet wird. Außerdem wurde eine Batch-Normalisierung hinzugefügt, die ebenfalls keine Änderung am Verlust oder seiner Änderung bewirkte.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post