python - 神经网络不断预测相同的数字
问题描述
我有一个 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):
功能,图像几乎无法识别。
解决方案
推荐阅读
- android - 为什么在场景转换期间视图会被剪裁?
- javascript - 我如何从 React 中嵌套的子组件获取父组件中的数据?
- c# - 如何在 Xamarin Forms 应用程序中实现服务?
- amazon-web-services - 如何确定 AWS 用户/arn 是否没有控制台/管理员权限
- kivy - 如何为 Kivy 标签中的变量编码?
- python - 如何删除列表中具有设定范围的元素
- c++ - 带有模板的 C++ 函数指针参数
- php - 如何存储管理员帐户可以在 PHP 中更改的应用程序设置?
- makefile - 为什么不让合并模式规则成为先决条件,我该如何做到这一点?
- css - How can I remove the white-space around the numbers on a JS timer?