Я весь день искал, почему ситуация не улучшается, потери остаются на уровне 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. Также добавлена пакетная нормализация, которая также не внесла никаких изменений в потери или их изменение.
Я весь день искал, почему ситуация не улучшается, потери остаются на уровне 4,1 после первых двух партий. Я новичок в PyTorch. Заранее благодарим за любую помощь! Вот набор данных [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] Я экспериментировал с упрощением сети, снижением параметров, но и то, и другое мало что дает. Добавьте код для инициализации весов с помощью инициализации kaiming, потери не изменятся. Недавно я также добавил активацию softmax к последнему слою, что ничего не меняет с точки зрения результатов, но раньше у меня сложилось впечатление, что softmax автоматически применяется к NN в pytorch. Также добавлена пакетная нормализация, которая также не внесла никаких изменений в потери или их изменение.
Я впервые создаю модель CNN для классификации изображений, и я немного запутался в том, что будет формой ввода для каждого типа (1D CNN, 2D CNN, 3D CNN) и как исправить количество фильтров в слое свертки. Мои данные - 100x100x30, где 30 являются...
Я реализую искусственную нейронную сеть (ИНС) на C++, используя набор данных fashion-mnist на основе этого исходного кода.
Это обучающий код:
#include
#include
using namespace std;
Я реализую искусственную нейронную сеть (ИНС) на C++, используя набор данных fashion-mnist на основе этого исходного кода. Однако меня смущает способ чтения файлов обучения mnist.
Это код обучения:
#include
#include
using namespace std;
Я пытаюсь классифицировать цветные цифры MNIST с помощью базовой архитектуры CNN на Keras. Вот фрагмент кода, который окрашивает исходный набор данных в красный, зеленый или синий цвет.
def load_norm_data():
## load basic mnist
(x_train, y_train),...