- 博客(205)
- 资源 (1)
- 收藏
- 关注
原创 tf.Keras (tf-1.15)使用记录4-model.fit方法及其callbacks参数
也可以通过继承类来创建自定义回调,允许在训练的不同阶段执行自定义的逻辑。# 每个 epoch 结束时执行print(f"结束 epochclass CustomCallback(tf . keras . callbacks . Callback) : def on_epoch_end(self , epoch , logs = None) : # 每个 epoch 结束时执行 keys = list(logs . keys()) print(f"结束 epoch {epoch } ,损失 = {
2025-02-01 19:38:23
1216
原创 tf.Keras (tf-1.15)使用记录3-model.compile方法
是 TensorFlow Keras 中用于配置训练模型的方法。在开始训练之前,需要通过这个方法来指定模型的优化器、损失函数和评估指标等。
2025-02-01 19:17:43
803
原创 tf.Keras (tf-1.15)使用记录2-基于tf.keras.layers创建层
注意需要继承tf.keras.layers.Layer父类,以及注意传入**kwargs关键字参数。self.add_weight方法是用来初始化模型参数的。# 使用自定义层创建模型MyDenseLayer(32, activation='relu', input_shape=(222,)), # 注意这个input必须指定])call函数的输入inputs就是固定的,build函数每次实例化只调用一次。')# 确保输入是一个包含三个元素的列表else:self.n = n。
2025-02-01 18:42:18
687
原创 tf.Keras (tf-1.15)使用记录1-基础模型创建的两种方法
tf.keras有两种神经网络的创建方法,分别是基于sequential的方式创建和基于functional的方式创建。其中基于functional的方式创建更为灵活,更容易自定义网络中的细节;基于sequential的方式创建则更加简单。
2025-02-01 17:29:16
200
原创 tf.keras保存.h5模型文件时报错“ValueError:Unable to create group(name already exists)“的解决方案
后来打印my_model的layer name,真的有上面说的这类问题。
2025-01-10 19:31:48
219
原创 Leetcode 983. 最低票价
这道题满足最大最小问题,大概率就是用动态规划。接着,发现当days长度为1时最简单,因此递推方向一定是从n到n-1。假设n-1的问题解决了,那就研究从n-1转移到n有几种不同情况,取动作的最小值即可。这道题自己写的有点麻烦,但是很朴素;有个技巧是按照天来递推而不是索引,这道题属于灵活转化索引与值的范畴。2、边界值容易搞混,要分清循环到终止点和循环到头这两种不同情况。1、循环的方向不要写反了。
2024-10-20 21:47:05
273
原创 Leetcode 486. 预测赢家
这道题最难的地方在于,需要把输赢建模成“净胜分”,这样就能把两个主体合并为一个主体去动态规划。在明白了这一点之后,5分钟就自己写出来了。这道题最开始想到的做法是回溯,因为看起来遍历就可以做,但是又想到同时需要维护两个人的数据就有点懵了。后来提示说用动态规划做是OK的。这道题的本质和hot100里那个 乘积最大子数组 需要区分正负数一样,这里也需要区分两个人来分别递推。1、注意当递推到第二个人手里时,需要求得是一个最小值而不是最大值。
2024-10-09 21:23:11
498
1
原创 深度学习与数学归纳法
这个思想其实和数学归纳法里面的先假设某个条件成立,再去做其他事情,然后再反过来优化这个条件很像,也和EM估计的思想很像。最近发现,深度学习可以分为两个主要的阶段,分别是前向推理以及反向传播,分别对应着网络的推理和参数训练两个步骤。这也可以解释为什么很多网络结构的改进的论文,本质上是提供了参数交互的接口,让网络有机会对某种类型的数据进行建模和表征,然后再去对其进行训练。在做参数训练的时候,本质上是在利用历史数据求网络参数的先验分布;在推理的时候,本质是在基于训练好的参数进行极大似然估计。
2024-09-28 13:19:44
696
原创 均匀合并列表
这道题可以按照两两合并的归并思路来做,不过最优的做法还是将元素转化为索引的优先级来通过排序解决。给定一个二维列表,均匀合并成一个一维列表,使得列表中原始元素所在位置尽可能均衡。
2024-09-27 22:30:30
230
原创 Leetcode 3290. 最高乘法得分
1、第一次做周赛的题,第一眼发现和之前hot100里面有一道两个子序列的dp很像,写完之后发现又是像之前一样超时,大概97ac。这道题最神奇的地方在于,如果下面这个递推的max顺序反过来就会超内存。感觉用递归解动态规划还是有一定的限制的其实。而且下面这个解答的初始判断条件的顺序也不能变,第一感觉dp问题好像用递归性价比不是很高。2、看了灵神的题解,发现主要问题出在建模没建好,还是应该以选or不选去考虑递推。3、在dp中还是尽量少用循环去表示选哪个的方式。
2024-09-15 21:23:58
312
1
原创 全面理解tensor编程中矩阵的行和列
c = torch.matmul(a, b.transpose(2, 3)) # 交换b的2,3两个维度注意.dot方法只适用于两个向量的点积运算, torch.matmul是矩阵乘法运算。
2024-09-15 13:38:47
556
原创 python dir()函数
这是一个非常神器的函数,作用是解析某个对象或者类的所有内置方法,非常好用。当某些包忘记要引用的具体拼写时,也可以用dir来看。这个东西真是编程的神器。
2024-09-15 00:34:31
383
原创 Leetcode 146. LRU 缓存
1、这道题本质是要求一个可以排序的字典(因为O(1)的时间复杂度就是字典),所以要不就用collections自带的OrderDict,要不然就用字典加双头链表自己实现一个。.move_to_end(key, last=False):把元素后移一位,last=True的话就是移动到最后。.popitem(last=True):把最后位置的元素pop出去。
2024-08-31 12:49:40
598
原创 Leetcode 621. 任务调度器
2、思路:先统计最大频率出现的元素用来做分隔板,然后再去考虑插入的问题,与排列组合的思想一致。1、这道题是一个贪心算法,解法主要是按照排列组合里的插入方法去思考。
2024-08-31 12:06:54
495
原创 深度学习中Embedding的理解
Embedding的加法一般用于同类目的合集表示。就是因为不同one-hot做加法之后得到的向量可以反过来推断出包含了哪些向量,虽然序列信息无法放到里面。Embedding这个概念翻译过来的意思就是嵌入,就是把一个大的东西想办法嵌入到一个小的地方。例如,历史时间一般会按照1天内,7天内,30天内,一年内进行离散化再去embedding。此外,Embedding还多用于多模态特征的融合,因为多种模态数据最后都是汇聚到向量表示。Embedding拼接一般用于不同类目的合集,一般用拼接的方式放到神经网络去。
2024-08-29 00:36:34
598
原创 Leetcode 46.全排列
1、回溯本质就是搜索树的树枝,维护三个核心变量:path(需要恢复现场),visited(需要恢复现场),以及res。
2024-08-23 14:15:15
270
原创 PyTorch踩坑记录1
因为model.eval()控制self.training参数,只有用nn.Dropout(0.5)声明才能在调用model.eval()后关闭,用F.dropout(x, p=0.5)是没办法自动关闭的,需要手动把self.training的参数传入到F.dropout()里才行。网上查到是因为model.eval()会影响继承nn.module类的self.方法的训练和测试,但是F.dropout更像是一个函数没继承nn,module。
2024-08-22 21:48:41
379
原创 注意力机制和门控机制的区别
感觉理解好注意力机制,还是得从mlp -> rnn -> gru -> seq2seq -> encoder-decoder -> attention ->mha ->transformer的顺序,以及序列的角度去理解。门控机制的核心是sigmoid或者tanh,指的是单纯的对权重进行归一化,非常平滑,并且不同样本同一特征维度之间没有比较。两者有个相似点就是本质上都是给原始特征乘上一定的权重值进行特征变化,并且这个变换都是元素维度的变换(最后一步都是按位乘法做特征融合)。
2024-08-15 21:03:45
2197
原创 控制和PID的原理
微分增益 ( K_d ) 决定了误差变化率对控制器输出的影响。微分控制可以预测误差的趋势,从而提高系统的响应速度和稳定性,但对噪声敏感。比例增益 ( K_p ) 决定了误差对控制器输出的直接影响。较高的比例增益会导致较快的响应,但如果过高,可能会导致系统不稳定。PID控制器的输出 ( u(t) ) 是输入误差 ( e(t) ) 的比例、积分和微分的加权和。积分增益 ( K_i ) 决定了累积误差对控制器输出的影响。是误差,即设定值与实际值之间的差异:( e(t) = r(t) - y(t) )。
2024-08-15 13:28:56
569
原创 简单乘法attention做特征融合加权平和
将两个embedding信息进行融合最常见的方式就是加法,因为按照onehot的形式去考虑,加法能够映射出当前embedding的唯一组合形式(虽然无法看出序列关系)。里面线性层的定义最好在初始化函数定义,这个实现方式用到了batch forward的技巧。代码实现是先把两个张量拼接,然后再通过线性层计算权重,然后再去softmax。
2024-08-11 18:34:11
393
1
原创 一个解决问题的编码思路(编程+AI向)
3、超参数方面的搜索。包括两个层面,首先在原型系统开发时应该给模型留一个类似try的超参数,用来尝试不同网络结构、损失函数的组合下模型的大概效果,一般设置手动搜索即可。其次是学习率、批归一化大小的搜索,最好采用网格搜索的方式进行自动搜索。2、方法、原理层面的搜索,定位大概要使用哪一类方法,以及方法的基本原理是什么。1、 问题层面的搜索,定位要解决的问题大类、小类,知道问题的scope在哪里,相关工作都是怎么解决的。简单记录一个最近想到的解决问题的思路,忽然想到的,有点抽象,先记下来。
2024-08-08 10:24:24
293
原创 算法题代码运行时间复杂度估计
总结一下关于问题规模(n大小)与算法时间复杂度要求的关系,有时候通过问题规模就可以判断出这道题需要用什么算法。这样判断的一个好处就是可以很自然地从暴力求解的思路入手,逐步展开优化,更符合实际编程环境下的思维习惯,毕竟在实际开发时很少会真的直接想到用双指针或者动态规划解决一个编程问题。所以一般给出n的范围的地方都叫做’提示’
2024-05-06 06:06:18
863
原创 Leetcode 32. 最长有效括号
本以为要用动态规划,但是递推有点太难了;主要是第一反映hard题不能就一个栈就解决吧,结果还真就是一个栈解决了。1、在最后计算间隔时,需要前后放-1和len(s),以维持循环不变量原则。括号问题还是得栈入手,这道题考察栈+哈希表思想(其实就是数组索引)
2024-05-02 04:18:09
383
原创 Leetcode 76. 最小覆盖子串
这道题一开始以为要用动态规划来解,但是结合题目中需要返回的是最短子串本身而不是长度,因此在对于字符串s建模时至少需要维护i和j两个变量,再加上这道题没有明显的递推。c. slow驱动下一次fast更新的规则:slow指针’多‘移动一位,使得当前元素又不满足fast停下的规则了,同时让fast加1。1、这道题的难点在于边界条件,需要让fast指针停在刚好满足条件的地方,然后再用slow驱动fast。a. fast指针的更新规则:向右移动直到窗口包含了所有t中的元素。这道题是滑动窗口双指针经典问题。
2024-04-24 20:42:28
354
原创 Leetcode 42. 接雨水
这道题很久之前在看数组前缀的专题的时候见过,是一道典型的用数组前缀最大值来解决问题的题。感觉应该算是贪心思维吧。凭着之前记着的求解思路把这道题写了出来,说实话要是没遇到过这种类型的第一次见的话自己想出来这个贪心解法还是有点困难的。1、在求后缀最大值时,最好采用post_max[i] = x的赋值方式而不是post_max.append(x)
2024-04-23 04:05:20
397
1
原创 Leetcode 28. 找出字符串中第一个匹配项的下标
1、注意边界条件是匹配串needle到头,但是haystack不一定需要到头。两个字符串匹配的问题基本都可以用动态规划解决,递推关系就是依次匹配下去。2、这道题按照从i开始的字符串而不是从i结束的进行DP建模。
2024-04-19 00:55:38
256
2
原创 Leetcode 53. 最大子数组和
子数组的和是可以通过前面的和加上当前值递推获得,所以可以用动态规划解决这道题。1、这道题再获取最大值时res不能用0而需要用负无穷初始化。
2024-04-18 17:00:43
404
原创 Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
这道题最难的地方在于需要‘课题分离’,把查找出满足target的第一个元素的二分查找函数分离出来,然后再加一些细节即可。
2024-04-18 16:52:18
314
pyqt_diaoyong_multiwindow.zip
2019-06-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人