卷积神经网络的引入1--MLP再图像像素平移之后的局限性

news/2025/11/1 13:25:45/文章来源:https://www.cnblogs.com/zhchoice/p/19183179

!!! 本文重现的实验来自V Kishore Ayyadevara 著作的Modern Computer Vision with PyTorch (Second Edition) 一书,以下论述近代表个人理解,如想体验原汁原味,强烈建议阅读原书。
Fully Connected Neural Network在目标识别的局限,通过以下代码实现

# Import libraries and download data
from torchvision import datasets
from pathlib import Path
import torch
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
from torch.utils.data import Dataset, DataLoader
import torch.nn as nn
from torch.optim import SGD, Adam
import seaborn as sns# Download FashionMNIST dataset
data_folder = Path('./data/fashion_mnist')
data_folder.mkdir(parents=True, exist_ok=True)
fmnist = datasets.FashionMNIST(data_folder, download=True, train=True)# Load training data
tr_images = fmnist.data
tr_targets = fmnist.targets# Load validation data
val_fmnist = datasets.FashionMNIST(data_folder, download=True, train=False)
val_images = val_fmnist.data
val_targets = val_fmnist.targets# Set device
device = 'cuda' if torch.cuda.is_available() else 'cpu'# Define Dataset class
class FMNISTDataset(Dataset):def __init__(self, x, y):x = x.float()/255x = x.view(-1,28*28)self.x, self.y = x, y def __getitem__(self, ix):x, y = self.x[ix], self.y[ix]        return x.to(device), y.to(device)def __len__(self): return len(self.x)# Define model function
def get_model():model = nn.Sequential(nn.Linear(28 * 28, 1000),nn.ReLU(),nn.Linear(1000, 10)).to(device)loss_fn = nn.CrossEntropyLoss()optimizer = Adam(model.parameters(), lr=1e-3)return model, loss_fn, optimizer# Define training function
def train_batch(x, y, model, opt, loss_fn):prediction = model(x)batch_loss = loss_fn(prediction, y)batch_loss.backward()optimizer.step()optimizer.zero_grad()return batch_loss.item()# Define accuracy function
def accuracy(x, y, model):with torch.no_grad():prediction = model(x)max_values, argmaxes = prediction.max(-1)is_correct = argmaxes == yreturn is_correct.cpu().numpy().tolist()# Define data loading function
def get_data():     train = FMNISTDataset(tr_images, tr_targets)     trn_dl = DataLoader(train, batch_size=32, shuffle=True)val = FMNISTDataset(val_images, val_targets)     val_dl = DataLoader(val, batch_size=len(val_images), shuffle=True)return trn_dl, val_dl# Define validation loss function
def val_loss(x, y, model, loss_fn):with torch.no_grad():prediction = model(x)val_loss = loss_fn(prediction, y)return val_loss.item()# Get data and model
trn_dl, val_dl = get_data()
model, loss_fn, optimizer = get_model()# Training loop
train_losses, train_accuracies = [], []
val_losses, val_accuracies = [], []
for epoch in range(5):print(epoch)train_epoch_losses, train_epoch_accuracies = [], []for ix, batch in enumerate(iter(trn_dl)):x, y = batchbatch_loss = train_batch(x, y, model, optimizer, loss_fn)train_epoch_losses.append(batch_loss)        train_epoch_loss = np.array(train_epoch_losses).mean()for ix, batch in enumerate(iter(trn_dl)):x, y = batchis_correct = accuracy(x, y, model)train_epoch_accuracies.extend(is_correct)train_epoch_accuracy = np.mean(train_epoch_accuracies)for ix, batch in enumerate(iter(val_dl)):x, y = batchval_is_correct = accuracy(x, y, model)validation_loss = val_loss(x, y, model, loss_fn)val_epoch_accuracy = np.mean(val_is_correct)train_losses.append(train_epoch_loss)train_accuracies.append(train_epoch_accuracy)val_losses.append(validation_loss)val_accuracies.append(val_epoch_accuracy)# Display sample image
ix = 24300
plt.imshow(tr_images[ix], cmap='gray')
plt.title(fmnist.classes[tr_targets[ix]])
plt.show()# Prepare image for prediction
img = tr_images[ix]/255.
img = img.view(28*28)
img = img.to(device)# Get prediction
np_output = model(img).cpu().detach().numpy()
print(np.exp(np_output)/np.sum(np.exp(np_output)))# Show target label
print(f"Target: {tr_targets[ix]}")# Test translation invariance
preds = []
for px in range(-5,6):img = tr_images[ix]/255.img = img.view(28, 28)img2 = np.roll(img, px, axis=1)plt.imshow(img2)plt.show()img3 = torch.Tensor(img2).view(28*28).to(device)np_output = model(img3).cpu().detach().numpy()preds.append(np.exp(np_output)/np.sum(np.exp(np_output)))# Visualize translation results
fig, ax = plt.subplots(1,1, figsize=(12,10))
plt.title('Probability of each class for various translations')
sns.heatmap(np.array(preds), annot=True, ax=ax, fmt='.2f', xticklabels=fmnist.classes, yticklabels=[str(i)+str(' pixels') for i in range(-5,6)], cmap='gray')import numpy as np
import torch
import matplotlib.pyplot as plt
import seaborn as sns# 假设模型和数据都已加载好
# 这里 ix 是你选择的图片索引
ix = 24300
img = tr_images[ix] / 255.preds = []  # 存放每次平移后的概率分布
classes = fmnist.classes  # ['T-shirt/top', 'Trouser', 'Pullover', ...]print(f"原始类别标签: {classes[tr_targets[ix]]}\n")# 对图像在水平轴上从 -5 到 +5 像素平移
for px in range(-5, 6):img2 = np.roll(img, px, axis=1)               # 平移图像img3 = torch.Tensor(img2).view(28 * 28).to(device)np_output = model(img3).cpu().detach().numpy() # 模型输出softmax_output = np.exp(np_output) / np.sum(np.exp(np_output))preds.append(softmax_output)# 计算预测类别predicted_class = classes[np.argmax(softmax_output)]confidence = np.max(softmax_output)print(f"平移 {px:>2} 像素时预测结果: {predicted_class:15s}  概率: {confidence:.2f}")# 生成热图
fig, ax = plt.subplots(1, 1, figsize=(12, 10))
plt.title('Probability of each class for various translations')
sns.heatmap(np.array(preds), annot=True, ax=ax, fmt='.2f',xticklabels=classes,yticklabels=[f"{i} pixels" for i in range(-5, 6)],cmap='gray')
plt.show()

原始类别标签: Trouser

平移 -5 像素时预测结果: Shirt 概率: 0.99
平移 -4 像素时预测结果: Shirt 概率: 0.89
平移 -3 像素时预测结果: Dress 概率: 0.58
平移 -2 像素时预测结果: Trouser 概率: 1.00
平移 -1 像素时预测结果: Trouser 概率: 1.00
平移 0 像素时预测结果: Trouser 概率: 1.00
平移 1 像素时预测结果: Trouser 概率: 0.71
平移 2 像素时预测结果: Trouser 概率: 0.54
平移 3 像素时预测结果: Ankle boot 概率: 0.91
平移 4 像素时预测结果: Ankle boot 概率: 0.99
平移 5 像素时预测结果: Ankle boot 概率: 1.00
image

实验结论

  1. 位置敏感性
  • MLP 将图像展平成一维向量(28×28 → 784)
  • 每个像素位置对应一个固定的权重
  • 模型学习的是"在特定位置的特定像素值"
  • 例如:模型可能学到"第100个位置应该是白色表示裤子"
  1. 平移后预测崩溃

代码中的实验显示:

对同一张图片平移 -5 到 +5 像素

for px in range(-5, 6):
img2 = np.roll(img, px, axis=1) # 水平平移

结果:

  • 原始图片:模型正确识别为"裤子"(99.9%置信度)
  • 平移几个像素后:预测结果可能完全改变
  • 即使人眼看来完全是同一个物体,模型却给出不同答案
  1. 为什么会这样?

原始图片(正确识别):
位置 0-10: 黑色背景
位置 11-20: 裤子边缘 ← MLP学到这里应该有边缘
位置 21-28: 裤子主体

平移后(识别错误):
位置 0-10: 裤子边缘 ← 但MLP期望这里是背景!
位置 11-20: 裤子主体 ← 不匹配!
位置 21-28: 黑色背景

  1. 实际影响
  • 泛化能力差:训练数据中的图片位置稍有不同,模型就无法识别
  • 需要大量数据:必须看过物体在各种位置的样本才能学会
  • 不符合人类视觉:人类看到物体时,不管它在哪个位置都能识别
  • 实际应用受限:真实世界中物体位置是随机的
  1. 热图可视化显示的问题

代码最后生成的热图会显示:

  • Y 轴:-5到+5像素的平移
  • X 轴:10个类别的预测概率
  • 结果:每一行的预测概率分布差异很大

解决方案 → CNN

这正是为什么需要 CNN:

  • 卷积层:使用滑动窗口,对位置不敏感
  • 权重共享:同一个特征检测器在整张图上使用
  • 池化层:进一步增强位置不变性
  • 局部连接:关注局部特征而不是全局位置

结论:MLP 把图像当作一个固定位置的向量来处理,完全忽略了图像的空间结构和平移不变性,这是它在计算机视觉任务中的致命缺陷。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月超声波清洗机厂家推荐榜单:五大品牌综合对比分析

作为工业生产与精密清洁的重要工具,超声波清洗机在汽车制造、电子元件、医疗器械等领域的应用日益广泛。许多企业在选择设备时面临技术参数复杂、厂家资质参差不齐、行业适配性难以判断等痛点。根据行业调研数据,202…

2025年11月武汉刑事律师推荐榜单:专业刑辩律师综合对比分析

当您或家人面临刑事案件的困扰时,选择一位专业的刑事律师至关重要。在武汉这样一个法律市场发达的城市,刑事律师的数量众多,但专业水平和服务质量参差不齐。许多当事人在选择律师时常常感到迷茫,不知道如何判断律师…

2025年11月超声波清洗机厂家评测推荐:结合市场趋势与用户场景的专业分析

作为工业生产与精密清洁领域的重要设备,超声波清洗机的选择直接关系到企业生产效率与产品质量。2025年,随着制造业升级与环保要求提高,超声波清洗机市场呈现技术精细化、服务定制化趋势。根据行业权威报告,当前用户…

AI应用方向扎堆,企业咋选不踩坑?用“范式整合”破技术迷茫

AI 应用方向扎堆,企业咋选不踩坑?用 “范式整合” 破技术迷茫 “智能客服、数字人、AI 生视频、代码生成、RAG…… 现在 AI 能做的事儿也太多了,我们到底该往哪个方向使劲?万一选岔了,投进去的人、钱、时间不都打…

实用指南:基于YALMIP和CPLEX工具箱的多时段配电网重构算法matlab仿真

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第三十一篇

今天是11月1日,放假了休息一下

2025年11月办公家具公司推荐评价:十大品牌详细对比与选择指南

在选择办公家具公司时,企业决策者往往面临诸多挑战。无论是初创团队需要快速搭建办公空间,还是成熟企业计划升级总部形象,都需要找到既能满足功能需求又能控制成本的可靠供应商。当前办公家具行业呈现多元化发展趋势…

2025年11月办公家具公司推荐评价:从资质到服务的全维度考察

在办公环境日益影响工作效率与员工满意度的当下,选择一家可靠的办公家具公司成为企业行政采购的重要课题。根据行业调研数据显示,2024年中国办公家具市场规模已达千亿级别,企业采购需求呈现多元化趋势,涵盖初创公司…

2025年11月办公家具公司推荐榜单:权威对比与选择指南

在现代商业环境中,办公家具不仅是基础配置,更是影响员工效率、企业形象和空间利用率的关键因素。随着2025年企业数字化转型加速,办公家具行业呈现出智能化、模块化、绿色环保三大趋势。根据国家工业和信息化部发布的…

2025年11月背单词软件评测榜:从数据到体验的全面剖析

在当今信息爆炸的时代,背单词软件已成为学生、职场人士和语言学习者的必备工具。无论是备考英语考试、提升职业能力,还是满足日常学习需求,用户都希望找到一款高效、便捷且符合个人习惯的软件。然而,市场上背单词软…

2025年11月背单词软件推荐榜:五大工具深度对比与选择指南

在语言学习成为个人发展与职业提升重要支撑的今天,背单词软件凭借其高效便捷的特性成为许多用户的首选工具。本文面向的学生群体、职场人士或长期学习者,通常需要兼顾碎片化时间利用与系统化知识积累,他们可能因考试…

2025年11月背单词软件排名榜:功能对比与使用场景分析

在语言学习成为个人提升重要途径的今天,背单词软件凭借其便捷性和科学性受到广泛欢迎。许多用户可能是学生、职场人士或语言爱好者,他们希望通过高效工具系统化地扩展词汇量,同时避免传统背诵方式的枯燥感。当前背单…

C 浮点数在计算机中如何存储

在计算机中采用科学记数法将浮点数分为下面三部分: float 4个字节 32位 从高到低依次是:31 30-23 22-0符号位 0或1 指数位8位 小数部分23位举例:十进制的小数20.1如何转成计算机中的存储形式(二进制)呢? 步骤:整…

faust的panner立体声效果处理器

faust的panner立体声效果处理器https://faustlibraries.grame.fr/libs/spats/#sppannerprocess = osc1 : sp.panner(osc1_pan);

每年 CSP-J/S 复赛有因为一些小失误导致一年的努力付之东流。老师整理了一些复赛容易踩坑的点,或许对你有帮助!

每年 CSP-J/S 复赛都有很多同学因为一些小失误导致一年的努力付之东流。Tony老师整理了一些复赛容易踩坑的点,或许对你有帮助! 一、文件的输入输出 CSP、NOIP复赛与我们平时在Online Judge做题形式会有一些区别…

2025年11月珠海酒店推荐评测:十家酒店详细参数与体验报告

2025年11月珠海酒店推荐评测:十家酒店详细参数与体验报告 作为计划在2025年11月前往珠海的旅客,选择合适的酒店是确保旅行体验的关键环节。珠海作为热门旅游城市,每年11月正值旅游旺季,气候宜人,活动丰富,游客数…

2025年11月珠海酒店排行推荐:基于多维度数据对比分析

作为珠海旅游的重要门户,2025年珠海酒店市场呈现出多元化发展态势。根据珠海市文化和旅游局发布的数据,今年前三季度珠海接待游客量同比增长显著,酒店入住率保持稳定上升。许多游客在选择酒店时面临诸多考量,包括地…

“怕被第三方平台绑死?”企业级AI该走自主可控的路

“怕被第三方平台绑死?” 企业级 AI 该走自主可控的路 跟金融、医疗还有不少大企业的技术负责人聊的时候,常听到一句掏心窝子的顾虑:“不是不想用 AI,实在怕踩坑 —— 一旦上了某家封闭平台的车,后续数据、模型,…

2025年11月智能学习机品牌推荐榜单:五款主流产品深度对比分析

在当今教育信息化快速发展的背景下,智能学习机已成为许多家庭辅助孩子学习的重要工具。面对新课改的深入推进和升学压力,家长们在选择学习机时往往希望找到一款能够系统同步学校课程、提供个性化辅导且护眼健康的产品…

2025年11月智能学习机品牌推荐榜单:五大品牌综合对比分析

随着教育信息化进程加速和家庭教育投入持续增加,智能学习机已成为众多家庭的重要教育工具。2025年,智能学习机市场呈现出产品功能多元化、AI技术深度整合、教学内容同步化三大趋势。根据教育部教育装备研究与发展中心…