首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

【翻译】Sklearn 与 TensorFlow 机器学习实用指南 —— 第11章 训练深层神经网络(中)

梯度裁剪 减少梯度爆炸问题的一种常用技术是在反向传播过程中简单地剪切梯度,使它们不超过某个阈值(这对于递归神经网络是非常有用的;参见第 14 章)。 这就是所谓的梯度裁剪。一般来说,人们更喜欢批量标准化,但了解梯度裁剪以及如何实现它仍然是有用的。 在 TensorFlow 中,优化器的minimize()函数负责计算梯度并应用它们,所以您必须首先调用优化器的compute_gradients()方法,然后使用clip_by_value()函数创建一个裁剪梯度的操作,最后 创建一个操作来使用优化器的apply_gradients()方法应用裁剪梯度: threshold = 1.0 optimizer = tf.train.GradientDescentOptimizer(learning_rate) grads_and_vars = op

优秀的个人博客,低调大师

Java 学习(26)---(IO流之Properties 类 / 合并流 / 序列化流 / 随机访问流)

Properties (1)是一个集合类, Hashtable的子类 (2)特有功能 A:public Object setProperty(Stringkey,Stringvalue) ; //添加元素 B:public StringgetProperty(Stringkey) ; //根据键获取元素 C:publicSet<String> stringPropertyNames() ; //获取所有的键的集合 (3)和 IO 流结合的方法 把键值对形式的文本文件内容加载到集合中 public void load(Reader reader) public void load(InputStream inStream) 把集合中的数据存储到文本文件中 public void store(Writer writer,String comments) public void store(OutputStream out,String comments) (4)案例: A:根据给定的文件判断是否有键为 "lisi"的,如果有就修改其值为 100 // 把文件中的数据加载到集合中 Properties prop = new Properties(); Reader r = new FileReader( "user.txt" ); prop.load(r); r.close(); // 遍历集合,获取得到每一个键 Set<String> set = prop.stringPropertyNames(); for (String key : set) { //判断键是否有为 "lisi" 的,如果有就修改其值为 "100" if ( "lisi" .equals(key)) { prop .setProperty( key ,"100"); break ; } } // 把集合中的数据重新存储到文件中 Writer w = new FileWriter( "user.txt"); prop.store(w,null); w.close(); 合并流 (理解即可) (1)把多个输入流的数据写到一个输出流中。 (2)构造方法: A:SequenceInputStream(InputStream s1, InputStream s2) B:SequenceInputStream(Enumeration<? extends InputStream> e) // 需求:把下面的三个文件的内容复制到 Copy.java 中 // ByteArrayStreamDemo.java,CopyFileDemo.java,DataStreamDemo.java // SequenceInputStream(Enumeration e) // 通过简单的回顾我们知道了 Enumeration 是Vector 中的一个方法的返回值类型。 // Enumeration<E> elements() Vector<InputStream> v= newVector<InputStream>(); InputStream s1 = new FileInputStream( "ByteArrayStreamDemo.java" InputStream s2 = new FileInputStream( "CopyFileDemo.java" ); InputStream s3 = new FileInputStream( "DataStreamDemo.java" ); v.add(s1); v.add(s2); v.add(s3); Enumeration<InputStream>en =v .elements(); SequenceInputStream sis =new SequenceInputStream(en ); // 或 SequenceInputStream sis = new SequenceInputStream(s1,s2,s3); BufferedOutputStream bos =new BufferedOutputStream( new FileOutputStream("Copy.java")); // 如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写 byte [] bys = newbyte [1024]; int len = 0; while ((len = sis.read(bys)) != -1) { bos .write( bys , 0, len ); } bos.close(); sis.close(); 序列化流 (理解) (1)可以把对象写入文本文件或者在网络中传输 (2)如何实现序列化呢 ? 让被序列化的对象所属类实现序列化接口。 java.io.Serializable:该接口是一个标记接口。没有功能需要实现。 NotSerializableException: 未序列化异常 类通过实现java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。 该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口。 java.io.InvalidClassException: cn.itcast_07.Person; local class incompatible: stream classdesc serialVersionUID = -2071565876962058344, local class serialVersionUID = -8345153069362641443 为什么会有问题呢 ? Person类实现了序列化接口,那么它本身也应该有一个标记值。 这个标记值假设是 100。开始的时候: Person.class --id=100 wirte数据: oos.txt --id=100 read数据 : oos.txt-- id=100 现在: Person.class --id=200 wirte数据: oos.txt --id=100 read数据 : oos.txt-- id=100 (3)注意问题: 把数据写到文件后,在去修改类会产生一个问题。如何解决该问题呢 ? 在类文件中,给出一个固定的序列化 id值。而且,这样也可以解决黄色警告线问题 private staticvoid read() throws IOException, ClassNotFoundException { // 创建反序列化对象 ObjectInputStream ois = new ObjectInputStream( new FileInputStream( "oos.txt" )); // 还原对象 Object obj = ois.readObject(); // 释放资源 ois.close(); // 输出对象 System. out .println(obj); } privatestaticvoid write() throws IOException { // 创建序列化流对象 ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream( "oos.txt" )); // 创建对象 Person p = new Person( " 林青霞 " , 27); // public final void writeObject(Object obj) oos.writeObject(p); // 释放资源 oos.close(); } 什么是序列化 ? 答:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 --流数据(ObjectOutputStream) 什么是反序列化 ? 答:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。 流数据-- 对象 (ObjectInputStream) 随机访问流 RandomAccessFile类不属于流,是 Object类的子类。但它融合了 InputStream 和OutputStream 的功能。支持对文件的随机访问读取和写入。 public RandomAccessFile(Stringname,Stringmode) : 第一个参数是文件路径,第二个参数是操作文件的模式。 模式有四种,我们最常用的一种叫 "rw",这种方式表示我既可以写数据,也可以读取数据 private staticvoid read() throws IOException { // 创建随机访问流对象 RandomAccessFile raf = newRandomAccessFile("raf.txt" ,"rw"); int i = raf.readInt(); System. out .println(i); // 该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。 System. out .println(" 当前文件的指针位置是: " + raf.getFilePointer()); char ch = raf.readChar(); System. out .println(ch); System. out .println(" 当前文件的指针位置是:" + raf.getFilePointer()); String s = raf.readUTF(); System. out .println(s); System. out .println( " 当前文件的指针位置是: " + raf.getFilePointer()); // 我不想重头开始了,我就要读取 a,怎么办呢 ? raf.seek(4); ch = raf.readChar(); System. out .println(ch); } privatestaticvoid write() throws IOException { // 创建随机访问流对象 RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw" ); // 怎么玩呢 ? raf.writeInt(100); raf.writeChar('a'); raf.writeUTF("中国"); raf.close(); }

优秀的个人博客,低调大师

吴恩达《深度学习》第一门课(2)神经网络的编程基础

2.1二分类 (1)以一张三通道的64×64的图片做二分类识别是否是毛,输出y为1时认为是猫,为0时认为不是猫: y输出是一个数,x输入是64*64*3=12288的向量。 (2)以下是一些符号定义(数据集变成矩阵之后进行矩阵运算代替循环运算,更加高效) x:表示一个nx维数据,维度为(nx,1) y:表示输出结果,取值为(0,1); (x(i),y(i)):表示第i组数据; X=[x(1),x(2),……,x(m)]:表示按列将所有的训练数据集的输入值堆叠成一个矩阵;其中m表示样本数目; Y=[y(1),y(2),……,y(m)]:表示所有输入数据集对于的输出值,其维度为1×m; 2.2逻辑回归 (1)逻辑回归的输出值是一个概率,算法思想如下: (2)激活函数使用sigmoid,它使得输出值限定在0到1之间,符合概率的取值。 (3)关于偏置项(偏差)b,可将其变成θ0,对应的x0恒定为1,如下所示: 2.3逻辑回归的代价函数 (1)损失函数(针对单个样本): (2)代价函数(针对全部训练样本): 2.4梯度下降法 (1)下图中左边为凸函数,右边为非凸函数,逻辑回归中代价函数为凸函数,故任意的初始化都能收敛到最优点: (2)参数w、b的更新方式: 2.5导数 导数即斜率。 2.6跟多的导数例子 记住一些常见的导数求法或者直接查看导数表。 2.7计算图 (1)下图展示计算图计算的过程: (2)正向传播用于计算代价函数 2.8计算图的导数计算 (1)反向传播利用链式法则来进行求导,如对a进行求导,其链式法则公式为: 2.9逻辑回归中的梯度下降 针对于单个样本 (1)计算图如下: (2)首先计算da: (3)然后计算dz: (4)最后计算dw,db(下面的式子其实已经对所有样本进行的求导): 2.10m个样本的梯度下降法 (1)以下代码显示了对整个数据集的一次迭代 (2)以上过程会有两个循环,一个循环是循环是遍历样本,第二个循环是当w很多时是要循环的,上面之写出了两个w,所以没体现出来。 2.11向量化 (1)使用循环的方式计算:ωTx (2)使用向量的方式 后者不仅书写简单,更重要的是计算速度可以比前者快特别多。 2.12向量化的更多例子 (1)消除w带来的循环 设置u=np.zeros(n(x),1)来定义一个x行的一维向量,从而替代循环,仅仅使用一个向量操作dw=dw+x(i)dz(i),最后我们得到dw/m。 2.13向量化逻辑回归 (1)将样本x横向堆叠,形成X,同时根据python的广播性质(把实数b变成了(1,m)维),得到: (2)继续利用Python的计算方法,得到A: 2.14向量化logistic回归的梯度输出 (1)没有用向量化时使用的代码: (2)使用向量化之后的代码: 其中前面五个式子完成了前向和后向的传播,也实现了对所有训练样本进行预测和求导,再利用后两个式子,梯度下降更新参数。另外如果需要多次迭代的话,还是需要用到一个循环的,那是避免不了的。 2.15Python中的广播 (1)下图形象的总结了Python中的广播 (2)在Python的numpy中,axis=0是按照列操作,axis=1,是按照行操作,这一点需要注意。 2.16关于python_numpy向量的说明 (1)使用a=np.random.randn(5)生成的数据结构在python中称为一维数组,它既不是行向量也不是列向量,用a.shape的结果是(5,)这表示它是一个一维向量,a和它的转置相乘其实得到的是一个数。 (2)应该使用a=np.random.randn(5,1)这样生成的是一个行向量,它和他的转置乘积会是一个矩阵: 2.17Jupyter/iPython Notebooks快速入门 2.18(选修)logistics损失函数的解释 (1)首先需要明确,逻辑回归的输出表示y等于1的概率。故有: (2)合并成一个式子(要使得式子越大越好): (3)根据对数函数log的单调递增性,对上式取对数有: (4)要最大化上式,最小化上式取反,得到一个样本的损失函数。 (5)所有样本时,认为样本间独立同分布,故联合概率就是每个样本的乘积: (6)两边取对数得到: (7)要最大化上式(最大似然估计)也就是最小化: 总结一下:为了最小化成本函数J(w,b),我们logistic回归模型的最大似然估计的角度出发,假设训练集中的样本都是独立同分布的条件下。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册