突破GEE内置限制:将本地Python机器学习模型部署上云

突破GEE内置限制:将本地Python机器学习模型部署至云端 本文详细介绍了如何突破Google Earth Engine(GEE)的内置限制,将本地Python机器学习模型(如袋装决策树)部署至云端。通过实战案例和分步指南,帮助开发者解决GEE在复杂模型支持上的不足,充分利用云端计算优势,提升遥感数据处理效率。 阅读详情

1. 为什么我们需要“本地训练,云端推理”?

如果你用过Google Earth Engine(GEE)做遥感分析,肯定又爱又恨。爱的是它海量的数据和强大的并行计算能力,处理全球尺度的影像也就是分分钟的事。恨的是什么呢?就是它内置的机器学习算法库,有时候真的不够用。比如,你想用个集成学习里的“袋装决策树”(Bagging Decision Trees)来提升土地覆盖分类的精度,结果翻遍GEE的文档,发现它压根没提供这个算法。官方给的ee.Classifier.smileCart、smileRandomForest虽然不错,但当你手头有更复杂的需求,或者想用自己精心调参的模型时,就感觉被“封印”住了。

这感觉就像你有一台超级跑车(GEE的云计算能力),但厂家只允许你用自带的导航系统(内置算法),你想装个自己习惯的高德地图或者更专业的测绘软件,门都没有。对于生态遥感研究者来说,这尤其难受。我们面对的往往是特定区域、特定生态问题,比如草原退化监测、湿地动态变化,这些场景下,通用模型的精度可能达不到发表论文或者指导实践的要求。

所以,“本地训练,云端推理”的混合架构就成了一个非常实用的突破口。简单说,就是把复杂的、定制化的模型训练工作放在你熟悉的本地环境(比如你的笔记本电脑或实验室服务器)完成,然后把训练好的模型“打包”上传到GEE云端,利用GEE的海量数据和无敌算力进行大规模预测和分类。这既发挥了本地环境的灵活性(想用什么算法就用什么,想怎么调参就怎么调参),又榨干了GEE云端资源的红利(不用自己下载TB级的影像,不用等几个星期的本地计算)。

我自己的项目里就踩过这个坑。当时需要做高精度的森林类型细分,随机森林效果一般,想试试Bagging+决策树的组合,结果在GEE里找不到。折腾了一圈,终于摸索出了这套完整流程。实测下来,虽然步骤多了几步,但一旦跑通,效率和灵活性的提升是巨大的。下面,我就以“袋装决策树”这个具体例子,带你走一遍从本地到云端的完整技术闭环。

2. 第一步:在本地训练你的“王牌模型”

2.1 准备训练数据:从GEE导出样本点

模型训练的第一步是数据。我们的样本点(比如各种土地覆盖类型的标记点)通常是在GEE上通过目视解译或者结合已有产品生成的。这些样本以FeatureCollection的形式存在。你不能直接把这个集合丢给本地的scikit-learn,需要把它导出。

这里的关键是导出为CSV格式。我常用的方法是使用GEE Python API的geemap库,它提供了非常方便的函数。

import ee
import geemap
import pandas as pd

# 初始化GEE
ee.Initialize()
geemap.ee_initialize()

# 假设你有一个名为`sample_points`的样本FeatureCollection
# 它至少包含两个属性:'label'(类别标签,如0,1,2...)和一系列特征属性(如'B2_mean', 'NDVI_median'等)
sample_fc = ee.FeatureCollection('projects/your-project/assets/your_sample_points')

# 使用geemap将FeatureCollection转换为Pandas DataFrame
df = geemap.ee_to_pandas(sample_fc)

# 查看前几行
print(df.head())

# 将DataFrame保存为CSV文件
df.to_csv('local_training_samples.csv', index=False)

这里有个小细节要注意:GEE的FeatureCollection可能包含几何信息(geometry),但CSV格式存不了复杂的几何图形。geemap.ee_to_pandas()默认会丢弃几何列,只保留属性,这正好符合我们训练模型的需求。如果你的样本点数量巨大(几十万以上),直接导出可能会超时或内存不足。这时候可以考虑分层抽样或者分块导出,再在本地合并。

2.2 训练袋装决策树模型

数据到手后,就可以在本地施展拳脚了。我们选择scikit-learn这个Python机器学习神器。袋装决策树,其实就是BaggingClassifier以DecisionTreeClassifier作为基学习器。

import pandas as pd
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import joblib  # 用于保存模型

# 1. 加载数据
df = pd.read_csv('local_training_samples.csv')

# 2. 分离特征和标签
# 假设‘label’是目标列,其他都是特征列
X = df.drop('label', axis=1)
y = df['label']

# 3. 划分训练集和测试集(8:2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)

# 4. 创建并训练Bagging决策树模型
# n_estimators:基学习器(决策树)的数量,通常10-100之间,越多效果可能越好,但计算越慢
# max_samples:每个基学习器从训练集中抽样的比例或数量
# max_features:每个基学习器使用的最大特征数
base_tree = DecisionTreeClassifier(max_depth=10, random_state=42) # 控制单棵树的复杂度
bagging_model = BaggingClassifier(
    estimator=base_tree,
    n_estimators=50,
    max_samples=0.8,
    max_features=0.8,
    random_state=42,
    n_jobs=-1  # 使用所有CPU核心加速
)

print("开始训练模型...")
bagging_model.fit(X_train, y_train)
print("模型训练完成!")

# 5. 在测试集上评估
y_pred = bagging_model.predict(X_test)
print(classification_report(y_test, y_pred))

# 6. 保存训练好的模型
joblib.dump(bagging_model, 'bagged_decision_tree_model.pkl')
print("模型已保存为 'bagged_decision_tree_model.pkl'")

训练过程中,你可以尽情调整max_depth、n_estimators这些参数,直到模型在本地测试集上的表现让你满意。这是GEE内置算法无法给你的自由。模型保存为.pkl文件后,我们的“王牌”就铸造好了。但怎么把它送到GEE云端去打仗呢?这需要一个关键的“翻译”和“搬运”过程。

3. 第二步:架起桥梁——用GEE Python API处理模型

3.1 理解GEE的模型格式:决策树列表

GEE不能直接理解scikit-learn的.pkl文件。它内部运行的是JavaScript环境,其机器学习分类器本质上是由一系列决策规则构成的。因此,我们需要把训练好的Bagging模型(它包含了50棵决策树)转换成GEE能识别的格式。

幸运的是,geemap库的ml模块提供了一个强大的函数:ml.trees_to_classifier()。但这个函数需要输入一个决策树字典列表。所以,我们的核心任务是把BaggingClassifier对象里的每一棵DecisionTree提取出来,并转换成特定的字典结构。

这个字典需要描述一棵决策树的所有节点信息,包括:

  • nodeType: 节点是内部节点(split)还是叶节点(leaf)。
  • leftChild/rightChild: 子节点的索引。
  • splitFeature: 内部节点用于分割的特征索引(对应我们特征列表的顺序)。
  • splitValue: 分割阈值。
  • value: 叶节点的预测值(对于分类,可能是类别索引或概率分布)。

听起来很复杂?别怕,geemap的作者已经为我们考虑到了。虽然ml模块没有直接提供从BaggingClassifier转换的函数,但我们可以借鉴其源码思路,或者使用一个更直接的方法:将整个Bagging模型视为一个“黑箱”,在本地生成一个模拟的、GEE可用的决策树集合。不过,为了更精确地迁移模型,我推荐手动实现提取过程。

3.2 关键转换:从Scikit-learn模型到GEE可读格式

下面这段代码是核心中的核心,它完成了从BaggingClassifier到GEE兼容格式的转换。我把它写成了一个函数,你可以直接拿去用。

import numpy as np

def bagging_classifier_to_gee_trees(bagging_model, feature_names):
    """
    将训练好的scikit-learn BaggingClassifier转换为GEE可用的决策树字典列表。

    参数:
        bagging_model: 训练好的BaggingClassifier对象。
        feature_names: 列表,训练模型时使用的特征名称,顺序必须与X_train的列顺序一致。

    返回:
        trees: 列表,每个元素是一棵决策树的字典表示。
    """
    trees = []
    # BaggingClassifier的estimators_属性存储了所有基学习器
    for i, base_estimator in enumerate(bagging_model.estimators_):
        tree = base_estimator.tree_  # 获取底层的Tree对象

        # 初始化节点列表
        node_list = []
        # 使用栈进行深度优先遍历来构建树结构
        stack = [(0, -1, None)]  # (当前节点索引, 父节点索引, 是左孩子还是右孩子)
        while stack:
            node_id, parent_id, child_type = stack.pop()

            # 获取该节点的属性
            left_child = tree.children_left[node_id]
            right_child = tree.children_right[node_id]
            feature_idx = tree.feature[node_id]
            threshold = tree.threshold[node_id]
            value = tree.value[node_id]  # 注意:这是一个形状为(1, n_classes)的数组

            node_dict = {
                'nodeIndex': node_id,
            }

            if left_child == right_child:  # 这是一个叶节点
                # 对于分类树,value数组里是样本计数,取argmax作为预测类别
                predicted_class = np.argmax(value[0])
                node_dict['nodeType'] = 'leaf'
                node_dict['value'] = int(predicted_class)
            else:  # 这是一个内部节点(分割节点)
                node_dict['nodeType'] = 'split'
                node_dict['splitFeature'] = feature_names[feature_idx] if feature_idx >= 0 else 'None'
                node_dict['splitValue'] = float(threshold)
                node_dict['leftChild'] = int(left_child)
                node_dict['rightChild'] = int(right_child)
                # 将子节点压入栈,继续遍历
                stack.append((right_child, node_id, 'right'))
                stack.append((left_child, node_id, 'left'))

            node_list.append(node_dict)

        # 按nodeIndex排序,确保顺序正确
        node_list.sort(key=lambda x: x['nodeIndex'])
        # 移除nodeIndex键,因为GEE的格式不需要它,它通过列表索引隐含
        for node in node_list:
            node.pop('nodeIndex', None)

        trees.append(node_list)
        print(f"已转换第 {i+1}/{len(bagging_model.estimators_)} 棵树")

    return trees

如何使用这个函数:

# 假设你的特征列名如下(必须与训练数据X的列顺序完全一致!)
feature_names = ['B2_mean', 'B3_mean', 'B4_mean', 'NDVI_median', 'EVI_std']  # 替换为你的实际特征名

# 加载之前保存的模型
bagging_model = joblib.load('bagged_decision_tree_model.pkl')

# 执行转换
gee_decision_trees = bagging_classifier_to_gee_trees(bagging_model, feature_names)

print(f"成功转换了 {len(gee_decision_trees)} 棵决策树。")
print("第一棵树的前两个节点示例:", gee_decision_trees[0][:2])

转换成功后,gee_decision_trees就是一个列表,里面包含了50个列表(对应50棵树),每个子列表又由许多描述节点的字典组成。这个数据结构,就是GEE能理解的“模型语言”。

4. 第三步:上传与调用——在GEE云端激活你的模型

4.1 将模型上传至GEE资产

模型转换好了,但它还在你的本地内存里。下一步是把它“寄”到GEE的云端服务器上,成为你的一个私有资产(Asset)。我们继续使用geemap,它封装了上传FeatureCollection的便捷方法。我们需要把决策树列表包装成一个FeatureCollection,每个Feature代表一棵树或其一部分。

这里有一个更稳健的做法:将整个决策树列表作为一个属性,存储在一个单独的Feature里。

import ee
import json

# 确保已初始化
ee.Initialize()

# 1. 将决策树列表转换为可JSON序列化的格式(确保所有数字都是Python内置类型)
def prepare_trees_for_export(trees):
    # 这是一个深度复制和类型转换的过程,确保列表和字典里都是基本类型
    # 可以使用json.dumps和json.loads来净化
    trees_json_str = json.dumps(trees)
    return json.loads(trees_json_str)

exportable_trees = prepare_trees_for_export(gee_decision_trees)

# 2. 创建一个包含模型数据的Feature
# 我们将所有树的数据放在一个Feature的一个属性里,属性值可能很大
model_feature = ee.Feature(
    ee.Geometry.Point([0, 0]),  # 一个虚拟的几何位置,不重要
    {'bagged_trees': exportable_trees}  # 属性名和值
)

# 3. 创建一个只包含这一个Feature的FeatureCollection
model_fc = ee.FeatureCollection([model_feature])

# 4. 定义你要保存到的资产路径
asset_path = 'projects/your-project-name/assets/bagged_dt_model_v1'  # 替换为你的项目ID和想要的资产名称

# 5. 上传任务配置
task = ee.batch.Export.table.toAsset(
    collection=model_fc,
    description='Export_Bagged_DT_Model',
    assetId=asset_path
)
task.start()

print(f"模型上传任务已启动,任务ID: {task.id}")
print("你可以在GEE Code Editor的‘Tasks’面板中查看进度。")

上传需要一些时间,具体取决于你的模型大小(树的数量和深度)。完成后,你就能在GEE的Assets面板中看到这个名为bagged_dt_model_v1的资产了。它现在安全地存储在谷歌云上,可以被你的任何GEE脚本访问。

4.2 在GEE JavaScript或Python环境中调用模型

模型上传后,如何在GEE里用它来分类影像呢?这里有个小挑战:GEE最常用的编程环境是JavaScript(Code Editor),而我们之前用的是Python API。不过别担心,模型资产是通用的。我们可以在JavaScript环境里读取它。

但更酷的是,geemap的ml模块提供了在Python API环境中直接加载并使用这个资产的方法。假设我们有一幅准备分类的影像image_to_classify,并且已经用相同的特征波段(feature_names)处理好了。

# 在同一个Python脚本中,或新的脚本中
import ee
import geemap
from geemap import ml

ee.Initialize()
geemap.ee_initialize()

# 1. 从GEE资产加载我们上传的模型FeatureCollection
model_fc_loaded = ee.FeatureCollection('projects/your-project-name/assets/bagged_dt_model_v1')

# 2. 使用ml.fc_to_classifier函数将FeatureCollection转换为GEE分类器
# 注意:这个函数期望FeatureCollection的每个Feature代表一棵树。
# 我们上传的格式是单个Feature包含所有树,所以需要稍微调整加载逻辑。
# 更常见的做法是上传时,每棵树作为一个独立的Feature。
# 这里假设我们调整了上传逻辑,使asset中的每个Feature是一棵树的字典列表。

# 假设我们以上述“每棵树一个Feature”的方式上传了资产 `bagged_dt_model_v1_per_tree`
model_fc_per_tree = ee.FeatureCollection('projects/your-project-name/assets/bagged_dt_model_v1_per_tree')

# 使用geemap的转换函数
gee_classifier = ml.fc_to_classifier(model_fc_per_tree)

print("GEE分类器加载成功!")

# 3. 准备待分类影像
# 假设imgAllBands是已经计算好特征的影像,并且我们只选择用于分类的特征波段
feature_band_names = ['B2_mean', 'B3_mean', 'B4_mean', 'NDVI_median', 'EVI_std'] # 与训练时一致
image_for_classification = imgAllBands.select(feature_band_names)

# 4. 使用分类器进行分类!
classified_image = image_for_classification.classify(gee_classifier)

print("影像分类完成!")

如果是在GEE JavaScript Code Editor中,思路类似,但语法不同。你需要先加载资产,然后手动构建分类器。这需要你理解GEE ee.Classifier.decisionTree的构建方式,可能会更繁琐一些。这也是为什么我强烈推荐在整个流程中坚持使用GEE Python API,它能让本地和云端的衔接顺畅得多。

4.3 导出与可视化结果

分类完成后,classified_image就是一个标准的GEE Image对象,值就是预测的类别标签。你可以像操作任何GEE影像一样操作它。

# 定义可视化参数:将类别标签映射到颜色
vis_params = {
    'min': 0,
    'max': 5, # 假设你有6个类别 (0-5)
    'palette': ['red', 'green', 'blue', 'yellow', 'purple', 'gray'] # 为每个类别指定颜色
}

# 使用geemap创建交互式地图并添加图层
Map = geemap.Map()
Map.centerObject(study_area, 8) # study_area是你的研究区
Map.addLayer(classified_image, vis_params, 'Bagged DT Classification')
Map

要导出结果到Google Drive或作为GEE资产,使用ee.batch.Export:

# 导出到Google Drive
export_task = ee.batch.Export.image.toDrive(
    image=classified_image,
    description='BaggedDT_Classification_Export',
    scale=10, # 分辨率,根据你的数据调整
    region=study_area.geometry(), # 研究区范围
    fileFormat='GeoTIFF',
    maxPixels=1e9
)
export_task.start()
print(f"导出任务已启动: {export_task.id}")

5. 实战避坑指南与性能优化

走通整个流程后,你会发现几个常见的“坑”。这里我分享一些实战经验,帮你提前避开。

坑1:特征一致性是生命线。 本地训练用的特征(波段、指数、统计量)必须和云端预测时从影像中提取的特征完全一致,包括名称、顺序和计算方式。一个字节的差异都会导致模型失效。建议把特征提取过程(比如计算NDVI、EVI的公式)写成一个独立的函数,在本地数据准备和云端影像处理时调用完全相同的代码,或者至少进行严格的交叉验证。

坑2:模型复杂度与GEE限制的平衡。 GEE对单个任务的复杂度(计算量和输出大小)有限制。如果你的Bagging模型有1000棵深度为50的树,转换后的决策树列表会非常庞大,可能导致上传资产超时,或者在分类时超出计算内存。建议从适中的规模开始,比如10-50棵树,深度5-15。先在本地验证精度,再考虑增加复杂度。同时,利用GEE的image.reduceRegion或image.sample进行小范围测试,再推广到全区。

坑3:分类结果的后处理。 GEE的.classify()输出是硬分类结果。对于Bagging这类能输出概率的模型,我们其实丢失了“置信度”信息。如果你需要概率图,需要在本地训练时保存每一棵树的预测概率,然后在GEE端通过自定义函数来模拟投票过程,计算每个类别的概率。这更复杂,但信息量更大。对于大多数土地覆盖分类,硬分类结果已经足够。

性能优化建议:

  • 并行化上传: 如果树很多,可以考虑将决策树列表分成多个FeatureCollection分批上传,然后在GEE端合并或依次调用。
  • 使用GEE的ee.Classifier包装: 对于更复杂的集成方法(如Stacking),可以尝试在GEE端用JavaScript定义一个自定义的ee.Classifier,其classify方法内部调用你上传的多个决策树资产进行投票。这需要较高的GEE JavaScript编程能力,但能获得更好的集成性能。
  • 利用geemap的持续更新: geemap库非常活跃,关注其ml模块的更新,未来可能会有更直接的工具函数支持scikit-learn模型的转换。

整个过程看似步骤不少,但一旦形成脚本模板,对于新的研究区或新的模型,你只需要替换数据路径和少数参数就能快速跑起来。这种“本地训练+云端推理”的混合模式,真正打破了GEE的内置限制,让你能将自己领域知识凝聚成的最强模型,赋能于全球尺度的遥感分析。我最近的一个草原退化项目就用了这个方法,把分类精度提升了将近8个百分点,而计算时间相比下载数据到本地处理,节省了不止一个数量级。这种灵活性和效率的结合,正是现代地学研究的魅力所在。

突破GEE算法限制:本地Python训练Bagging模型云端部署实战 本文详细介绍了如何突破Google Earth Engine(GEE)原生机器学习算法的限制,通过本地Python环境训练更灵活的袋装决策树(Bagging)模型,并利用geemap工具将其序列化后部署至GEE云端。该方法结合了本地算法调优的自由度与GEE处理海量遥感数据的能力,为遥感影像分类等任务提供了强大的解决方案。 阅读详情

相关推荐

遥感变化检测实战:GIS、机器学习与GEE端到端工作流

变化检测是遥感与地理信息系统(GIS)交叉领域的核心任务,旨在从多时相卫星影像中识别地表物理状态的动态演变。其技术原理涵盖辐射定标校正、光谱特征建模、空间上下文理解及不确定性量化,依托机器学习实现从像素级差异计算到场景级语义判别的范式升级。该技术具备显著工程价值——提升城市更新监管精度、支撑生态退化预警、赋能农业灾害响应与保险定损自动化。典型应用场景包括违建识别、湿地萎缩监测、农田病害蔓延追踪等。本文聚焦地理信息从业者真实工作流,深度融合Sentinel-2/Landsat影像、Google Earth E

weixin_30897079的博客 138

【深度学习项目】基于YOLOv8的鸟类动物识别检测系统的设计与实现,支持图片、视频、摄像头实时检测三种形式

【深度学习项目】基于YOLOv8的鸟类动物识别检测系统的设计与实现,支持图片、视频、摄像头实时检测三种形式

m0_72599287的博客 1014

随机森林实现遥感影像像素级分类实战

像素级分类是遥感地物识别的基础技术,其核心在于将每个像元作为独立样本,基于光谱特征(如NDVI、B08近红外波段)建模判别地表覆盖类型。该方法不依赖深度学习框架,原理清晰、可解释性强,特别适合农业遥感等中小样本场景。技术价值体现在本地化部署能力、低硬件门槛与高结果可复现性,广泛应用于农田识别、盐碱地监测、绿洲动态评估等业务。本文以阿尔及利亚El Oued地区Sentinel-2影像为数据源,完整呈现从数据下载、坐标系对齐、纹理与几何特征工程,到Random Forest建模与GeoTIFF输出的端到端流程,

dibeichan3033的博客 559

基于YOLOv8动物鸟类识别系统 基于深度学习的鸟类智能识别方法研究 基于卷积神经网络的鸟类识别研究

本文基于YOLOv8深度学习框架开发了一套智能化鸟类识别系统,旨在解决传统人工监测效率低、专业性要求高等问题。系统支持图片和视频上传识别,提供多类别检测结果及置信度分析,并集成鸟类百科数据库展示详细物种信息。技术实现涵盖前端交互、后端服务和YOLOv8推理引擎,具有识别记录管理、模型训练优化等功能模块。该系统可应用于生态保护、科研教育等领域,为生物多样性监测提供高效工具,降低专业门槛,促进AI技术在野生动物监测中的实际应用。

m0_72599287的博客 748

SAP-ABAP:SAP ABAP 深度解析:BAPI 从入门到精通 —— 原理、实战与自定义开发全指南

SAP ABAP BAPI 深度解析摘要 本文全面介绍了 SAP ABAP 中的 BAPI(业务应用程序编程接口)技术,涵盖以下核心内容: BAPI 定义与特点:BAPI 是 SAP 为业务对象提供的标准化编程接口,具有面向对象、封装业务逻辑、标准化错误处理和版本兼容性等特点。 BAPI 与 RFC 关系:所有 BAPI 都是 RFC,但需额外满足业务对象注册、标准化参数和错误处理等要求。 BAPI 核心作用:包括业务逻辑封装、系统集成、标准化错误处理、版本兼容和审计合规。 实战演示:通过创建销售订单的完整

baidu_35680696的博客 1033

从零开始:使用Mask2Former训练你的专属图像分割数据集

本文详细介绍了如何使用Mask2Former训练自定义图像分割数据集,从环境配置、数据集准备到模型训练与优化。通过实战技巧和问题排查指南,帮助开发者高效完成从零开始的图像分割任务,特别适合需要处理自定义数据集的AI研究人员和工程师。

weixin_30566063的博客 642

GIS与交通融合实战:从空间数据到智能决策的完整项目指南

地理信息系统(GIS)的核心在于对空间数据进行采集、管理与分析,其原理是通过对点、线、面等地理对象的几何与拓扑关系建模,实现对现实世界的数字化映射。这一技术价值在于将静态的空间信息转化为可计算、可分析的结构化知识,从而支撑科学的决策。在工程实践中,GIS与交通工程的交叉融合,催生了网络分析、时空数据挖掘等关键技术,广泛应用于智慧城市、物流优化与自动驾驶等场景。本文聚焦于GIS开发与交通数据分析,通过一个完整的“交通事故热点分析”实战项目,系统演示了如何利用Geopandas、OSMnx等工具链,将空间统计理

weixin_30267785的博客 354

从零到一:RT-Thread与W5500的硬件抽象层设计哲学与实践启示

本文深入探讨了RT-Thread操作系统下W5500以太网模块的硬件抽象层(HAL)设计哲学与实践。通过GD32F103和STM32F103平台的适配案例,详细阐述了如何利用RT-Thread的驱动框架实现跨平台硬件无关性、模块化设计及配置定制,为嵌入式开发者提供了可复用的HAL设计方法论和实战经验。

7z8x2c4v6b9的博客 197

【机器学习300问】139、Post-LN 和 Pre-LN 的区别?

Post-LN与Pre-LN的核心区别在于LayerNorm的位置:Post-LN在残差连接后,导致梯度需经LayerNorm变换,深层易出现梯度衰减或震荡;Pre-LN先做归一化,使输入稳定,残差路径梯度可无损回传,显著提升深层训练稳定性。尽管Pre-LN支持更深层次模型(如LLaMA、Qwen),但存在“深度诅咒”——深层贡献不足。相比之下,Post-LN浅层表现尚可,深层数易发散。因此,现代大模型普遍采用Pre-LN以保障训练可靠性。

qq_39780701的博客 394

多源异构数据融合(Kaggle+Google Trends联合分析)

本文详细介绍了如何利用Python实现多源异构数据融合,以Kaggle电商销售数据与Google Trends搜索指数为例,展示了数据清洗、预处理、时间对齐、数据合并、相关性分析、回归建模和可视化全过程。数据预处理与内存优化通过分块加载、数据类型转换和缺失值处理,有效降低了大规模数据在内存中的占用,并确保数据质量。时间对齐与数据融合策略采用重采样与内连接方法对齐不同数据源的时间维度,实现了高质量数据的融合,为后续联合分析奠定基础。模型构建与分析。

闲人编程的博客 1016

uniapp - H5网页uni.getLocation报错getLocation:fail Geolocation permission denied.Get ipLocation failed.

uni.getLocation getLocation:fail Geolocation permission denied.Get ipLocation failed.,uni.getLocation定位失败,uni-app getLocation()无法获取定位,一直fail()uniapp移动端h5网页,uniApp微信内置浏览器定位失败,如何解决这个问题,uniapp h5 uni.getLocation获取位置失败怎么办,UNI-APP获取当前位置,uni.getLocation定位失败,unia

🏆 前端领域优质创作者 4241

Hugging Face:成为机器学习界的“Github”

以下文章来源于OneFlow,作者OneFlow社区五年前,AI领域的知名研究者Andrej Karpathy发文称,传统人工编程属于“软件1.0”,“软件2

2601_96798011的博客 122

EMC意义下的共模(Common Mode)和差模(Differential Mode)

在电子产品中,信号或电源通过两根导线传输。对比维度差模(DM)共模(CM)电流方向一进一出,相等相反同向、相等回流路径两根导线组成的闭合回路地或外壳EMC影响较小容易辐射干扰,重点治理类型定义有用信号干扰信号抑制方法常规滤波器、电感、电容共模电感、磁环、屏蔽、接地技术等。

weixin_43199439的博客 1247

机器学习基础|监督学习、标签、回归

网约车预估等待时长依赖监督学习中的回归任务。平台利用历史订单数据,以司机实际到达耗时为标签,通过上车点、时间、运力、路况等特征训练模型。模型不断优化预测值与真实耗时的误差,最终对新订单输出连续的预估等待时间,实现精准预测。

weixin_43971465的博客 234

MFC Windows 程序设计[122]之树形下拉列表框(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。.........

hnjzfwy的博客 458

YOLOv11 改进 - 注意力机制 | HaloNet 局部自注意力 (Local Self-Attention) 以分块交互策略实现高效全局上下文建模

本文介绍了局部自注意力机制(HaloAttention)在YOLOv11中的结合应用。局部自注意力通过关注输入数据局部区域来捕捉特征关系,能降低计算复杂度、增强局部特征捕捉,且可与CNN结合。其计算时先定义局部窗口,再计算注意力权重并加权求和。我们将HaloAttention集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,改进后的模型在目标检测和实例分割等任务中表现更佳,证明了自注意力模型在传统卷积主导领域的有效性。

魔改工程师的博客 1142

为什么生成对抗网络训练常不稳定,模式崩溃与判别器过强之间是什么关系?

当支持集不重叠时(即 $D$ 能完美区分真假),JS 散度为常数 $\log 2$,其梯度为 0。这意味着一旦 $D$ 训练得稍好,$G$ 就失去了学习方向,导致训练停滞。生成对抗网络(GAN)的训练本质上是生成器($G$)与判别器($D$)之间的非合作零和博弈。以下代码展示了如何通过梯度惩罚(Gradient Penalty)来约束判别器,避免其过强导致生成器梯度失效。判别器过强是导致模式崩溃的直接诱因之一,二者之间存在明确的**“梯度误导”**因果关系。

2402_84593233的博客 204

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

AI 是怎样从数据中学习的?训练、验证、测试与推理

泛化能力(Generalization)指模型面对训练过程中没有见过的新数据时,仍然能够做出合理预测的能力。这是判断模型是否具有实际应用价值的重要标准。例如:一个用户流失预测模型,在历史数据上表现很好,但面对新上线的用户群体时,预测准确率明显下降。这可能说明模型学到的规律无法适应新的用户群体。泛化能力不仅取决于模型本身,也与训练数据是否具有代表性有关。训练数据只包含老用户,没有新用户。训练数据主要来自某个地区,实际业务却覆盖不同地区。过去的用户行为与当前用户行为已经发生变化。

dshizixu的博客 308

假人有限元模型

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

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spark06_MLlib机器学习

本文是《PySpark 从入门到实战》系列收官篇,带你用 Spark MLlib 走通机器学习全流程:从三要素与 7 步标准流程讲起,剖析 KNN、朴素贝叶斯、决策树三大算法原理,再以 KNN 手写、垃圾短信分类、决策树分类、逻辑回归鸢尾花(准确率 96.67%)、K-Means 聚类(轮廓系数 0.7345)五个案例落地,最后详解 TF-IDF 文本特征与余弦相似度。全文代码可直接运行,适合有 RDD 与 Spark SQL 基础的开发者快速上手。

2301_80420058的博客 444

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

机器学习教程,从入门到精通,高斯混合模型(GMM)——写给机器学习小白的保姆级教程(10)

高斯混合模型(Gaussian Mixture Model,简称 GMM):假设你手里的数据是由"好几堆正态分布的数据混在一起"形成的,GMM 的任务就是——把这几堆分开,并且描述清楚每一堆的样子。

qq_45746668的博客 117

【人工智能驱动的电催化研究-01】人工智能是什么?AI、机器学习、深度学习和神经网络之间有什么区别?

介绍人工智能、机器学习、神经网络和深度学习的基本概念及相互关系。围绕催化剂性能预测,解释样本、特征、标签、模型、参数、训练、预测与验证的含义。结合二硫化钼边缘位点与析氢活性的研究案例,说明科学问题如何指导特征选择。利用真实文献中的析氢数据,通过手算和Python实践,对比人工规则与均值模型,理解参数学习和误差评价。强调数据学习不保证预测更优,相关性不能直接证明反应机理,文献数据还须核查实验条件与适用范围,为后续编程、数学和电催化机器学习课程建立基础。

2402_84593233的博客 789

机器学习01,KNN使用与简单数学原理

个人笔记

qq_59247073的博客 260

AI小白入门|无监督学习到底是什么?

很多新手看完无监督学习的定义只会死记硬背。本文避开复杂公式,从真实业务场景切入,对比监督学习,讲清楚无监督学习的核心价值、适用场景、底层逻辑和容易踩坑的认知误区,帮你理解它在机器学习链路里的定位。

weixin_43971465的博客 178

机器学习01,了解与KNN

个人笔记

qq_59247073的博客 357

【slam公式】

F:状态转移矩阵H:观测矩阵R: 观测噪声协方差。

qq_44691564的博客 322

机器学习-支持向量机

本文通过多个案例深入解析SVM在二分类、多分类及高维文本数据中的应用。基于乳腺癌数据集,构建标准化+SVM的流水线,结合网格搜索优化C与gamma参数,实现98.02%的测试准确率。通过交叉验证评估模型稳定性,结果显示标准差仅0.0162,表明模型鲁棒性强。引入probability=True后,可输出预测概率,揭示模型不确定性(如样本4的52%良性概率),助力医疗决策。结果表明,特征维度提升需调小gamma、增大C以适应复杂数据,凸显参数与数据特性的交互关系。

buwangchuxinking的博客 342
上一篇: 用Python模拟BGP路由选择算法:从考研真题到可运行代码
下一篇: 【半导体先进工艺制程技术系列】HKMG工艺的挑战与演进(下)
raspberrypi5
博客等级 码龄1天 0粉丝 1856原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值