如何在Flink中生成WaterMark

Flink设置水印 方法,用于从数据源中提取事件的时间戳。在这个方法中,我们还更新了。类型应该实际数据源类型相对应,并且应该能够从数据中提取时间戳。变量,用于跟踪数据源中的最大时间戳。构造函数中,我们指定了最大乱序时间窗口的大小(10秒)。使用自定义时间戳分配器,Flink 程序中使用。的实例,并使用它为数据源分配时间戳和水印。接口来为您的数据源分配时间戳和水印。在上面的代码中,我们首先定义了一个。变量,以便始终保持跟踪最大时间戳。在 Flink 中,可以通过实现。在这个例子中,我们创建了一个。请注意,上面的示例代码中的。 阅读详情


waterMark即水印是Flink中Event Time相关处理的一个重要概念。WaterMark在最大程度上确保了Flink窗口处理中数据的顺序(注意是watermark只是最大程度上确保了数据顺序即一定程度上缓解了数据乱序的问题,某些情况下,数据延迟非常严重即watermark机制也无法确保数据全部进入窗口,关于延迟数据参考allowed lateness机制)。的本文探讨一下如何在Flink中生成WaterMark。
Flink中生成WaterMark需要完成以下4步:

  1. StreamexecationEvironment指定Timecharacterstic
  2. Flink程序中指定Event Time时间戳在数据中的字段信息。
  3. Timestamp Assigning过程,Flink程序通过步骤2所指定额字段抽取对应的Event Time。
  4. 根据定义的WaterMarks生成策略,生成WaterMarks。
    目前Flink支持两种方式指定Timestamps和生成waterMarks:
  5. 在DataStream Source 算子接口的Source Function实现类定义。
  6. 自定义Timestamp Assigner和Watermark Generator生成。

1. 通过SourceFunction接口定义timestamps和Watermarks

在DataStream Source算子中指定EvenTime时间戳,确保数据在进入到Flink系统中就直接指定分配EventTime和Watermark。
SourceFunction接口java定义如下:

public interface SourceFunction<T> extends Function, Serializable {
       /**
         * 启动数据源,实现类可以通过SourceContext类型入参ctx发出元素。           
         * @param ctx 发送元素和接收锁的Context.
         */
        public void run(SourceContext<Tuple2<String, Integer>> ctx) throws Exception ;

        /**
         * 停止DataSource。 大多数源在run(SourceContext ctx)方法内部都会有一个while循环。实现类要确保在调用此方法后,DataSource将能够退出该循环。
         * 一种典型的实现模式是:
         * 在实现类中定义volatile类型的bool变量(volatile boolean isRunning)作为标志,
         * 并在循环中检查该标志。
         * 此外停止DataSource时,执行线程也将被中断(通过Thread.interrupt())。 但可确定的是该线程                          
         * 中断是严格发生在调用此方法之后,因此任何中断处理程序都可以认为此方法已经执行完成。 
         * 一个优雅实践是通过此方法修改所有volatile型的标志,以确保此方法的效果对任何中断处理程序可见
         */
        public void cancel(); 
}

用户实现SourceFunction接口需实现run()方法来实现数据生成逻辑。在run()方法中,调用SourceContext的collectWithTimestamp()方法生成EventTime时间戳,调用emitWatermark()方法生成watermarks。

2. 通过Timestamp Assigner和Watermark Generator实现

2.1 通过自带Timestamp assigner指定Timestamp和watermark

如果用户使用Flink定义的外部数据源连接器,就不能再实现SourceFunction接口来生成流数据及相应的event时间和watermark。这种情况需要通过Timestamp Assigner管理数据流中的Timestamp和watermark。
Timestamp分配器一般跟在data source算子后面指定,也可在后续的算子指定。无论如何指定,要保证Timestamp分配器在第一个依赖时间的operator算子之前指定。如果用户在SourceFunction中定义了Timestamp和watermarks的生成逻辑,同时又使用了Timestamp分配器,后者会覆盖前者定义的逻辑。

Watermarks两种生成方式
Flink定义了两种watermarks生成形式,分别是periodic watermarks和puncuated watermarks。periodic watermarks根据设定时间间隔周期性地生成watermarks,而puncuated watermarks是根据接入数据的数量生成。

2.1.1 periodic watermarks

periodic watermarks根据设定时间间隔周期性地生成watermarks,本生成形式要借助AssignerWithPeriodicWatermarks接口。
Flink系统中有两种模式的Periodic Watermark分配器,分别是升序模和固定时间间隔模式。

(1) 升序模式

Ascending Timestamp分配器会将数据中的Timestamp根据指定字段提取,并用当前的Timestamp作为最小的watermark。这个模式比较适合于事件按顺序生成,没有乱序事件的情况。
升序模式通过AscendingTimestampExtractor的子类定义。AscendingTimestampExtractor的抽象方法extractAscendingTimestamp定义了如何从元素中抽取Timestamp。

**
	 * Extracts the timestamp from the given element. The timestamp must be monotonically increasing.
	 *
	 * @param element The element that the timestamp is extracted from.
	 * @return The new timestamp.
	 */
	public abstract long extractAscendingTimestamp(T element);

子类实现示例

class MyAscendingTimestampExtractor extends AscendingTimestampExtractor<Tuple3<String, Long, Integer>> {

        @Override
        public long extractAscendingTimestamp(Tuple3<String, Long, Integer> element) {
            return element.f1;
        }
    }

DataStrem

DataStream<Tuple3<String, Long, Integer>> ds = 
evn.fromElements(new Tuple3<>("a", 123214L, 2), new Tuple3<>("a", 1237214L, 7),
                new Tuple3<>("a", 123218L, 5), new Tuple3<>("a", 113214L, 0),
                 new Tuple3<>("a", 123114L, 6));

调用DataStream的assignTimestampsAndWatermarks方法指定分配器

ds.assignTimestampsAndWatermarks(new MyAscendingTimestampExtractor());

或者

ds.assignTimestampsAndWatermarks(new AscendingTimestampExtractor<Tuple3<String, Long, Integer>>() {
            @Override
            public long extractAscendingTimestamp(Tuple3<String, Long, Integer> element) {
                return element.f1;
            }
        });
(2) 固定时间间隔

该模式是通过设置固定的时间间隔来指定watermark落后于Timestamp的区间长度。该固定时间间隔就是最长容忍迟到的时间,也即系统最大容忍迟到多长时间内的数据到达系统。
通过创建抽象类BoundedOutOfOrdernessTimestampExtractor的子类实现Timestamp Assigner。BoundedOutOfOrdernessTimestampExtractor定义了extractTimestamp抽象方法用于从元素中抽取Timestamp,其子类要在该方法实现Timestamp抽取策略。

/**
	 * Extracts the timestamp from the given element.
	 *
	 * @param element The element that the timestamp is extracted from.
	 * @return The new timestamp.
	 */
	public abstract long extractTimestamp(T element);

子类实现示例

  class FixedIntervalTimestampExtractor extends BoundedOutOfOrdernessTimestampExtractor<Tuple3<String, Long, Integer>> {
        public FixedIntervalTimestampExtractor(Time maxOutOfOrderness) {
            super(maxOutOfOrderness);
        }
        
        @Override
        public long extractTimestamp(Tuple3<String, Long, Integer> element) {
            return element.f1;
        }
    }

调用DataStream的assignTimestampsAndWatermarks方法指定分配器

 Time interval = Time.milliseconds(300000L);
 ds.assignTimestampsAndWatermarks(new FixedIntervalTimestampExtractor(interval));

或者

Time interval = Time.milliseconds(300000L);
ds.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Tuple3<String, Long, Integer>>(interval) {
            @Override
            public long extractTimestamp(Tuple3<String, Long, Integer> element) {
                return 0;
            }
        });

其中参数interval指定了最长的300000ms的时延。在extractTimestamp定义了Timestamp抽取逻辑,以上示例中抽取元素的第二个元素做为Event Timestamp。Watermarks创建是根据Timestamp减去固定时间长度生成。如果当前数据中时间大于watermarks时间,则认为是迟到时间。

2.1.2 puncuated watermarks

puncuated watermarks是根据接入数据的数量生成。本生成形式要借助AssignerWithPunctuatedWatermarks接口,后面会讲。

2.2 自定义Timestamp分配器和Watermark生成器

Flink系统自定义的Timestamp分配器不满足需求时,用户可以通过实现AssignerWithPunctuatedWatermarks和AssignerWithPeriodicWatermarks两个接口来分别实现自定义的PunctuatedWatermarks和PeriodicWatermarks生成策略。

2.2.1 自定义Periodic Watermarks

Periodic Watermarks根据固定时间间隔,周期性地在Flink系统中分配timestamps和生成watermarks。需要注意的是,需要ExecutionConfig的setAutoWatermarkInterval()方法设置Watermarks产生的时间周期。

long interval = 60000L;//ms
ExecutionConfig executionConfig = new ExecutionConfig();        
executionConfig.setAutoWatermarkInterval(interval);

子类需要实现AssignerWithPeriodicWatermarks接口的getCurrentWatermark和extractTimestamp方法。
extractTimestamp方法定义了抽取Timestamp的逻辑。
getCurrentWatermark方法定义了生成watermark的逻辑。
下面定义了MyPeriodicAssigner ,其生成watermark依赖于curentMaxTimestamp。getCurrentWatermark方法调用时,如果新产生的watermark比当前大,就会覆盖掉当前的watermark,从而实现对watermark数据的更新。

class MyPeriodicAssigner implements AssignerWithPeriodicWatermarks<Tuple3<String, Long, Integer>> {

     //设定30s时延,表示在30s内的数据延时有效,超过30s的数据被认定位迟到事件
     long maxTimeOutOfOrder = 30000L;
     long currentMaxTimestamp = 0;

     @Override
     public long extractTimestamp(Tuple3<String, Long, Integer> element, long previousElementTimestamp) {
         long currentTimestamp = element.f2;
         // 对比当前的事件事件和历史事件时间,将最新的时间戳赋值给currentMaxTimestamp
         currentTimestamp = Math.max(currentTimestamp, currentMaxTimestamp);
         return currentTimestamp;
     }

     @Nullable
     @Override
     public Watermark getCurrentWatermark() {
         // 最大时间减去最大的乱序容忍时长,作为watermark
        return new Watermark(currentMaxTimestamp - maxTimeOutOfOrder);
     }
 }

2.2.2 自定义Punctuated Watermarks

用户除了根据时间周期生成watermark外,更复杂的情况可以自定义Punctuated Watermarks实现生成watermark。自定义Punctuated Watermarks需要实现AssignerWithPunctuatedWatermarks接口,实现的类要实现接口的extractTimestamp和checkAndGetNextWatermark方法。extractTimestamp方法定义了Timestamp的抽取逻辑。checkAndGetNextWatermark方法定义了watermark的生成逻辑。示例如下。

class MyPunctuatedAssigner implements AssignerWithPunctuatedWatermarks<Tuple3<String, Long, Integer>> {
        @Nullable
        @Override
        public Watermark checkAndGetNextWatermark(Tuple3<String, Long, Integer> lastElement, long extractedTimestamp) {
            if (null != lastElement.f2 && lastElement.f2 > 0) return new Watermark(extractedTimestamp);
            return null;
        }

        @Override
        public long extractTimestamp(Tuple3<String, Long, Integer> element, long previousElementTimestamp) {
            return element.f1;
        }
    }

示例中判读元素的第三个字段,如果不为null或者负值则触发生成watermarks,否则不生成。

Flink watermark Flink水印的本质是DataStream中的一种特殊元素,每个水印都携带有一个时间戳。当时间戳为T的水印出现时,表示事件时间t T的数据。也就是说,水印是Flink判断迟到数据的标准,同时也是窗口触发的标记。本质上用来处理实时数据中的乱序问题的,通常是水位线和窗口结合使用来实现。 阅读详情

相关推荐

flink生成Watermark之WatermarkStrategy

flink1.11版本后建议用WatermarkStrategy(Watermark生成策略)生成Watermark

小程序猿 9580

【深入浅出flink】第13篇:从源码解读flink中Watermark的周期性和间断式生成方式

我们通常通过DataStream的assignTimestampsAndWatermarks方法引入Watermark,assignTimestampsAndWatermarks方法中要求传入的接口有两种,一种是AssignerWithPeriodicWatermarks(周期性生成Watermark的时间戳分配器),另一中是AssignerWithPunctuatedWatermarks(间断式生成Watermark的时间戳分配器),它们都是TimestampAssigner(时间戳分配器)接口的子接口。

雷恩Layne 2688

flink生成Watermark之assignTimestampsAndWatermarks

在DataStreamSource对象上调用assignTimestampsAndWatermarks方法,自定义Timestamp提取规则和Watermark生成规则。 文章目录基于AssignerWithPeriodicWatermarks接口 基于AssignerWithPeriodicWatermarks接口 AssignerWithPeriodicWatermarks接口扩展自TimestampAssigner类,其中extractTimestamp方法定义抽取Timestamp,getCurre

小程序猿 1万+

Flink自定义生成 Watermark

生成水印watermark’

qq_20671779的博客 1448

Flink源码解析:watermark生成与传递

watermark生成 watermark的生成策略有两种:一种是周期性生成,另外一种是根据特定标记生成。在实际使用中大多数情况下会选择周期性生成方式也就是AssignerWithPeriodicWatermarks方式,使用方式如下: // An highlighted block //指定为evenTime时间语义 env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) //生成watermark的周期 env.getConfig.se

jon_snow666的博客 1750

利用apache flink 消费rocketmq的消息(三)—— 自定义周期水印,解决最后一个窗口因为缺少数据到达不触发问题

为了使用事件时间语义,Flink应用程序需要知道事件时间戳对应的字段,意味着数据流中的每个元素都需要拥有可分配的事件时间戳。其通常通过使用从元素中的某个字段去访问/提取时间戳。时间戳的分配与watermark的生成是齐头并进的,其可以告诉Flink应用程序事件时间的进度。其可以通过指定来配置watermark的生成方式。使用Flink API时需要设置一个同时包含和的。工具类中也提供了许多常用的watermark策略,并且用户也可以在某些必要场景下构建自己的watermark策略。/**

gmHappy 1988

Flink中Watermark定时生成源码分析

点击箭头处“蓝色字”,关注我们哦!!watermark的生成策略有两种:一种是周期性生成,另外一种是根据特定标记生成。在实际使用中大多数情况下会选择周期性生成方式也就是AssignerW...

张普的专栏 1799

Flink 1.11+ 版本如何生成 Watermark

一般来说,Flink 内置的 Watermark 生成器就可以满足应用需求了。不过有时我们的业务逻辑可能非常复杂,这时对 Watermark 生成的逻辑也有更高的要求,我们就必须自定义实现 Watermark 策略 WatermarkStrategy 了。在 WatermarkStrategy 中,时间戳分配器 TimestampAssigner 都是大同小异的,指定字段提取时间戳就可以了;}onEvent:每个元素到达都会调用这个方法。

SmartSi 789

Flink之Watermark生成策略

Watermark策略

AnameJL的博客 871

无人机通信安全渗透测试:从信号拦截到GPS欺骗的完整攻防框架

在物联网和智能设备普及的背景下,无线通信安全成为关键基础设施防护的核心环节。其原理在于,通过软件定义无线电等设备对空中的射频信号进行捕获、分析与模拟,从而评估通信协议在加密、认证和防重放等方面的脆弱性。这项技术的价值在于,它能主动发现并修复系统设计缺陷,避免因信号被拦截或欺骗导致设备被劫持、数据泄露等重大安全事件。其应用场景广泛,涵盖消费电子、工业控制及关键基础设施等领域。本文聚焦于无人机这一典型移动物联网终端,深入探讨如何构建一套针对其通信链路的渗透测试方法论,其中涉及信号拦截、协议逆向等关键技术,旨在为

weixin_34128237的博客 391

SAP ERP 物料主数据同步外围系统

w_input-beskz = i_marc_new-beskz."采购类型 " BESKZ--- ADD BY HX_FHJ 20210106。w_input-beskz = lw_marc-beskz."采购类型 " BESKZ--- ADD BY HX_FHJ 20210106。w_input-sobsl = i_marc_new-sobsl."特殊采购类型-虚拟物料标识。

ChampaignWolf的专栏 1745

flink生成Watermark之SourceFunction

可以通过addSource方法来自定义SourceFunction,并可指定Timestamp和Watermark生成规则。

小程序猿 1482

SATA硬件电路设计实战:从接口规范到高速布线技巧

本文深入探讨了SATA硬件电路设计的核心要点与实战技巧。从接口物理电气规范、AC耦合电容与阻抗控制等基础,到FPGA/SoC高速收发器选型配置,再到应对6Gbps高速信号的PCB布局布线艺术,系统性地解析了SATA电路设计中的关键挑战与解决方案,助力工程师规避常见陷阱,实现稳定可靠的存储接口设计。

tech5的博客 531

Flink源码阅读之周期性watermark生成逻辑分析

在我们的main函数中会设置时间特性和生成水印的时间间隔 env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime); env.getConfig().setAutoWatermarkInterval(200L); 不设置的话默认为 public void setStreamTimeCharacteristic(TimeCh...

weixin_41608066的博客 861

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3328

告别外置电阻!揭秘MAX22201集成电流检测的5大设计优势(附PCB布局案例)

本文深入解析MAX22201集成电流检测技术在直流有刷电机驱动中的5大设计优势,包括BOM成本降低、PCB空间优化、动态性能提升等。通过与传统方案(如DRV8871+外置电阻)的实测对比,展示其在高精度电流检测、抗干扰能力和PCB布局简化方面的突破,并附有详细的PCB布局案例和配置指南。

weixin_29189377的博客 243

Flink watermark自定义生成机制

周期性生成Watermark import Source.WaterSensor import org.apache.flink.streaming.api.TimeCharacteristic import org.apache.flink.streaming.api.functions.AssignerWithPeriodicWatermarks import org.apache.flink.streaming.api.scala._ import org.apache.flink.streaming

菜鸟也学大数据的博客 859

全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)

QCC3040开发笔记之基本介绍(0) QCC3040开发笔记之开发环境搭建(1) QCC3040开发笔记之debug调试(trb调试,usbt调试,adb调试,WIFI调试)(2) QCC3040开发笔记之按键配置(3) QCC3040开发笔记之按键切换(4) QCC3040开发笔记之按键逻辑(5) QCC3040开发笔记之tone(6) QCC3040开发笔记之提示音(7) QCC3040开发笔记之bitserial接口(8) QCC3040开发笔记之双mic+AEC+ANC(9...

心跳包的博客 3万+

flink watermark 生成机制与总结

watermark 介绍watermark生成方式watermark 的生成值算法策略watermark策略设置代码watermark源码分析watermark源码调用流程debug(重要)测试思路迟到时间处理FlinkSql 中的watermark引出问题与源码分析。

Direction_Wind的博客 2402

PCL 均匀采样【2026最新版】

根据输入点云数据创建一个微小的三维立方体集合,然后计算每个三维立方体的重心;由于该重心点不一定是原始点云中的点,直接用该点来表示立方体内所有的点会丢失原始点云的细小特征;所以使用k最近邻搜索寻找距离重心点最近的原始点来代替重心点。

点云侠的博客 41万+

QML从入门到实战 - 完整学习路线

想入门 QML 开发?来 “从零开始学 QML” 专栏,海量源码 + 实战案例 + 大型项目拆解,手把手教你搞定跨平台 UI 设计,小白也能轻松掌握!

BenBierBa的博客 3479

Flink多并行度下watermark生成规则

一、多并加粗样式行度流的watermarks 注意:多并行度的情况下,watermark对齐会取所有channel最小的watermark 二、单个流多并行度 测试代码如下: public class MutiParaWatermarkTest { public static void main(String[] args) throws Exception { Stre...

weixin_41608066的博客 3385

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Flink DataStream 提取Timestamp与生成Watermark

为了基于事件时间来处理每个元素,Flink需要知道每个元素(即事件)的事件时间(Timestamp)。为了衡量事件时间的处理进度,需要指定水印(Watermark)。 本文总结Flink DataStream中提取Timestamp与生成Watermark的两种方式。 在Source Function中直接指定Timestamp和生成Watermark 在源端(即SourceFunction)中直...

王佩的优快云博客 2907

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深度学习工具包 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")

【源码解析】Flink 是如何基于事件时间生成Timestamp和Watermark

生成Timestamp和Watermark 的三个重载方法介绍可参见上一篇博客:Flink assignAscendingTimestamps 生成水印的三个重载方法 之前想研究下Flink是怎么处理乱序的数据,看了相关的源码,加上测试,发现得到了与预期完全不相同的结果。 预期是:乱序到达的数据,flink可以基于数据的事件时间,自动整理数据,依次计算输出 结果是:在assig...

weixin_30449239的博客 538

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Flink DataStream EventTime下Watermark生成与Window触发

本文总结Flink DataStream EventTime下Watermark的生成与Window计算的触发时机,旨在弄清楚以下问题: 窗口起止时间 对MaxOutOfOrderness或AllowedLateness的理解 窗口计算第一次触发的时机 窗口计算再次触发的时机 窗口销毁的时机 并行流中多并行度下Watermark的生成与窗口触发的时机 Kafka并行流中...

王佩的优快云博客 1430
上一篇: TensorFlow函数:tf.negative
下一篇: Flink的Windows计算
Accelerating
博客等级 码龄10年 3220粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值