GPT-4是个编程高手,真服了!

Java整合GPT-4生成不同风格的PPT 本文将详细介绍如何使用Java结合GPT-4和Apache POI库生成具有不同风格的PPT。我们将通过调整GPT-4生成的文本内容和自定义幻灯片样式来实现商务风、政务风和卡通风的PPT。文章将提供完整的代码示例和注释,帮助你轻松掌握这一技能。 阅读详情

上周给大家发了一个GPT-4教数学的介绍,很多人都被震撼了,感觉有可能在教育行业引发革命。

它在编程领域表现如何?先不说能否替代程序员,这个还有待更多的测试和反馈,我想先试试它能不能像教数学那样教编程。

我找了个Java编程中比较难以理解的概念:动态代理,测试一下。

下面是我和它的完整对话,我假装是一个学习Java编程的新手,不知道代理模式,看看它如何教我。

内容有点长,建议耐心读一下,感受下AI的能力。

实在看不下去,可以跳到最后直接看亮点。

【刘欣】:假设你是一个始终用苏格拉底风格回答问题的导师。你不会直接给我答案,而是会引导我去思考,可以吗?

【GPT】:当然可以。请问你有什么问题,让我来引导你去思考和探讨。

【刘欣】:我在学Java,其中有个动态代理的概念,我理解不了

【GPT】:很好,让我们一起用苏格拉底式的方法来探讨Java动态代理。首先,我们需要了解代理模式。请问你对代理模式有什么了解?代理模式的目的是什么?

【刘欣】:是指一个人替代另外一个人做事?

【GPT】:是的,从某种意义上说,代理模式就是在软件设计中实现类似的概念。在这种情况下,一个对象(代理)代表另一个对象(目标对象)来执行特定的任务。现在,请思考一下,为什么我们可能需要在编程中使用代理模式?在什么情况下使用代理模式会有帮助?

【刘欣】:不知道

【GPT】:没关系,让我们一起来探讨一些可能的原因。代理模式在很多场景中都很有用,比如当我们需要在访问一个对象之前或之后执行一些额外操作时。例如,我们可以在以下情况中使用代理模式:

控制对目标对象的访问(访问控制)

在目标对象执行操作前后添加额外功能(例如日志记录、缓存等)

延迟加载,只有在真正需要时才创建目标对象

这只是一些代理模式的应用场景。那么,在你看来,动态代理如何在这些场景中发挥作用?动态代理与静态代理有何不同?

【刘欣】 这是啥意思,搞不懂

【GPT】没关系,我们可以通过一个简单的例子来帮助你理解代理模式。

假设你有一个应用程序,该应用程序需要连接到一个远程服务器来获取数据。在这种情况下,你可以创建一个名为RemoteServerConnection的类,该类负责与远程服务器建立连接并获取数据。

现在,你的应用程序需要执行一些额外操作,例如在连接到远程服务器之前检查网络状态,以及在获取数据后记录日志。这时,你可以使用代理模式。

你可以创建一个名为RemoteServerConnectionProxy的类,它与RemoteServerConnection有相同的接口,但添加了检查网络状态和记录日志的功能。应用程序将使用RemoteServerConnectionProxy来获取数据,而不是直接使用RemoteServerConnection。RemoteServerConnectionProxy将处理额外的操作,然后在需要时代表应用程序与RemoteServerConnection进行通信。

在这个例子中,RemoteServerConnectionProxy就是一个代理,它代表了RemoteServerConnection(目标对象)来执行特定的任务。

现在你对代理模式有了基本的了解,接下来我们来看动态代理。在上面的例子中,我们创建了一个单独的代理类(静态代理)。与静态代理不同,动态代理是在运行时动态生成的,而不是提前编写好的。动态代理可以更灵活地应对不同场景。

在Java中,动态代理通常是通过实现InvocationHandler接口和使用Proxy类来实现的。那么,请思考一下,为什么动态代理可能在某些情况下比静态代理更有优势?

【刘欣】:等一下,先把静态代理说完,你的例子中

RemoteServerConnectionProxy 对之前的类添加了一些检查网络状态和记录日志的功能, 但是为什么要和RemoteServerConnection有相同的接口呢?

【GPT】:抱歉我之前没有解释清楚。让我们回顾一下代理模式的目的:一个对象(代理)代表另一个对象(目标对象)来执行特定的任务。为了让代理对象能够顺利地替代目标对象执行任务,它们需要具有相同的接口。这样,客户端代码就可以不用关心它正在与代理对象还是目标对象交互,因为它们具有相同的接口。

在我们的例子中,RemoteServerConnectionProxy(代理对象)和RemoteServerConnection(目标对象)具有相同的接口,因为这样应用程序可以透明地使用这两个类。当我们决定在应用程序中使用代理时,我们不需要更改客户端代码,因为代理对象和目标对象都实现了相同的接口。这就是为什么代理对象和目标对象需要具有相同接口的原因。

此外,具有相同接口意味着代理对象可以在执行任务时调用目标对象的方法。这对于实现像访问控制、日志记录等额外功能非常重要,因为代理对象需要在适当的时候将控制权传递给目标对象。

【刘欣】:明白了,这就是代理模式,那什么是动态代理?

【GPT】:很好,现在你已经了解了代理模式,我们继续讨论动态代理。

动态代理与静态代理的主要区别在于它们的创建方式。静态代理是预先编写好的代理类,这意味着对于每个目标类,你需要为其创建一个单独的代理类。然而,动态代理是在运行时动态生成的,这使得你可以在不改变源代码的情况下,为多个类创建通用代理。这样,你就可以减少重复代码,提高可维护性。

在Java中,动态代理主要是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现的。以下是动态代理的基本步骤:

定义一个InvocationHandler实现类,这个类负责处理代理对象的方法调用。在这个类中,你可以根据需要添加额外的操作,例如日志记录、访问控制等。

使用Proxy.newProxyInstance()方法创建动态代理。这个方法接收三个参数:类加载器、接口数组(代理类需要实现的接口)和InvocationHandler实例。这个方法会返回一个实现了指定接口的代理对象。

在客户端代码中,使用创建的动态代理对象来调用方法。当你调用代理对象的方法时,它会将调用转发给InvocationHandler实例的invoke()方法。

这样,你就可以在运行时为一个或多个类创建动态代理,而无需为每个类编写单独的代理类。

现在你已经了解了动态代理的概念,请思考一下动态代理相比静态代理的优点和局限性。

【刘欣】一脸懵逼

【GPT】没关系,让我们尝试通过一个简单的例子来帮助你理解动态代理。

假设我们有一个Bank接口,其中有一个方法transfer()来执行转账操作。我们希望为这个接口添加日志记录功能,但我们不想修改Bank接口的实现。这时,我们可以使用动态代理。

首先,我们需要实现一个InvocationHandler,这个类将负责处理代理对象的方法调用并添加日志记录功能:

public class LoggingHandler implements InvocationHandler {
    private Object target;
    public LoggingHandler(Object target) {
        this.target = target;
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("日志记录:开始执行 " + method.getName() + " 方法");
        Object result = method.invoke(target, args);
        System.out.println("日志记录:执行 " + method.getName() + " 方法完成");
        return result;
    }
}

现在,我们可以使用Proxy.newProxyInstance()方法为Bank接口创建一个动态代理。注意,我们需要将Bank接口的实现类实例传递给LoggingHandler:

Bank realBank = new RealBank(); // 假设RealBank是Bank接口的一个实现
InvocationHandler handler = new LoggingHandler(realBank);




Bank proxyBank = (Bank) Proxy.newProxyInstance(
    realBank.getClass().getClassLoader(),
    realBank.getClass().getInterfaces(),
    handler
);

现在,当我们使用proxyBank调用transfer()方法时,会自动添加日志记录功能:

proxyBank.transfer();

通过这个例子,我们可以看到动态代理的主要优点:无需为每个类编写单独的代理类,可以在运行时为一个或多个类创建通用代理。同时,它也使得代码更加灵活,易于维护。

然而,动态代理也有一些局限性,例如在Java中,动态代理只能为实现了接口的类创建代理,如果类没有实现任何接口,则无法使用动态代理。

希望这个例子能帮助你理解动态代理的概念。如果你还有任何疑问,请随时提问。

【刘欣】:你这个例子中,我们希望为Bank接口添加日志记录功能,那我直接写个BankProxy,把记录日志的代码加进去不就行了?干嘛费这么大劲用InvocationHandler?

【GPT】:你提出了一个很好的问题。在某些情况下,使用静态代理(比如你提到的BankProxy)确实可以实现我们想要的功能。然而,在更复杂的场景下,动态代理可能会带来一些显著的优势:

通用性:动态代理可以为多个类和接口创建代理,而无需为每个类编写单独的代理类。如果你需要为很多接口添加相同的功能,例如日志记录、访问控制等,动态代理可以帮助你减少重复代码,提高代码复用性。

易于维护:如果你需要在将来修改或添加代理的功能,使用动态代理会更容易。对于静态代理,你需要逐一修改每个代理类;而对于动态代理,你只需要修改InvocationHandler实现。这样,你可以在不改变原始类和接口的情况下,轻松地修改代理的行为。

解耦:动态代理有助于将代理逻辑与业务逻辑分离。当你需要修改代理逻辑时,不需要更改原始类和接口。这使得代码更容易理解和维护。

尽管如此,动态代理并不总是最佳解决方案。在某些情况下,静态代理可能更适合你的需求。在选择使用动态代理还是静态代理时,你需要根据具体场景和需求来权衡利弊。

希望这个回答能帮助你更好地理解动态代理和静态代理之间的区别。如果你还有其他问题,请随时提问。

【刘欣】:懂了,可是为什么要通过Proxy.newProxyInstance创建一个新的类?直接修改原来的RealBank类不好吗

【GPT】:你的问题涉及到了代码设计和解耦的概念。直接修改RealBank类以添加日志记录功能当然是可行的,但这可能导致以下问题:

单一职责原则:根据单一职责原则,一个类应该只负责一个明确的功能。RealBank类的主要职责是实现Bank接口,处理与银行相关的业务逻辑。如果我们在RealBank类中添加日志记录功能,它将同时负责业务逻辑和日志记录,这可能违反了单一职责原则。通过使用代理,我们可以将这两个职责分离,使每个类专注于一个明确的功能。

解耦:如果我们将日志记录功能直接添加到RealBank类中,那么在将来需要修改或移除日志记录功能时,我们需要更改RealBank类的实现。这可能导致RealBank类与日志记录功能紧密耦合,从而降低代码的可维护性。通过使用代理,我们可以将日志记录功能与RealBank类分离,使得在需要修改或移除日志记录功能时,我们不需要更改RealBank类。

复用性:假设我们希望为多个类添加日志记录功能。如果我们直接修改每个类的实现,这将导致大量重复代码。而通过使用代理(尤其是动态代理),我们可以为多个类提供通用的日志记录功能,从而减少重复代码,提高代码复用性。

总之,通过使用代理,我们可以遵循单一职责原则,实现解耦,并提高代码的复用性。虽然在某些情况下直接修改原始类是可行的,但在许多场景中,使用代理可以带来更好的代码设计和可维护性。

希望这个回答对你有帮助。如果你还有其他问题,请随时提问。

【刘欣】:Proxy.newProxyInstance的参数好复杂啊,把

InvocationHandler 传递进去我理解,为什么还要传递另外两个参数?

【GPT】:Proxy.newProxyInstance方法确实需要三个参数,让我详细解释一下它们的作用:

类加载器(ClassLoader):类加载器负责将字节代码加载到Java虚拟机中。传递类加载器的目的是让Proxy.newProxyInstance方法知道在哪里寻找类定义以及如何将代理类加载到内存中。通常,我们使用目标类的类加载器,因为我们希望代理类与目标类在同一个类加载器中加载。这样可以确保代理类可以访问目标类的接口。在大多数情况下,可以通过target.getClass().getClassLoader()获取目标类的类加载器。

接口数组(Interface[]):接口数组定义了代理类需要实现的接口。这些接口通常与目标类实现的接口相同,以便代理类可以透明地替代目标类。当代理对象的方法被调用时,InvocationHandler将处理这些接口中定义的方法。在大多数情况下,可以通过target.getClass().getInterfaces()获取目标类实现的接口。

InvocationHandler实例:这个参数是一个InvocationHandler实现的实例,它负责处理代理对象的方法调用。当代理对象的方法被调用时,InvocationHandler的invoke()方法将被执行。通过将InvocationHandler实例传递给Proxy.newProxyInstance方法,我们可以自定义代理对象的行为。

虽然Proxy.newProxyInstance方法需要三个参数,但它们都是为了确保代理类能够正确地加载、实现目标类的接口以及自定义代理对象的行为。希望这个解释能帮助你理解这些参数的作用。如果你还有其他问题,请随时提问。

【刘欣】:虽然你这个回答有点儿啰嗦,但我还是懂了

【GPT】:很高兴你理解了。我之所以详细解释,是为了确保你能充分理解这个方法的参数及其作用。如果你在学习过程中遇到其他问题,或者需要更简洁的解释,请随时提问。我会尽力帮助你。祝你学习顺利!

亮点

在教学方法上:

1.它从简单的概念(静态代理)开始引入,非常好!

2.在我听不懂时概念时,会用例子来解释,非常好!

3.我故意对它说的话表示不理解时,它每次都可以进一步解释。

4.它有点急于介绍动态代理,在我反复的提问中能够折回来讲基本概念。

在技术上,它精确解释了:

1.为什么要有动态代理,和动态代理的区别。

2.为什么Proxy要和原有的类接口相同?

3.为什么创建动态代理需要三个参数。

4.介绍了一些设计的原则(单一职责),解耦,复用等功能。

无论是教学方法还是知识的讲授,GPT-4都表现得非常优秀,我觉得即使是有个优秀的讲师来讲,恐怕也就是这样了。

就是感觉它有点啰嗦,如果支持语音效果估计会更好。

不管GPT-4内部是如何做的,它对外表现出来的就像是一个编程高手,不但掌握了动态代理这个概念,拥有大量例子做支撑,还能由浅入深地去讲解,非常厉害,回头我再试试它的设计能力如何,再给大家分享。

(完)

442acaacdfa718a32a16f02af4604a78.png

ca66d9e4d1a5ef2bc33ca44e275ea737.png

04f34dc601f613e28304185eca3a765e.png

0f9a1eb6c146d9a164b35fbcc4a750c1.png

GPT-4o, GPT 4.5, GPT 4.1, O3, O4-mini等模型的区别与联系 OpenAI模型太多挑花眼?GPT-4o、GPT-4.5、O系列…区别联系全解析,开发者必看选型与性价比攻略!🚀💰 阅读详情

相关推荐

GPT-4、GPT-4O 和 GPT-4O-mini 的区别与联系

近年来,人工智能技术飞速发展,特别是在自然语言处理领域。GPT-4 是 OpenAI 推出的新一代大模型,而 GPT-4O 和 GPT-4O-mini 是其优化版本,专门为不同应用场景和计算资源需求进行调整。在这篇文章中,我们将详细比较 GPT-4、GPT-4O 和 GPT-4O-mini 的区别与联系,帮助开发者更好地选择适合的模型。GPT-4是 OpenAI 发布的第四代通用预训练模型,具备强大的生成和理解能力,适用于多种复杂场景。GPT-4O。

surfirst的博客 3万+

编程工具-GPT来AI编程代码

1、下载安装,重要的说三遍(目前免费!免费!免费!),支持多平台 Mac / Windows / Linux,亲测可用,Cursor 是一个基于人工智能技术的代码生成器,它可以根据程序员输入的代码上下文和要实现的功能,自动生成相应的代码。2、支持语言:默认打开后有两个文件js文件和python文件,也可以支持更多的其它语言类型编程比如:html / css / python / c / rust / go / c# / java / php/ js。

十一姐的博客 2774

ChatGPT从小白到专家之路:GPT能做什么?GPT3.5 VS GPT4 怎么选?

ChatGPT能帮助我们普通用户做什么。七个方向文本生成、翻译、编程、问答、完成任务、信息检索、其他每个又可以细分多个细分功能出来。就像官方说的“可以用于解决几乎任何涉及语言处理的任务。” 此外我们明白了ChatGPT-4在逻辑推理和严谨性上ChatGPT-3.5要强很多。但从成本上考虑,并不意味着我们都要使用ChatGPT-4。因为对于绝大多数基本任务来说我们使用3.5足够了。当我们需要更严谨准确的回答,我们的问题牵涉到推理。我们使用GPT4是更好的选择。

micro_cat的博客 1773

如何用GPT进行编程辅助?

无论是生成新代码、优化现有代码,还是调试和生成文档,GPT都能提供强大的支持。GPT可以帮助快速定位和解决代码中的错误。要使用GPT进行编程辅助,你需要一个支持GPT的开发平台,如OpenAI的ChatGPT。GPT可以根据代码自动生成详细的文档注释,确保代码的可读性和后续维护的方便性。:通过提供明确的提示,GPT可以自动生成代码段,减少开发者的工作量,提升效率。通过GPT的建议,函数增加了零除错误的处理逻辑,避免了潜在的程序崩溃。:GPT可以自动生成函数、类和项目的文档,确保代码的可读性和维护性。

玩AI的小胡子-博客 3672

GPT4原理与代码实例讲解

GPT-4的核心在于Transformer架构,通过多头自注意力(Multi-head Self-Attention)模块、位置嵌入(Positional Embedding)和前馈神经网络(Feed-forward Neural Network)构成。模型通过学习文本序列中的模式,能够生成与上下文相匹配的文本。GPT-4在语言生成、多模态处理等方面取得了突破性进展,展示了强大的性能和广泛的适用性。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 229

Python实战:动态爬取国家地表水水质实时监测数据(附最新代码解析)

本文详细介绍了使用Python动态爬取国家地表水水质实时监测数据的实战方法。针对动态网站数据加载特点,重点解析了如何利用Selenium模拟浏览器操作、结合BeautifulSoup解析数据,并提供了最新的代码实现与常见问题解决方案,帮助开发者高效获取环境监测数据。

app77的博客 279

用GPT帮你完成50%代码开发!重塑代码开发方式!

本文介绍了如何在编码过程中充分利用代码生成技术,以更高效、清晰的方式进行软件开发。文章提供了具体的例子和思考方法,对于希望在编码过程中借助GPT等技术的开发者来说,具有实际指导意义。

再无此人的博客 3195

彻底卸载Ubuntu双系统,并完美回收100G空间给D盘

本文记录了安全卸载Ubuntu双系统并回收磁盘空间的全过程。作者首先通过Windows命令行彻底清除Ubuntu启动项,避免GRUB引导报错;随后在磁盘管理中删除Linux分区,将100G未分配空间合并至相邻的D盘。针对C盘空间不足问题,作者采用Dism++清理系统文件,并将用户文档、聊天记录等迁移至扩容后的D盘。最终实现了引导纯净、空间合理分配的目标,特别强调分区扩展必须遵循"相邻原则",建议通过间接迁移而非直接扩容来优化系统盘空间管理。

2403_85993278的博客 1512

【GPT4】微软 GPT-4 测试报告(3)GPT4 的编程能力

微软研究院最新发布「 GPT-4 的早期实验 」 ,公布了对 GPT-4 进行的全面测试。本文介绍第三部分:GPT4 的编程能力。 GPT-4 可以处理广泛的编程任务,从编程挑战到现实世界的应用,从低级汇编到高级框架,从简单的数据结构到复杂的程序。 GPT-4 还可以对代码执行进行推理,模拟指令的效果,并用自然语言解释结果。 GPT-4 甚至可以执行伪代码,这需要解释在任何编程语言中都无效的非正式和模糊的表达。

youcans的博客 8553

基于PLC的矿用排水控制系统设计【附代码】

(3)矿用排水控制系统的软件设计 研究设计了矿用排水控制系统的软件,包括PLC程序的编写和上位机监控画面的设计。(2)矿用排水控制系统的硬件设计 研究对矿用排水控制系统的硬件进行了选型和设计,包括矿用多级耐磨离心泵、三相异步防爆电机等执行设备的选型,以及控制系统所需用到的各类型传感器、PLC的I/O点分配及选型。(1)矿用排水控制系统的现状分析 研究首先对矿井排水系统的现状进行了分析,指出了现有系统存在的问题,如自动化程度低、劳动强度大、设备维护困难等。✅ 具体问题可以私信或查看文章底部二维码。

lagougongzuoshi的博客 1173

JS+H5打字练习器

实现功能 1.导入.TXT文件到打字练习内容(部分浏览器可能出于安全问题限制了这一步操作) 2.输入文本到打字练习内(弹出输入框,将要练习的内容输入至输入框) 3. 开始练习,并根据正误在打字练习内容文本上修改颜色(某个字正确显示绿色,某个字错误,显示红色,某个字没有打显示灰色) 4.开始练习、结束练习,全部输入完成后自动结束练习,也可提前手动结束练习,结束练习后弹窗用显示时和正确率。(区别在于一个全部输入完成且全部正确,一个提前结束无其他条件) 效果图 分析 HTML 结构解析 根元素:<!DO

w11111xxxl的博客 1414

“两周时间,我体验了 GPT-4 从编程‘神器’变成编程‘智障’!​”

GPT-4 像一个糟糕的工程师,没有搞清楚整体状况,就根据我的反馈做出了反应,更可怕的是,它还开始随意修改一些不需要改动的代码。我要求它加倍小心,集中注意力解决它生成的代码中的一个问题:start() 调用 startTimer(),startTimer() 调用 start(),但依然没有用。然后,我再次提醒它一些代码,希望它能正确理解需求,并编写出正确的代码。我将这些函数的文档复制到了源文件中,并在新的聊天中重复了之前的操作,不过 ChatGPT 抱怨我的请求太长,所以我删除了 CSS 文件。

IT界那些事儿 9608

VCS的增量和分离编译

vcs的增量和分离编译

yunduor909的博客 3302

猫头虎分享:如何选择GPT-4、GPT-4 Turbo、GPT-4o 和 GPT-4o mini?

简单来说,**“模型”**就像是AI智能助手的不同版本,每个版本具备不同的智能水平和能力。在使用ChatGPT时,您会在界面中看到可供选择的模型,了解它们的特点将帮助您更好地使用这些工具。常见GPT模型一览GPT-4o🌟这是OpenAI最新、最快且智能最高的模型。它支持128k上下文长度,能够处理复杂的文本和图像任务,同时还支持音频输入/输出,是需要高精度和高速度用户的理想选择。GPT-4o 迷你🌀如果您需要轻量级的智能模型,是最佳选择。它同样支持128k上下文长度。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 5849

20240128 C#与SCPI协议实战:轻量级仪器控制库ScpiNet应用指南

本文详细介绍了轻量级C#库ScpiNet在仪器控制中的应用。相较于传统的NI-VISA,ScpiNet无需安装庞大运行时,通过纯C#实现直接与USB或以太网设备通信,支持跨厂商SCPI仪器。文章提供了从快速连接到实战封装、错误处理的完整指南,帮助开发者构建简洁高效的自动化测试系统。

h9j8k7l6m5n的博客 547

【华为OD机试真题 新系统】1009、企业内部门的最大层级 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1009、企业内部门的最大层级 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战

KJ.JK 1417

【深度解析】一篇文章带你了解AI大模型的区别!o1-preview、GPT-4o、GPT-4o MINI、GPT-4.0、GPT-3.5

我之前写过GPT-4o、GPT-4o MINI、GPT-4.0、GPT-3.5的对比。但是随着o1-preview的上线,已经过去了10天有余。所以本次对比,我们再次加入o1-preview的对比结论。如果后续还有新模型出现。我们会一次类推!

万物皆有灵 6316

LVGL core theme主题管理(lv_theme.c)

如果打开宏,主题的初始化是在显示设备注册时完成的。整个themes的实现放在目录下面。这里一共有三套主题(basic、default和mono)可供选择或者参考。源码中默认对接的是 default 主题,所以在中,看到的是调用default主题的接口。也就是说,如果需要更换主题,把这里面的接口换掉就可以了。或者要重新做一套主题,参考这些实现修改也就可以了。虽说有三套主题,但逻辑流程是一样的。主要完成两个工作:构造lv_theme_t结构体和初始化默认样多备用(style_init函数内实现)。构造。....

Bigan(安)的博客 3411

【GPT4】GPT4 官方报告解读

【GPT-4 】官方[研究进展]、[技术报告]全面解读。综合性能,图像输入,私人定制,事实判断的局限性,风险与应对,模型训练过程,用户政策和价格,API 使用。 GPT-4 是 OpenAI 在深度学习领域的最新里程碑。GPT-4 是一个大型多模态模型,可以接受图像和文本输入,发出文本输出。虽然 GPT-4在许多现实世界场景中的能力仍然不如人类,但在各种专业和学术基准上已经表现出人类水平的性能。

youcans的博客 7512

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

GPT4不限制使用次数了!GPT5即将推出了!

不管OpenAI为什么突然会发现这样的变化,肯定是OpenAI为了后面的动作而提前做的变化。大家先去看下自己的账号,有没有被灰度/放量到~,这个灰度仅限于ChatGPT Plus用户。最后,如果想要升级GPT4,通过ChatGPT升级Plus4.0订阅教程2024年4月最新可以快速升级到GPT4账户,就等GPT5发布就可以啦。

weixin_40262196的博客 3万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

炸裂了!3分钟用GPT4做一个PPT!

GPT4有多强了,相信体验过的同学都知道,一个字爽!无论是速度,还是数据集还是功能都比3.5要强大很多。现在越来越多的人开始用GPT4了,可以大幅的提高我们的工作和学习的效率,今天小编就用GPT4快速做一个PPT,分享给大家,分分钟搞定。1.第一步打开GPT4不知道怎么注册的自行百度或者公众号后台输入:小菜小菜,找他咨询。这样做的目的是为了训练GPT4,明确的告诉它,我们要做什么,然后要用什么格式...

cainiao_python的博客 3万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

GPT-4 官宣退役!曾经的最强模型,正式交棒 GPT-4.1、o3、o4 mini!

GPT-4 官宣退役!曾经的最强模型,正式交棒 GPT-4.1、o3、o4 mini!

hunteritself的博客 3633

GPT-4.1特点?如何使用GPT-4.1模型,GPT-4.1编码和图像理解能力实例展示

以上计划细化了图片中的12步,确保你依流程稳步推进。重点依赖AI工具(Claude, Gemini)做创意和验证环节的加速。UI设计和项目管理必须用专业工具保证效率。测试和上线步骤建议合理利用团队力量实际完成。如果你需要,我可以继续帮你针对具体步骤制定更详尽的执行计划和模板。你可以告诉我哪一步想深挖,也可以问我工具的具体用法。祝你SaaS开发成功!

hellocode_的博客 1662

GPT4All安装教程 一个能本地运行的GPT4!

GPT4All是能够在你的笔记本或者台式计算机运行的大型语言模型(LLMs)。它并不强制需要GPU,CPU也能流畅的运行该语言模型。

mc_dudu233的博客 1万+

GPT-4o, GPT-4.5, GPT-4.1, O3, O4-mini等OpenAI模型的区别与联系

好了,看到这里,相信你对OpenAI的这些模型已经有了更清晰的认识。没有哪个模型是万能的,关键在于根据你的具体需求和场景进行选择。对于开发者而言,将AI模型融入日常编程流程,可以极大地提升效率。以下是一套基于OpenAI模型的。

z551646的博客 7069
上一篇: 数据库,数据仓库,数据湖......下一个是啥?
下一篇: 不走寻常路,一个程序媛十三年的野蛮生长
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值