PaddleX实战:用MobileNetV3给电商商品图自动分类(含数据增强技巧)

深度学习之Seq2Seq原理与实战 【代码】深度学习之Seq2Seq原理与实战。 阅读详情

PaddleX实战:用MobileNetV3给电商商品图自动分类(含数据增强技巧)

在电商平台的日常运营中,每天涌入的商品主图数量可能高达百万级别。从服装鞋帽到数码家电,从美妆个护到生鲜食品,如何将这些海量图片精准、高效地自动归类到正确的商品类目下,是技术团队必须啃下的硬骨头。传统的人工审核不仅成本高昂、效率低下,更难以应对大促期间流量的瞬时爆发。而基于深度学习的图像分类技术,正成为解决这一痛点的核心引擎。

今天,我们就聚焦于一个具体的工业级落地场景:利用百度的PaddleX开发套件,结合轻量级但性能强悍的MobileNetV3模型,构建一个能够自动为电商商品主图分类的智能系统。这不仅仅是跑通一个Demo,我们会深入探讨在真实业务中,如何通过精细化的数据增强策略来模拟复杂的线上环境,如何调整模型微调技巧以在有限的数据上获得最佳性能,以及如何利用VisualDL可视化工具洞察训练过程,让模型调优从“黑盒”走向“白盒”。无论你是电商平台的技术负责人,还是刚踏入计算机视觉领域的开发者,这篇文章都将提供一套可直接复用的实战方案。

1. 工业场景下的数据准备与预处理艺术

在实验室里,我们追求的是在标准数据集(如ImageNet)上的高精度;但在电商战场,我们面对的是参差不齐、背景杂乱、主体大小不一的商品图片。第一步,也是决定模型上限的关键一步,就是数据的准备与预处理。

1.1 构建符合业务逻辑的数据集

电商图片分类与学术分类有一个本质区别:类目定义来源于业务。你的类别可能是“连衣裙”、“T恤”、“智能手机”、“蓝牙耳机”,而不是“猫”、“狗”。因此,数据集的组织必须紧密贴合后台类目树。

一个推荐的数据目录结构如下:

product_images/
├── 女装/
│   ├── 连衣裙/
│   │   ├── item_001.jpg
│   │   ├── item_002.jpg
│   │   └── ...
│   └── T恤/
│       └── ...
├── 数码/
│   ├── 手机/
│   └── 耳机/
└── 美妆/
    ├── 口红/
    └── 粉底液/

PaddleX要求我们将所有类别的图片扁平化处理,但通过labels.txt文件来维护类别映射。一个更工程化的做法是编写一个简单的数据准备脚本,自动完成从业务目录到PaddleX格式的转换,并记录下样本数量,用于后续分析类别是否平衡。

import os
import shutil
import random

def prepare_paddlex_dataset(src_root, dst_root, val_ratio=0.15, test_ratio=0.15):
    """
    将按业务类目组织的原始数据,转换为PaddleX ImageNet格式。
    src_root: 原始数据根目录,如 product_images/
    dst_root: 目标数据根目录,如 train_data/
    """
    all_image_paths = []
    all_labels = []
    label_names = sorted([d for d in os.listdir(src_root) if os.path.isdir(os.path.join(src_root, d))])
    label_to_id = {name: idx for idx, name in enumerate(label_names)}

    # 收集所有图片路径和标签
    for label_name in label_names:
        label_dir = os.path.join(src_root, label_name)
        for img_name in os.listdir(label_dir):
            if img_name.lower().endswith(('.jpg', '.jpeg', '.png')):
                src_path = os.path.join(label_dir, img_name)
                all_image_paths.append((src_path, label_to_id[label_name]))

    random.shuffle(all_image_paths)
    total = len(all_image_paths)
    val_split = int(total * val_ratio)
    test_split = int(total * (val_ratio + test_ratio))

    train_list = all_image_paths[test_split:]
    val_list = all_image_paths[:val_split]
    test_list = all_image_paths[val_split:test_split]

    # 复制文件并生成列表文件(这里简化,实际可只生成列表文件,不复制图片)
    # 生成 labels.txt
    with open(os.path.join(dst_root, 'labels.txt'), 'w') as f:
        f.write('\n'.join(label_names))

    # 生成 train_list.txt, val_list.txt, test_list.txt
    def write_list_file(data_list, file_name):
        with open(os.path.join(dst_root, file_name), 'w') as f:
            for img_path, label_id in data_list:
                # 假设图片已复制到dst_root/images下,这里记录相对路径
                f.write(f'images/{os.path.basename(img_path)} {label_id}\n')
    # ... 实际复制和写入操作

    print(f"数据集划分完成:训练集{len(train_list)}张,验证集{len(val_list)}张,测试集{len(test_list)}张")

注意:在实际生产环境中,图片可能存储在对象存储(如OSS、COS)中,此时列表文件中的路径应为对应的URL或存储路径,而非本地路径。数据准备脚本需要与公司的存储架构对接。

1.2 针对电商图片的数据增强策略设计

数据增强是提升模型泛化能力、防止过拟合的利器。对于商品图,我们需要模拟用户上传图片时可能出现的各种情况:拍摄角度偏移、背景干扰、光照变化、图片压缩等。PaddleX在paddlex.cls.transforms中提供了丰富的增强操作,关键在于组合与参数设置。

下面是一个为电商场景“量身定制”的增强流水线:

from paddlex.cls import transforms

# 训练集增强流水线
train_transforms = transforms.Compose([
    # 1. 随机裁剪与缩放:商品主体可能只占图片一部分
    transforms.RandomCrop(crop_size=224),
    # 2. 随机水平翻转:对于大多数商品(非文字类)是合理的
    transforms.RandomHorizontalFlip(p=0.5),
    # 3. 随机旋转:模拟小幅度的角度偏差
    transforms.RandomRotate(rotate_range=15),
    # 4. 颜色扰动:模拟不同白平衡和光照
    transforms.RandomDistort(brightness_range=0.2, contrast_range=0.2, saturation_range=0.2),
    # 5. 标准化:使用ImageNet的均值和标准差,这是通用做法
    transforms.Normalize()
])

# 验证/测试集预处理流水线
eval_transforms = transforms.Compose([
    # 保持长宽比将短边缩放到256
    transforms.ResizeByShort(short_size=256),
    # 从中心裁剪出224x224区域
    transforms.CenterCrop(crop_size=224),
    transforms.Normalize()
])

参数选择的背后逻辑:

  • RandomCrop的crop_size设为224,是因为MobileNetV3等主流网络输入为此尺寸。在裁剪前,图片会先被随机缩放,这迫使模型学习从不同尺度识别商品。
  • RandomRotate的范围设为15度,既能增加多样性,又避免将商品旋转到完全不可识别的角度(如把手机倒过来)。
  • RandomDistort的参数(亮度、对比度、饱和度)范围设为0.2,这是一个经验值,既能模拟真实变化,又不至于让图片失真到失去商品特征。

我们可以通过一个简单的可视化脚本来检查增强效果,确保生成的图片既多样又合理:

import matplotlib.pyplot as plt
from PIL import Image

img = Image.open('sample_product.jpg')
aug_img = train_transforms(img)
plt.subplot(1,2,1); plt.imshow(img); plt.title('原始图片')
plt.subplot(1,2,2); plt.imshow(aug_img); plt.title('增强后图片')
plt.show()

2. 模型选择与MobileNetV3的微调实战

模型选型需要在精度、速度和模型大小之间取得平衡。对于需要处理海量图片、实时响应或部署在移动端的电商场景,轻量级网络是首选。

2.1 为什么是MobileNetV3?

MobileNetV3结合了神经网络架构搜索(NAS)和NetAdapt算法,在精度和效率的权衡上达到了新的高度。PaddleX提供了多种变体,其中MobileNetV3_small_ssld尤其值得关注。

  • MobileNetV3_small:参数量极少,计算量小,适合对速度要求极高的场景。
  • ssld后缀:表示该预训练模型使用了百度自研的SSLD(Semi-Supervised Label Distillation)半监督标签蒸馏技术进行训练。这意味着它在海量无标签数据上进行了知识蒸馏,其特征提取能力通常比常规ImageNet预训练模型更强,迁移到下游任务时效果更佳。

下表对比了PaddleX中几种适合电商分类的轻量级模型:

模型名称输入尺寸参数量 (M)FLOPs (M)ImageNet Top-1 精度适用场景建议
MobileNetV3_small_ssld224x224~2.5~60~75.0%推荐首选,精度与速度平衡极佳
MobileNetV3_large_ssld224x224~5.5~220~79.0%对精度要求更高,可接受稍慢速度
ResNet18_vd224x224~11.7~1800~72.3%经典结构,社区资源丰富,但效率较低
ShuffleNetV2_x1_0224x224~2.3~150~69.0%极致的轻量化,精度有所牺牲

对于大多数电商商品分类任务(类目数在几十到几百),MobileNetV3_small_ssld已经能提供非常出色的基线性能。

2.2 模型初始化与关键参数解析

加载并准备微调MobileNetV3的代码如下,其中每个参数都关乎最终效果:

import os
import paddlex as pdx

os.environ['CUDA_VISIBLE_DEVICES'] = '0' # 使用单张GPU

# 加载数据集
train_dataset = pdx.datasets.ImageNet(
    data_dir='train_data',
    file_list='train_data/train_list.txt',
    label_list='train_data/labels.txt',
    transforms=train_transforms,
    shuffle=True # 训练时打乱数据顺序
)
eval_dataset = pdx.datasets.ImageNet(
    data_dir='train_data',
    file_list='train_data/val_list.txt',
    label_list='train_data/labels.txt',
    transforms=eval_transforms,
    shuffle=False # 验证时无需打乱
)

# 获取类别数
num_classes = len(train_dataset.labels)
print(f"当前任务类别数: {num_classes}")

# 初始化模型
model = pdx.cls.MobileNetV3_small_ssld(num_classes=num_classes)

这里的关键在于num_classes参数。PaddleX会自动处理预训练模型顶层的分类头替换。预训练模型在ImageNet(1000类)上学习到的底层视觉特征(如边缘、纹理、形状)具有强大的通用性,我们只需要让模型“忘记”旧的1000类分类规则,并“学习”新的商品类目规则即可。

2.3 学习率策略与衰减节点选择

微调(Fine-tuning)的核心技巧在于学习率(Learning Rate)的设置。使用预训练模型时,我们通常采用以下策略:

  1. 较小的初始学习率:避免大的更新破坏预训练好的、有价值的底层特征。
  2. 分层学习率(可选):对网络底层(特征提取器)使用更小的学习率,对顶层(新分类头)使用较大的学习率。PaddleX的train接口目前未直接暴露分层设置,但我们可以通过自定义优化器实现。
  3. 学习率衰减:在训练过程中按计划降低学习率,有助于模型在后期收敛到更优的局部最优点。

PaddleX的model.train方法通过lr_decay_epochs参数控制衰减时机。这个列表指定了在哪些epoch结束时进行衰减。如何设置这个列表?这取决于你的数据集大小和与ImageNet的差异度。

  • 经验法则:对于相似度较高的任务(如商品图分类之于通用物体分类),衰减可以晚一些开始。对于差异大的任务,可以早衰减。
  • 一个通用的策略:假设训练20个epoch,可以尝试在总epoch数的30%, 50%, 70%, 85%处衰减。例如:
    total_epochs = 20
    decay_points = [int(total_epochs*0.3), int(total_epochs*0.5), int(total_epochs*0.7), int(total_epochs*0.85)]
    # 得到 [6, 10, 14, 17]
    

我们可以设计一个更动态的方案:根据验证集损失不再下降时触发衰减。虽然PaddleX的简易接口不支持,但了解这个思想很重要。在实际操作中,我们可以先用一个预设的衰减计划跑一次,然后通过VisualDL观察损失曲线,再手动调整。

3. 训练过程可视化与模型诊断

“训练开始,然后就是漫长的等待”——这不再是深度学习开发应有的体验。PaddleX集成VisualDL,让我们能实时洞察模型训练的“黑箱”。

3.1 启动训练并启用VisualDL

在model.train中设置use_vdl=True和save_interval_epochs(例如每1个epoch保存一次检查点),就能记录训练数据。

model.train(
    num_epochs=20,
    train_dataset=train_dataset,
    train_batch_size=64,  # 根据GPU内存调整,越大通常越稳定
    eval_dataset=eval_dataset,
    save_interval_epochs=1, # 每1个epoch保存一次模型
    log_interval_steps=10,  # 每10个step打印一次日志
    save_dir='output/mobilenetv3_product_cls',
    learning_rate=0.001,   # 微调的经典初始学习率
    lr_decay_epochs=[6, 10, 14, 17], # 学习率衰减节点
    warmup_steps=500,      # 前500个step进行学习率热身,从小逐渐增大
    use_vdl=True           # 开启可视化
)

训练开始后,会在save_dir下生成一个vdl_log目录,里面包含了VisualDL可读取的日志文件。

3.2 使用VisualDL洞察关键指标

在命令行启动VisualDL服务:

visualdl --logdir output/mobilenetv3_product_cls/vdl_log --port 8040

然后在浏览器中打开http://localhost:8040,你将看到一个功能丰富的仪表盘。对于分类任务,最需要关注以下几个标签页:

  1. Scalar(标量图表):

    • train/loss & eval/loss:观察训练损失和验证损失的变化趋势。理想情况是两者同步下降,最后验证损失趋于平稳。如果训练损失持续下降而验证损失上升,这是典型的过拟合信号。
    • train/acc_top1 & eval/acc_top1:观察Top-1准确率。验证准确率是衡量模型泛化能力的金标准。当验证准确率在连续多个epoch不再提升时,可以考虑提前停止训练。

    提示:关注训练早期(前几个epoch)的损失下降速度。如果下降非常快,说明预训练模型迁移有效;如果很慢,可能需要稍微调高学习率。

  2. Histogram(直方图):

    • 这里展示了模型各层权重和梯度的分布。在训练初期,你可以看到权重分布发生变化,梯度稳定流动。如果某一层的梯度突然变得非常大或非常小(消失或爆炸),说明训练可能不稳定,需要调整学习率或使用梯度裁剪。
  3. Image(图像样本):

    • 可以查看经过数据增强后的训练图片,直观检查你的增强策略是否产生了合理且多样的样本。

通过VisualDL,一次训练就不再是“开盲盒”。我曾在一个服装分类项目中发现,验证损失在第8个epoch后开始震荡上升,而训练损失持续下降。通过VisualDL的图像标签页检查增强后的图片,发现随机旋转角度设置得过大(30度),导致很多带有文字Logo的T恤衫图片被旋转后,模型无法学习到Logo这一关键特征。将旋转范围调整到10度后,过拟合现象得到明显缓解。

4. 模型评估、优化与部署上线

训练完成后,我们得到的best_model通常是在验证集上表现最好的模型。但这仅仅是第一步,工业落地要求我们对模型进行严格的评估、优化,并最终转化为稳定的服务。

4.1 多维度模型评估

首先,在独立的测试集上进行最终评估:

test_dataset = pdx.datasets.ImageNet(
    data_dir='train_data',
    file_list='train_data/test_list.txt',
    label_list='train_data/labels.txt',
    transforms=eval_transforms
)
metrics = model.evaluate(test_dataset, batch_size=32)
print(metrics)

输出可能类似:{'top1_acc': 0.934, 'top5_acc': 0.992, 'loss': 0.215}。对于电商分类,Top-1准确率是最核心的指标,但Top-5准确率也很有参考价值,因为它反映了模型在“拿不准”时,能否将正确类目排在前五名,这对于后续的人工复核流程有帮助。

除了整体准确率,我们更需要一个类别级别的诊断。哪些类目容易混淆?比如“衬衫”和“T恤”,“蓝牙耳机”和“有线耳机”。我们可以通过生成混淆矩阵来分析。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
import seaborn as sns

all_preds = []
all_labels = []
for batch_data in test_dataset: # 这里需要自定义一个数据读取循环
    image, label = batch_data
    pred = model.predict(image) # 获取预测结果
    pred_label = np.argmax(pred[0]['scores'])
    all_preds.append(pred_label)
    all_labels.append(label)

cm = confusion_matrix(all_labels, all_preds)
plt.figure(figsize=(12,10))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', 
            xticklabels=test_dataset.labels, 
            yticklabels=test_dataset.labels)
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.title('Confusion Matrix')
plt.show()

通过混淆矩阵的热力图,可以一目了然地发现模型的“弱点”。针对混淆严重的类别对,我们可以:

  • 检查这两个类别的训练样本是否不足。
  • 检查样本图片是否存在固有的模糊性(例如,某些上衣确实介于衬衫和T恤之间)。
  • 考虑是否需要对这两个类别进行数据增强的特别处理,或收集更多差异化明显的样本。

4.2 模型优化与压缩

在部署前,尤其是面向移动端或边缘设备时,模型优化至关重要。

  1. 模型导出为推理格式: PaddleX训练保存的模型是训练格式,包含优化器状态等。部署时需要导出为推理格式。

    model = pdx.load_model('output/mobilenetv3_product_cls/best_model')
    model.export_inference_model('inference_model')
    

    导出的inference_model目录下会包含__model__(计算图)和__params__(参数)文件,以及一个描述预处理操作的model.yml文件。

  2. 使用PaddleSlim进行模型压缩(可选): 如果对模型大小和速度有极致要求,可以利用PaddleSlim工具包进行剪枝、量化。

    • 剪枝:移除网络中不重要的连接或通道,减少参数量和计算量。
    • 量化:将模型权重和激活从FP32转换为INT8,大幅减少模型体积并提升推理速度,通常精度损失很小。

    这是一个高级话题,但PaddleSlim提供了相对简单的API。在压缩后,务必在测试集上重新评估精度,确保在可接受的损失范围内。

4.3 服务化部署实践

模型最终需要以API服务的形式提供给业务方调用。PaddleX本身不直接提供服务化框架,但可以轻松地与Paddle Serving或FastAPI等Web框架集成。

一个基于FastAPI的简易部署示例:

from fastapi import FastAPI, File, UploadFile
import numpy as np
from PIL import Image
import paddlex as pdx
import io

app = FastAPI()
# 加载推理模型
predictor = pdx.deploy.Predictor('inference_model')

@app.post("/predict/")
async def predict_product_category(file: UploadFile = File(...)):
    # 读取上传的图片
    image_data = await file.read()
    image = Image.open(io.BytesIO(image_data)).convert('RGB')
    img_array = np.array(image)

    # 执行预测
    result = predictor.predict(img_array)
    # 解析结果
    top1_label = result[0]['category']
    top1_score = result[0]['score']
    # 可以返回Top-K个结果
    return {
        "category_id": top1_label,
        "category_name": predictor.model.labels[top1_label], # 需要从labels.txt加载
        "confidence": float(top1_score),
        "status": "success"
    }

# 运行: uvicorn main:app --host 0.0.0.0 --port 8000

在真实的生产环境,还需要考虑:

  • 批量预测:处理大量图片时,需要优化批次处理逻辑。
  • 异步处理:对于耗时较长的预测,采用消息队列异步处理。
  • 监控与告警:监控API的响应时间、成功率,并设置异常告警。
  • A/B测试:新模型上线时,与旧模型进行小流量对比测试,确保效果提升。

从数据准备到模型服务化,我们走完了一个完整的电商商品图分类项目闭环。整个过程强调的不仅仅是工具的使用,更是针对具体业务场景的思考、实验和调优。MobileNetV3和PaddleX提供了强大的基础能力,而真正让模型在业务中创造价值的,是开发者对数据、对业务、对模型行为的深刻理解与持续迭代。在实际项目中,我习惯在每次模型迭代后,不仅记录最终的准确率,更记录下这次调整了哪些参数、基于什么样的观察、带来了什么变化。这份“调优日志”是团队最宝贵的经验资产。

深度学习之TF-IDF原理与实战 【代码】深度学习之TF_IDF原理与实战。 阅读详情

相关推荐

深度学习之LoRA(低秩适配)原理与实战

【代码】深度学习之LoRA(低秩适配)原理与实战。

yumiwangzi30的博客 269

深度学习0:数学知识:正态分布1

步骤内容结果1引入e−x2e^{-x^2}e−x2钟形曲线2算它的面积I∫−∞∞e−x2dxI∫−∞∞​e−x2dx3平方变成二重积分I2I^2I24换极坐标简化计算5算出I2πI^2 = \piI2πIπIπ​6代入σ\sigmaσ和μ\muμ做变量替换得到σ2πσ2π​7除以它归一化得到正态分布公式2π2π​不是随便写的,它来自高斯积分∫−∞∞e−x2。

tellmewhoisi的博客 204

深度学习之词袋(Bag-of-Words, BoW)原理与实战

【代码】深度学习之词袋(Bag-of-Words, BoW)原理与实战。

yumiwangzi30的博客 234

Transformer 为什么能取代 RNN?从自注意力讲起

2017 年谷歌在《Attention Is All You Need》中提出 Transformer,核心是。它如今是 GPT、BERT、ChatGPT 的共同底座。

anew___的博客 796

AI对战五子棋——深度学习策略网络

在本篇博文中,我们完成了:✔ 构建一个 CNN 五子棋策略网络✔ 让神经网络输出落子概率✔ 使用 Policy Gradient 强化学习训练 AI✔ 让 AI 实现人与 AI、AI 自对弈博弈。

X2829352498的博客 38

如何用 OBProxy 实现 OceanBase 的最佳路由策略

本文基于业务中一类常见的路由问题展开,对OceanBase的路由功能及对应配置项做详细介绍,指导用户在业务实践中如何正确的配置路由策略及快速排查路由问题

OceanBase分布式数据库的博客 1695

基于深度学习的商品评论情感分析系统-毕业设计

面向商品评论的中文情感分析系统,支持单条预测、批量分析、情感分布与关键词、报告导出。TextCNN、BiLSTM、Transformer 在同一词表、同一数据切分、同一种子与超参下公平对比,测试集 F1 分别为 0.9101、0.9089、0.9075。结论是这一规模下模型复杂度未带来收益,但误差结构不同。附技术栈、截图、文档预览与演示视频。

csbysj2020 134

常学常新:《Attention Is All You Need》万字解读!

常学常新:《Attention Is All You Need》万字解读!

hunteritself的博客 3651

【原创深度学习项目】基于深度学习的建筑工地防护装备检测系统|安全帽与反光衣检测系统(RT-DETR-L 模型)

本文设计并实现了一套基于RT-DETR-L的建筑工地防护装备检测系统,采用Django+Vue前后端架构,实现对安全帽、反光背心等7类装备及“无PPE”“未戴安全帽”等缺失状态的精准识别。系统支持图片、视频、摄像头实时检测,具备参数可调、数据可视化与统计分析功能,有效解决小目标漏检、误检及管理难问题,助力智慧工地安全管理落地。文末可获取源码。

qq_1445749146的博客 228

深入解析EtherCAT通讯DS402协议下的伺服电机控制模式选择与配置

本文深入解析了EtherCAT通讯DS402协议下的伺服电机控制模式选择与配置,详细介绍了六种核心控制模式(如PPM、CSP、CSV、CST)的应用场景及实战技巧。通过EtherCAT和DS402协议的高效配合,实现工业自动化中伺服电机的精准控制,提升设备性能与稳定性。

h0i1j2k3l的博客 1175

ZYNQ双核通信实战:手把手教你用OpenAMP搭建Linux+FreeRTOS开发环境(2018.3版)

本文详细介绍了如何在ZYNQ平台上使用OpenAMP框架实现双核通信,构建Linux与FreeRTOS协同开发环境。从开发环境配置、系统组件编译到OpenAMP框架应用,手把手指导开发者完成ZYNQ双核通信系统的搭建与调试,为异构计算开发提供实用解决方案。

weixin_33737134的博客 476

图解循环神经网络(RNN)

RNN(循环神经网络)就是“带记忆的网络”:让网络拥有一块“记忆”,在处理当前数据时,能同时参考之前看过的内容;它不一次性看完全部输入,而是像人读书一样,一个字一个字地读,每读一个字就更新一次脑子里的记忆,然后用这份记忆去理解当前这个字。但便签一直在被改写,新信息不断挤占旧信息,传到第 40 步时,“巴黎”的痕迹已经淡得几乎没了。读到“贵”的时候,网络并没有重新去查“好看”这个词——但“好看”的影响已经融在了便签里(那个 1.5)。这三个困难的共同点:答案不在当前这一个字里,而在“前面那串东西”里。

技术管理两手抓,两手都要硬. 390

Python 爬虫实战:亚马逊商品评论 + 评分抓取(情感分析数据预处理)

在电子商务领域,用户评论是了解产品口碑和市场反馈的重要渠道。亚马逊作为全球领先的电商平台,拥有海量的商品评论数据。本文将详细介绍如何使用 Python 编写爬虫程序,从亚马逊网站抓取商品评论和评分数据,并进行情感分析的数据预处理。

yansideyucsdn的博客 770

神经网络入门指南:从 CNN、RNN 到 Attention

神经网络的学习,本质是“预测—比较—纠错”的循环;CNN 通过局部连接与权重共享理解图像;RNN 通过隐藏状态传递上下文;LSTM 和 GRU 用门控机制管理记忆;Encoder–Decoder 把理解与生成拆成两个阶段;Attention 则让模型在每一步都能主动寻找最相关的信息。到这里,我们已经走完了从普通神经网络到 Attention 的完整路线。下一篇将正式进入 Transformer,看看它如何摆脱 RNN 的顺序计算,又如何让每个 Token 直接找到与自己相关的信息。

爱敲代码的小黄 371

【proteus】模拟串口和物理串口通讯

proteus提供了两种串口,一种是模拟的串口,还有一张是用软件仿真到硬件的物理串口。他们的区别就是:模拟串口只能在proteus内部进行通讯,但是物理可以通过软件映射到硬件上和单机或者串口软件通讯。 物理串口在元器件搜索COMPIM即可找到。 模拟串口在这里: PROTEUS仿真图: 物理串口COMPIM的设置: 模拟串口的设置: VSPD是一款虚拟串口软件,VSPD下载链接: 链接:https://pan.baidu.com/s/1AZygJCeWZfQTnxdCb_3TPg 提取码:12pm

阿蛋的博客 8934

Android 15.0 app进程保活白名单功能实现

在15.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能

安卓兼职framework和app工程师的博客 639

CNN 卷积神经网络深度解析:卷积、池化与特征提取的底层原理

卷积核(Kernel),也叫滤波器(Filter),本质上是一个可以训练的权重矩阵。1 0 -11 0 -11 0 -1这个卷积核可以对图像中的局部像素进行加权计算。不同的卷积核能够提取不同类型的特征:水平边缘特征垂直边缘特征纹理特征角点特征局部形状特征在传统图像处理中,滤波器通常由人工设计。而在 CNN 中,卷积核的权重通过训练数据和反向传播自动学习得到。这也是 CNN 能够自动提取图像特征的关键。# 第一层卷积padding=1# 第二层卷积padding=1。

2503_90237586的博客 254

100天精通Python(可视化篇)——第98天:Pyecharts绘制多种炫酷日历图参数说明+代码实战

一、日历图介绍 二、基础配置 1. 配置项类 2. 添加函数 3. 日期标签配置 4. 坐标系配置 三、日历图实战 1. 基础日历图 2. 日历热图

努力让自己发光,对的人才能迎着光而来 2万+

图解常用深度学习优化器

来隐式构造 Hessian 逆的近似,从而直接估计出“谷底在哪”,而非仅仅判断“哪边最陡”。即SGD/Adam 主要看“当前坡度”,LBFGS 还会看“最近几步坡度怎么变”,像用局部地形图来规划路线。训练 Transformer 时,有些层梯度大,有些层梯度小。如果用 Adam + L2,梯度大的参数反而可能被“少衰减”,正则效果不稳定;:你要下山,但每次迈步前都要派侦察兵把整座山的每一个坡面都测量一遍,算出“绝对最陡”的方向才走一步。:还是下山,但这次你只问身边一个路人“哪边最陡”,然后就走。

技术管理两手抓,两手都要硬. 215

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

基于深度学习的猫图像目标检测方法研究:YOLOv8s模型海选、多种子对比训练与Django+ONNX部署实现详解

本课题基于深度学习研究猫图像目标检测问题。数据集含1000张猫图像、1188个标注框,按固定比例划分并冻结清单;训练前在多个候选族中短训海选,确定YOLOv8s为主模型,经学习率搜索与显存标定后完成150轮训练,验证集mAP50达到0.92,并以7个随机种子的对比实验验证稳定性。最优权重导出为ONNX接入Django系统,提供图片、视频、摄像头三种识别方式,配套识别记录管理与统计大屏,形成从训练到应用的完整闭环。

WEIXIN_JSJBSZDS的博客 200

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

深度学习0:数学知识:正态分布2(积分,幂函数积分公式)

积分符号∫(\int∫= 把无数个极窄的小矩形面积(高度×dx(\times dx×dx))“拼接”起来。dx(dxdx= 无穷小的宽度。定积分的结果= 曲线下方的总面积(一个具体的数字)。不定积分= 寻找求导前的那个原函数。这就是“积分求面积”最朴素的意思!

tellmewhoisi的博客 210

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

无人机巡检道路路面异常检测数据集 深度学习 目标检测 无人机巡检 道路病害 路面异常 YOLO格式 数据集发布9028期

无人机巡检道路路面异常检测数据集 深度学习 目标检测 无人机巡检 道路病害 路面异常 YOLO格式 数据集发布9028期

qq_2529413168的博客 197

【深度学习实验】—— YOLOv12 添加 SE 注意力机制:实现、训练与水果检测对比

本次实验在 YOLOv12n 中接入 SE(Squeeze-and-Excitation)通道注意力,使用已有四类水果数据集,完成模块编写、模型解析器注册、前向与梯度检查、模型训练和最佳权重评估。项目本次设置与结果模型YOLOv12n 基线 / YOLOv12n SE 替换版任务四类水果目标检测数据集200 张图片,594 个标注框划分训练 160 张 / 验证 20 张 / 测试 20 张训练两组各 2 轮,batch=2,imgsz=640,seed=0,随机初始化。

weixin_65899656的博客 219

遥感大棚语义分割数据集 深度学习 语义分割 遥感影像 农业大棚 YOLO格式 数据集发布5025期

遥感大棚语义分割数据集 深度学习 语义分割 遥感影像 农业大棚 YOLO格式 数据集发布5025期

qq_2529413168的博客 123

计算机毕业设计选题推荐:【基于深度学习的车辆损坏严重程度评估方法研究】ResNet50 图像分类

系统用 ResNet50 完成轻微、中度、严重三档分类,输出类别、置信度和单次耗时;视频按每秒一帧抽帧识别,历史区同步出图,没识别出来的帧也保留原图;识别记录可检索、看详情和删除,大屏按类别、时段和任务类型做统计。训练采用迁移学习,部署走 ONNX,推理前加纯色和域外两道拒识,尽量避免把非车损画面硬判成某一类。

BYSJLG的博客 231

深度学习0:数学知识:正态分布4(坐标变换的缩放比例(面积微元变换))

x2y2r2x2y2r2(距离公式,把直角坐标变成极坐标)dxdyrdrdθdxdyrdrdθ(面积微元变换,多出来的rrr是关键)rrr从000到∞+\infty∞(半径覆盖整个平面)θ\thetaθ从000到2π2\pi2π(角度转一整圈)为什么要这么做?因为原来的高斯积分里是e−x2y2dxdye−x2y2dxdy。换成极坐标后,x2y2x^2 + y^2x2y。

tellmewhoisi的博客 257
上一篇: 5分钟搞定微信小程序直播全屏功能:从图标布局到API调用的保姆级指南
下一篇: 新手必看!Pandas数据清洗5个常见错误及解决方案(以学生饮酒量数据为例)
gitlab7runner
博客等级 码龄4年 78粉丝 1747原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值