PHP函数库大升级,PHP 8.7新增函数用法全曝光,错过等一年

SpikeCV:脉冲视觉全栈开源平台,从事件相机到连续视觉算法实战 计算机视觉的核心在于如何高效、准确地感知和理解动态世界。传统基于帧的视觉系统受限于固定的采样率和曝光时间,在处理高速运动、高动态范围或低光照场景时面临挑战。其原理是将连续时间的光信号离散化为一系列静态图像,这导致了时间维度上信息的丢失。为了突破这一局限,脉冲视觉(或称事件相机、神经形态视觉)技术应运而生,它模仿生物视网膜的工作方式,以异步、稀疏的“事件流”形式捕捉像素级的亮度变化,实现了微秒级的时间分辨率和极高的动态范围。这项技术的核心价值在于为高速、高动态的连续视觉感知提供了全新的解决方案,在自动驾驶、高 阅读详情

第一章:PHP 8.7 新增函数概览

PHP 8.7 作为 PHP 语言演进中的重要版本,引入了一系列新增函数,旨在提升开发效率、增强类型安全并优化性能表现。这些函数覆盖了字符串处理、数组操作、类型判断以及异步支持等多个方面,为开发者提供了更现代化的编程体验。

字符串与类型处理增强

PHP 8.7 引入了 str_contains_any() 和 str_contains_all() 函数,用于简化多关键词匹配逻辑。此外,is_scalar_type() 函数可用于判断变量是否属于标量类型,包括新增的 never 和 null 类型联合体场景。
// 判断字符串是否包含任意指定子串
if (str_contains_any($text, ['error', 'fail', 'exception'])) {
    // 处理错误信息
}

// 检查变量是否为标量类型
var_dump(is_scalar_type(42));        // true
var_dump(is_scalar_type([]));        // false

数组操作新工具

新增 array_flatten_recursive() 函数支持深度扁平化嵌套数组,替代以往需递归实现的复杂逻辑。
  • array_validate():批量验证数组元素是否符合指定回调条件
  • array_map_keys():允许对键名进行映射转换
  • array_without_keys():基于键名列表移除元素

异步与并发支持扩展

PHP 8.7 实验性引入 async_first() 函数,用于在多个异步任务中获取最先完成的结果,适用于超时控制或竞态请求场景。
函数名用途描述稳定性
str_starts_i()不区分大小写的前缀判断稳定
async_first()返回首个完成的 Promise实验性
这些新增函数体现了 PHP 向现代语言特性的靠拢,尤其在可读性和功能性之间取得了更好平衡。

第二章:字符串处理函数的全面升级

2.1 str_contains_any:高效检测多关键词匹配原理与应用

在处理文本过滤、敏感词识别等场景时,`str_contains_any` 提供了一种高效的多关键词匹配机制。其核心思想是通过预构建关键词集合,利用哈希表实现 O(1) 的单次查询复杂度。
算法逻辑实现
func str_contains_any(s string, keywords []string) bool {
    lookup := make(map[string]struct{})
    for _, k := range keywords {
        lookup[k] = struct{}{}
    }
    for _, k := range keywords {
        if strings.Contains(s, k) {
            return true
        }
    }
    return false
}
该函数将关键词数组转为哈希集,提升查找效率。虽然仍遍历关键词列表,但可通过引入 Aho-Corasick 算法进一步优化为单次扫描文本。
性能对比
方法时间复杂度适用场景
逐个strings.ContainsO(n*m)关键词少、文本短
str_contains_any + 哈希O(m)中等规模关键词
Aho-Corasick 自动机O(n)大规模关键词库

2.2 str_starts_not_with:反向前缀判断的实际使用场景

在系统日志过滤中,str_starts_not_with 常用于排除特定前缀的调试信息,提升关键错误的识别效率。
典型应用场景
  • 屏蔽以 DEBUG 开头的日志条目
  • 过滤测试环境中的模拟请求路径
  • 跳过第三方库的冗余加载提示
// 判断字符串是否不以指定前缀开头
func str_starts_not_with(s, prefix string) bool {
    return !strings.HasPrefix(s, prefix)
}

// 示例:过滤非错误日志
if str_starts_not_with(logLine, "ERROR") {
    continue // 跳过非错误行
}
该函数逻辑简洁:利用 strings.HasPrefix 判断前缀存在性,再通过布尔取反实现“不以……开头”的语义。参数 s 为待检测字符串,prefix 为排除前缀,返回值为是否满足反向前缀条件。

2.3 str_ends_not_with:解决常见后缀排除逻辑的代码优化

在处理字符串匹配逻辑时,常需排除特定后缀的文件或路径。传统写法往往通过 `!strings.HasSuffix()` 实现,但重复模式易导致代码冗余。
基础用法示例
func str_ends_not_with(s, suffix string) bool {
    return !strings.HasSuffix(s, suffix)
}

// 使用示例
fmt.Println(str_ends_not_with("config.json", ".tmp")) // true
该函数封装取反逻辑,提升语义清晰度。参数 `s` 为目标字符串,`suffix` 为待排除后缀,返回是否**不以该后缀结尾**。
批量过滤场景优化
  • 结合 filter 模式统一处理切片
  • 避免在循环中重复书写否定条件
  • 增强可读性,明确“排除意图”

2.4 str_replace_first:首次匹配替换在文本处理中的实践

核心功能解析

str_replace_first 是一种精准控制字符串替换行为的工具,仅对首次匹配项进行替换,避免全局替换带来的副作用。该函数广泛应用于日志清理、模板渲染和配置注入等场景。

func strReplaceFirst(s, old, new string) string {
    i := strings.Index(s, old)
    if i == -1 {
        return s
    }
    return s[:i] + new + s[i+len(old):]
}

上述实现通过 strings.Index 定位首个匹配位置,若未找到则返回原串;否则拼接前缀、新字符串与剩余部分,确保仅一次替换。

典型应用场景
  • 配置文件中首次出现的占位符替换
  • 日志脱敏时仅隐藏首个敏感信息
  • 模板引擎中控制变量单次注入

2.5 str_replace_last:精准控制最后一次替换的操作技巧

在处理字符串时,常规的 `str_replace` 会替换所有匹配项,但有时我们仅需修改最后一次出现的位置。`str_replace_last` 正是为此设计,它确保只对最末一次匹配执行替换,适用于路径修正、协议补全等场景。
函数实现逻辑

function str_replace_last($search, $replace, $subject) {
    $pos = strrpos($subject, $search);
    if ($pos !== false) {
        return substr_replace($subject, $replace, $pos, strlen($search));
    }
    return $subject;
}
该函数首先使用 `strrpos` 定位最后一次匹配的起始位置,再通过 `substr_replace` 在指定位置进行替换。参数说明: - `$search`:待查找的子串; - `$replace`:用于替换的新字符串; - `$subject`:原始字符串。
典型应用场景
  • URL 路径末尾斜杠的统一处理
  • 日志文件中最后一次错误码的标记
  • 模板引擎中闭合标签的精准替换

第三章:数组操作函数的增强能力

3.1 array_zip_strict:严格模式下数组合并的理论基础

在处理多个数组的同步操作时,`array_zip_strict` 提供了一种确保结构一致性的合并机制。该函数要求所有输入数组具有相同的长度,否则抛出错误,从而避免隐式截断或填充带来的数据歧义。
核心行为特征
  • 输入数组必须等长,否则触发异常
  • 按索引位置逐项组合,生成元组序列
  • 支持任意数量的输入数组
代码实现示例
func array_zip_strict(arrays ...[]interface{}) ([][]interface{}, error) {
    if len(arrays) == 0 {
        return [][]interface{}{}, nil
    }
    length := len(arrays[0])
    for _, arr := range arrays {
        if len(arr) != length {
            return nil, errors.New("arrays must have equal length")
        }
    }
    result := make([][]interface{}, length)
    for i := 0; i < length; i++ {
        tuple := make([]interface{}, len(arrays))
        for j, arr := range arrays {
            tuple[j] = arr[i]
        }
        result[i] = tuple
    }
    return result, nil
}
上述函数首先校验所有数组长度一致性,随后按索引构造元组。参数 `arrays` 为可变参数,允许传入多个切片;返回值为二维切片及可能的错误。该设计保障了数据对齐的严谨性,适用于金融对账、配置比对等高一致性需求场景。

3.2 array_filter_keys:基于键名过滤的实战案例解析

在处理复杂数据结构时,常需根据键名而非值进行数组过滤。PHP 原生未提供直接按键过滤的函数,但可通过 `array_filter` 结合 `array_keys` 实现高效筛选。
自定义实现 array_filter_keys

function array_filter_keys($array, $callback) {
    return array_intersect_key(
        $array,
        array_filter(array_keys($array), $callback)
    );
}
// 示例:提取以 'user_' 开头的键
$data = ['user_name' => 'Alice', 'age' => 25, 'user_role' => 'admin'];
$result = array_filter_keys($data, function($k) {
    return str_starts_with($k, 'user_');
});
// 输出: ['user_name' => 'Alice', 'user_role' => 'admin']
上述代码利用 `array_filter` 对键名数组应用回调,再通过 `array_intersect_key` 保留原始数组中匹配的项。该方式避免了显式循环,提升代码可读性与维护性。
典型应用场景
  • API 请求参数清洗:仅保留特定前缀的字段
  • 配置项分组提取:如从全局配置中筛选数据库相关设置
  • 表单数据映射:将输入按模块前缀拆分处理

3.3 array_shuffle_assoc:关联数组随机重排的安全实现

在处理PHP关联数组时,`shuffle()`函数无法保留键值映射关系,导致数据结构破坏。为此,需要实现一个既能打乱顺序又保持键值关联的解决方案。
安全的关联数组重排函数

function array_shuffle_assoc($array) {
    $keys = array_keys($array);
    shuffle($keys);
    $shuffled = [];
    foreach ($keys as $key) {
        $shuffled[$key] = $array[$key];
    }
    return $shuffled;
}
该函数首先提取原数组的所有键,通过`shuffle()`打乱键的顺序,再按新顺序重建数组。此方法确保键值对完整保留,同时实现元素位置的真正随机化。
应用场景对比
场景使用 shuffle()使用 array_shuffle_assoc()
索引数组✅ 支持⚠️ 可用但冗余
关联数组❌ 键丢失✅ 安全重排

第四章:数学与类型处理新函数详解

4.1 math_average:多种数据源下的平均值计算实践

在现代数据处理场景中,平均值计算常需面对多样化的数据源,如数组、数据库查询结果及实时流数据。为确保计算的通用性与高效性,需设计统一的抽象接口。
基础实现:从切片计算平均值

func Average(nums []float64) float64 {
    if len(nums) == 0 {
        return 0
    }
    var sum float64
    for _, v := range nums {
        sum += v
    }
    return sum / float64(len(nums))
}
该函数接收一个浮点数切片,遍历求和后除以元素个数。时间复杂度为 O(n),适用于内存中结构化数据。
多源适配策略
  • 数据库结果集:通过迭代器逐行读取数值并累计
  • HTTP 流数据:使用 channel 实时接收并更新滑动窗口平均值
  • JSON 文件:解析后提取数值字段构建切片

4.2 math_is_finite_number:精确判断有效数值类型的使用方法

在处理浮点数或科学计算时,确保数值的“有限性”至关重要。`math_is_finite_number` 提供了一种可靠方式来判断一个数值是否为有效的有限数,排除无穷大和 NaN 的干扰。
函数基本用法
import math

def is_valid_number(x):
    return math.isfinite(x)

# 示例
print(is_valid_number(3.14))    # True
print(is_valid_number(float('inf')))  # False
print(is_valid_number(float('nan')))  # False
该函数接收单一数值参数 x,内部调用 C 库的 `isfinite()` 宏进行底层判断,返回布尔值。仅当 x 为有限数(即绝对值小于无穷)时返回 True。
典型应用场景
  • 数据清洗中过滤非法数值
  • 数学建模前的输入校验
  • 避免除零或溢出导致的计算错误

4.3 type_get_name_advanced:扩展类型推断机制的应用探索

在复杂系统中,基础类型推断已难以满足动态上下文需求。`type_get_name_advanced` 通过引入上下文感知与泛型解析,显著增强类型识别能力。
核心实现逻辑

func type_get_name_advanced(v interface{}, ctx Context) string {
    if t := ctx.ResolveType(v); t != nil {
        return t.Name()
    }
    return reflect.TypeOf(v).String()
}
该函数接收值和上下文对象,优先使用上下文中的类型映射表进行解析,回退至反射机制。`ctx.ResolveType` 支持泛型绑定与别名转换。
应用场景对比
场景基础推断高级推断
泛型函数interface{}具体实例化类型
别名类型原始类型名保留别名语义

4.4 type_validate_strict:严格模式下变量校验的工程价值

在大型系统开发中,数据类型的准确性直接影响运行时稳定性。type_validate_strict 提供了一种强制类型校验机制,有效拦截潜在类型错误。
核心应用场景
  • 微服务间接口参数校验
  • 配置中心动态配置解析
  • 跨语言通信的数据结构一致性保障
代码示例与分析
func ValidateStrict(v interface{}) error {
    t := reflect.TypeOf(v)
    if t.Kind() == reflect.Ptr || t.Kind() == reflect.Interface {
        return fmt.Errorf("strict mode prohibits pointer and interface types")
    }
    return nil
}
该函数通过反射拒绝指针和接口类型输入,确保传入值为具体类型。在配置解析等场景中可防止因引用导致的意外状态共享。
校验模式对比
模式允许指针允许接口适用场景
宽松模式是是原型开发
严格模式否否生产环境

第五章:未来展望与迁移建议

随着云原生生态的持续演进,Kubernetes 已成为容器编排的事实标准。企业级应用正加速向 Kubernetes 平台迁移,未来系统架构将更倾向于微服务化、声明式配置与自动化运维。
技术演进趋势
Service Mesh 技术如 Istio 和 Linkerd 正在重塑服务间通信模式。零信任安全模型、可观测性增强(如 OpenTelemetry 集成)将成为默认实践。以下代码展示了在 Go 应用中集成 OpenTelemetry 的基本方式:

package main

import (
    "go.opentelemetry.io/otel"
    "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
    "go.opentelemetry.io/otel/sdk/trace"
)

func initTracer() {
    exporter, _ := otlptracegrpc.New(context.Background())
    tp := trace.NewTracerProvider(trace.WithBatcher(exporter))
    otel.SetTracerProvider(tp)
}
迁移路径建议
对于传统虚拟机部署的应用,推荐采用渐进式迁移策略:
  • 先将无状态服务容器化并部署至测试集群
  • 使用 Helm 管理应用模板,统一部署流程
  • 逐步引入 CI/CD 流水线,实现 GitOps 运维模式
  • 通过 Flagger 实现金丝雀发布,降低上线风险
架构决策参考
场景推荐方案工具链
日志收集集中式采集Fluent Bit + Loki
配置管理ConfigMap + External SecretsSecrets Store CSI Driver

用户请求 → Ingress Controller → Service Mesh 边车 → 微服务实例 → 后端存储

大寒遇上乙巳年:雪天围炉煮茶与出行实用指南 二十四节气中的大寒,通常在公历1月20日前后,太阳到达黄经300度,是北半球一年中最冷的时间窗口。其寒冷程度与地面热量释放的滞后效应有关,南北地区因陆海热力差异呈现出不同低温峰值。而2025年恰逢干支纪年中的乙巳年,乙木生巳火,传统五行意象赋予了这个寒冬一种向上流动的文化隐喻。理解节气与干支背后的运行逻辑,不仅有助于感知传统时间智慧,更能指导现实生活——从雪天围炉煮茶的炉具选择、炭火技巧到冬日热饮配方,从手机雪景拍摄的曝光补偿到分层穿衣与防滑行走细节,这些基于自然规律与亲身验证的实操方法,均可在最冷的时节帮 阅读详情

相关推荐

从冰棍到铸钢:手把手用Fluent融化凝固模型模拟3个不同场景(含案例设置对比)

本文深入探讨了Fluent融化凝固模型在冰棍融化、巧克力涂层凝固和钢铁连铸三个不同场景中的应用。通过详细的参数设置和案例对比,帮助工程师掌握相变模拟的核心技巧,提升工业级CFD分析的精度和效率。

weixin_42522953的博客 471

错过Laravel等于错过未来?:PHP开发者转型进阶的稀缺机会曝光

掌握PHP开发进阶利器,php框架推荐Laravel因其优雅语法与强大生态广受青睐,适用于Web应用、API开发及企业级项目。内置MVC支持、高效路由与丰富扩展包,显著提升开发效率。错过Laravel等于错过未来,值得收藏深入学习。

BytePulse的博客 962

智能体在车联网中的应用:第9天 核心工具链与仿真世界:SUMO交通仿真入门——从安装到构建你的第一个虚拟十字路口

摘要 SUMO是一款开源微观交通仿真工具,为车联网和自动驾驶算法开发提供高效安全的测试环境。文章详细介绍了SUMO的核心概念、安装方法及实战应用。在Ubuntu或Windows系统安装SUMO后,可通过netedit工具构建十字路口路网,包括创建节点、连接边、设置交通信号灯等步骤。随后通过编写.rou.xml文件定义车辆类型、路线和车流,实现动态交通场景模拟。SUMO支持与外部程序交互,能复现真实场景、进行极端测试和算法验证,是车联网研究的理想数字沙盘。

IT深耕十余载,大道之简 1451

PHP 8.6 JIT编译器重大升级(指令优化黑科技曝光)

PHP 8.6 的 JIT 指令优化显著提升执行效率,通过精细化指令流重组与热点代码动态编译,优化高频业务场景性能。适用于高并发Web服务与复杂逻辑应用,降低响应延迟。核心优势在于更智能的编译策略与资源利用率,值得收藏并点击了解技术细节。

FuncWander的博客 1024

基于ESP32-WROOM的智能蓝牙电压电流监测与远程控制系统设计

本文介绍了基于ESP32-WROOM的智能蓝牙电压电流监测与远程控制系统设计。该系统集成了INA219传感器和OLED显示屏,通过蓝牙实现无线数据传输和远程控制,适用于智能家居能耗监控和工业设备管理,具有成本低、精度高、功耗优化等优点。

qsc901234的博客 203

普冉(PUYA)单片机开发笔记 [完结篇]:使用体会

这一篇是 PY32F003 应用实验的完结篇,总结了对这颗 MCU 的使用体会。我已经把自己实验用的代码打包上传,供各位码神参考。

Tomcat0130 - 代码生涯 9597

别再错过!低代码平台的隐藏亮点曝光

低代码平台在企业数字化进程中发挥着关键作用,其亮点众多。它具备高效的可视化开发能力,像Gadmin企业级开发平台,通过简单的拖拽和配置,就能快速搭建应用程序界面与业务逻辑,大幅节省开发时间。丰富的模板与组件库也是一大特色,涵盖各类常见业务场景,企业可按需定制。从应用优势看,能提高开发效率、缩短交付周期,传统开发需数月的工作流,低代码平台仅需几天。

LiuZhiYun_01的博客 653

RTK_ROS_导航(4):接入move_base

现在我们要将之前的数据接入到Move_base中,使得机器人能够根据Map上的终点进行导航,并且实现避障效果如下图。

旋风小短腿 1946

php2014_2014年6月PHP可能遗漏的内容

php2014Continuing the News You May Have Missed tradition, we’re once again aggregating the latest web development related news that may have flown under your radar. We’ll be changing the title format ...

culi4814的博客 190

YOLO11涨点优化:注意力魔改 | 引入Deformable Attention (可变形注意力),灵活感受野自适应复杂形变目标

Deformable Attention为YOLO11带来的不仅是2.6个百分点的mAP提升,更是一种全新的“形变感知”范式。标准卷积的固定感受野在非刚性目标、多尺度变化和遮挡场景下力不从心——Deformable Attention恰好填补了这一空白。从架构设计到代码实现,从竞品对比到部署方案,从生态工具到安全风险,本文覆盖了将Deformable Attention引入YOLO11所需的全部知识链路。

2601_95807009的博客 284

Moviepy自动化剪辑视频中的广告

本教程展示了如何使用 Python 中的 MoviePy 库,通过检测和剪辑广告段落来实现视频内容的清洁播放。通过广告检测算法和 MoviePy 剪辑功能的结合,可以自动化处理视频,极大提升编辑效率。在学习和应用中,理解广告检测的原理及其实现方法尤为重要,以便针对不同类型的视频进行调整。此外,MoviePy 的灵活性使其适用于多种视频编辑场景,适合自动化内容制作与优化。

Mr数据杨 3409

PHP SEO:提升网站排名的利器

PHP SEO:提升网站排名的利器 在当今的数字时代,搜索引擎优化(SEO)对于任何网站的成功至关重要。为了帮助开发者更好地进行页面SEO优化,我们推荐一个强大的开源项目——PHP SEO。这个项目提供了一系列简单而高效的功能,帮助你的网站在搜索引擎中脱颖而出。 项目介绍 PHP SEO 是一个轻量级的PHP库,旨在帮助开发者进行更好的页面SEO优化。它提供了生成schema.org ld+jso...

gitblog_01058的博客 289

【WRF理论第十五期】WPS中输入geogrid二进制格式

WPS中输入geogrid二进制格式

WW、forever的博客 1078

php 怎么判断月份最后一天_2019年的最后一天,你打算怎么过?

跨年之夜,不要给自己留下遗憾,不如大胆去约你心里最重要的那个人一起看场电影吧。在银幕前紧紧握住TA的手,许下新年愿望。刚好今天赶在跨年夜上映的三部影片,都不容错过。《宠爱》这算得上是最近呼声很高的一部影片,由徐峥监制,大牌云集,未播先火。从已经曝光的预告片来看,整部影片由六个关于宠物的有爱小故事组成:不善表达的父女于和伟和李兰迪。青梅竹马吴磊和张子枫。热恋情侣钟汉良和杨子姗。新婚夫妇陈伟霆和钟楚曦...

weixin_39790102的博客 461

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深度学习工具包 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'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('DeepLearnToolbox'));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('state',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'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',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 = 'sigm';%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, 'Too big error');```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('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';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)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';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, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% 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'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 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, 'Too big error');```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('state',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, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',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, 'Too big error');%% ex3 neural net with dropoutrand('state',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, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % 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, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % 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, 'Too big error');%% 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('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % 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, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

PHP获取朋友圈封面,用这 3 招做朋友圈封面,绝对独一无二!| 领客专栏 · 微信时刻...

A 君注:领客专栏又有新的伙伴:WeChatMoments,接下来他们会在 AppSo 分享更多玩转微信的技巧,喜欢的朋友不要错过啦。今天这篇文章教你 3 招用 app 制作独一无二的朋友圈封面图:文艺、魔性、搞怪,无论你是什么风格都能用。(微信号 appsolution 后台回复「微信」可查看往期玩转微信的技巧文章)话说,自从 WeChatMoments 上次科普了如何用微信拜年之后,转眼又是开...

weixin_30995967的博客 556

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

程序员“利器”哪家强?园区小伙伴装备大曝光……

这个群体,看起来很闷,其实内心很嗨!他们早出晚归,披星戴月,用代码改变世界!这个群体,爱编程,不爱修电脑;爱学习,也爱运动;爱科技,也爱娱乐;爱工作、爱生活、不爱加班。爱...

爱编程 763

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

2024 年 8 月编程语言排行榜!

戳下方名片,关注并星标!回复“1024”获取2TB学习资源!????体系化学习:运维工程师打怪升级进阶之路 4.0— 特色专栏—MySQL/PostgreSQL/MongoDBElasticSearch/Hadoop/RedisKubernetes/Docker/DevOpsKafka/RabbitMQ/Zookeeper监控平台/应用与服务/集群管理N...

民工哥的博客 638

灵活用工新时代|“星工人”平台开启零工经济全新体验

摘要:"星工人"灵活用工平台基于Linux+Nginx/PHP/MySQL技术栈,采用Uniapp实现微信小程序、安卓/iOS APP、H5四端覆盖,为临时用工场景提供智能对接服务。平台聚焦短期用工需求,包含学生兼职、日结零工、技术工种等细分领域,通过LBS匹配、信用评价、积分激励等创新功能提升撮合效率。后端采用OpenResty+PHP8.1高性能架构,支持实名认证、工种分类、数据统计分析等管理功能,实现用工方与工人高效对接。典型应用场景包括暑假工匹配、餐饮零工、技术工种招聘等,致力于

1054

php59元,59元/位无限壕吃!曝光这家牛排自助餐厅,吃到就是赚到

泉州性比较超高的牛排自助餐厅来了59元吃到扶墙出牛排、大虾、培根、披萨、爆米花、冰淇淋…100多种菜品随便挑!没有 iPhone XS没有关系带上XXXXL胃来“寻找茉莉”放飞自我我们的目标是:59元吃回本我们的口号是:吃垮老板不再怕!!!前方高能预警“肉食爱好者”做好呼吸准备!-低调奢华的牛排,过足你的肉瘾-主角当然是牛排,店里有十几款牛排,相信九儿,绝对不会让你失望。古早黑椒牛排·吃得带劲古早...

weixin_39830205的博客 158

EMLOG6.1.1同乐版最新版程序(V6.1.1.93)

简介: EMLOG6.1.1同乐版最新版程序(V6.1.1.93) Emlog(非官方)是一款国内开源的博客系统程序,是基于PHP+MYSQL结构开发的功能强大且免费的博客系统, 它安装和使用都非常方便,且快速稳定,使用简单,模板插件众多,博客性能易于扩充,总的来说该博客系统简洁却 相对官方老版emlog完善了不少: 全新的编辑器 LayEdit是一个富文本编辑器,遵循极简的设计风格,无论是UI上,还是接口使用上,都尽可能地避免一些繁杂的功能和配置. 邮件通知 系统自带博友评论回复邮件通知功能,更加人性化,

模板下载 480

基于python的农贸产品推荐系统设计与实现(源码+文档+部署讲解等)

摘要: 本文设计并实现了一个基于Python+Django的农产品推荐系统,旨在解决传统农产品交易中存在的信息不对称与效率低下问题。系统采用B/S架构,结合MySQL数据库与Spark引擎,实现用户个性化推荐、农产品管理及在线交易功能。用户端包含产品浏览、购物车、订单管理等模块;管理员端支持用户管理、产品分类、数据分析等功能。系统通过大数据分析用户行为,优化推荐算法,提升农产品匹配精准度。测试表明,该系统操作简便、运行稳定,有效促进了农产品供需对接,为农业电商发展提供了智能化解决方案。核心代码展示了订单统计

weixin_50956837的博客 797

楼市十大卖楼花招曝光〔转载〕

楼市十大卖楼花招曝光〔转载〕 原文:http://bbs.house.sina.com.cn/tableforum/App/view.php?bbsid=271&subid=1&fid=1272&tbid=6870 1.楼盘报价 可疑的“起”字   “均价10000元/m2,现在推出30套保留单位,特惠价8000元/m2起。”这样的价格无疑是相当诱人的,问题是当有兴趣的...

weixin_33812433的博客 62

[导入]楼市十大卖楼花招曝光〔转载〕

原文:http://bbs.house.sina.com.cn/tableforum/App/view.php?bbsid=271&subid=1&fid=1272&tbid=6870 1.楼盘报价 可疑的“起”字   “均价10000元/m2,现在推出30套保留单位,特惠价8000元/m2起。”这样的价格无疑是相当诱人的,问题是当有兴趣的买家到了销售现场时,往往...

weixin_33989058的博客 63
上一篇: 揭秘PHP实现视频流实时转码:3种高性能方案对比与最佳实践
下一篇: 为什么你的PHP WebSocket重连总失败?90%开发者忽略的4个关键点
quickcode
博客等级 码龄19年 146粉丝 1996原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值