首页 > 解决方案 > 神经网络不断预测相同的数字

问题描述

我有一个 ROS 应用程序,其中相机节点通过服务将图像发送到中性网络节点。我使用的训练和验证数据集是 MNIST 数据库。预测一个数字应该很容易,但是神经网络会为每个服务请求返回相同的数字。

ai_service.py

class AiService():

    def __init__(self, save_path):
        self.batch_size = 2800
        self.epochs = 25
        self.learning_rate = 0.01
        self.training_data = torch.utils.data.DataLoader(datasets.MNIST(root='./data', train=True, download=True, 
                                transform=transforms.Compose([transforms.ToTensor(),
                                transforms.Normalize((0.1307,), (0.3081,))])), 200, shuffle=True)
        self.validation_data = torch.utils.data.DataLoader(datasets.MNIST(root='./data', train=False, download=True, 
                                transform=transforms.Compose([transforms.ToTensor(),
                                transforms.Normalize((0.1307,), (0.3081,))])), 200, shuffle=True)
      ...
        
    # Function to train the mnist dataset.
    def training(self):
        criterion = nn.CrossEntropyLoss() 
        optimizer = torch.optim.SGD(self.model.parameters(), self.learning_rate)
        start_time = time()
        for epoch in range(self.epochs):
            running_loss = 0
            # trainig phase
            for images, labels in self.training_data:
                optimizer.zero_grad() 
                image, label = images.to(self.device), labels.to(self.device)
                output = self.model(image)
                loss = criterion(output, label)
                loss.backward() 
                optimizer.step() #optimizing weights
                running_loss += loss.item() 
            else:
                print("Epoch {} - Training loss: {:.10f}".format(epoch, running_loss / len(self.training_data)))
        print("\nTraining Time (in minutes): {:.2f} =".format((time() - start_time) / 60))

    def validating(self, request_image):
        self.model.eval()
        tensor_image = self.image_to_tensor(request_image)   
        with torch.no_grad():
            output = self.model(tensor_image)       
        return output.cpu().data.numpy().argmax() 
             
    def image_to_tensor(self, request_image):
        return transforms.ToTensor()(self.cv_bridge.imgmsg_to_cv2(request_image, 'mono8'))

神经网络.py

class NeuralNetwork(nn.Module):

    # Initializes the Neural Network by setting up the layers.
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()                       
        self.input_layer = nn.Sequential(nn.Linear(28*28, 512)) 
        self.hidden_layer1 = nn.Linear(512, 254)
        self.hidden_layer2 = nn.Linear(254, 128)
        self.output_layer = nn.Linear(128, 10)
 
    def forward(self, x):
        x = self.flatten(x)
        x = F.relu(self.input_layer(x))
        x = F.relu(self.hidden_layer1(x))
        x = F.relu(self.hidden_layer2(x))
        x = self.output_layer(x)
        
        return F.log_softmax(x, 1)

我得到的训练准确度为: 在此处输入图像描述

我的输出: 在此处输入图像描述

我的相机图像:

在此处输入图像描述

会不会是因为缩放和灰度导致图片无法识别?我刚刚添加imshow到该def image_to_tensor(self, request_image):功能,图像几乎无法识别。

在此处输入图像描述

标签: pythonneural-networkpytorch

解决方案


推荐阅读