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
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.
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] 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}
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])
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}") [/code] 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.
Ich fange gerade erst mit ML an, also würde ich mich über einen Rat freuen. Die Daten sind stark unausgewogen (~ 96% Normal gegenüber ~ 4% betrügerisch). Speicherzuweisungsfehler:...
Ich fand ein sehr interessantes Papier, Physik, informiert Deep Learning (Teil I): datengesteuerte Lösungen nichtlinearer partieller Differentialgleichungen und möchten ihm einen Versuch vorstellen....
Ich möchte die MNIST-Bilder als PNG-Dateien auf meinen Computer herunterladen. Bytes)
Bitte lassen Sie mich wissen, ob Sie Ideen oder Vorschläge haben. Danke!