- 博客(547)
- 收藏
- 关注
原创 Pycharm 连接 WSL 中安装的 tensorflow-2.12.0
tensorflow > 2.10 的 cpu 和 gpu 版本不进行区分,里面既有 cpu 版本又有 gpu 和 tpu 版本,所以只需要简单装一个 tensorflow 即可,但是想在 window 中使用 tensorflow>2.10 的 gpu 版本必须要在 wsl 环境下进行环境的搭建,同时为了开发方便,使用 pycharm 专业版配置连接 wsl 环境中的虚拟环境即可。
2025-03-31 12:01:06
876
原创 单机多卡分布式训练策略——MirroredStrategy
训练开始前,该策略在 N 个 GPU 上各复制一份完整的模型备份;每次训练传入一个 batch 的数据,将数据分成 N 份,分别传入 N 个计算设备(即数据并行);N 个计算设备在自己的内存中分别计算自己所获得数据的模型梯度;使用分布式计算的All-reduce操作,在所有 GPU 间高效交换梯度数据并进行求和,使得最终每个设备都有了所有设备的梯度之和;使用梯度求和的结果更新各个 GPU 中的模型权重;因为该策略是同步的,所以只有当所有设备均更新模型后,才进入下一轮训练。
2025-03-31 11:32:10
462
原创 tensorflow 2.10 实现 AutoEncoder 生成图像
使用 tensorflow 2.10 实现 AutoEncoder 模型,还原生成 MNIST 图片。
2025-03-28 14:33:04
393
原创 使用 Transformer 完成 IMDB 情感分类任务
本文使用简单的 Transformer Block 实现对影评文本数据 IMDB 的情感分类任务。
2025-03-25 09:11:07
402
原创 LSTM 预测苹果公司收盘价并进行回测
最近学习量化交易,所以试着写一个回测脚本。本文使用的是苹果公司的历史股票数据,定义了一个简单的回测策略,先使用历史股票数据进行回测,然后再使用模型预测的股票数据进行回测。
2025-03-24 16:32:02
677
原创 mini GPT 实现文本生成
本文主要展示了如何实现微型的 GPT 模型完成文本生成任务,该模型只由 1 个 Transformer 块组成。
2025-03-21 15:02:04
1133
原创 MobileNet+Milvus 完成对街景图片的精确搜索(二)
书接上回,这次我对图像进行了复杂的变换操作,然后使用相关技术完成图片的精确搜素。
2025-03-19 09:00:12
942
原创 MobileNet+Milvus 完成对街景图片的精确搜索
最近遇到了一个需求,就是在一批街景图片数据中,输入一张图片进行比较精确的图片搜索。之前本来想使用孪生网络来解决这个问题,但是(上一篇文章写了这个,感兴趣的同学可以前往)需要同时输入一对图片,这是个缺陷(也可能是我的能力有限想偏了),好像不能解决我的问题。我的需求只能是输入一张图片,然后在图片库中进行搜索,所以经过试验,想到了使用tfhub中预训练的模型MobileNet对图片库中所有的街景图片先进行特征提取,然后将特征提取结果存入向量引擎Milvus。
2025-03-19 08:58:06
541
原创 tensorflow 孪生网络计算卫星图像的相似度
首先需要说明的是我自己将数据进行了处理,放到了 maps 目录之下,总共有 6582 张图像,每张图像会通过随机旋转得到两个不同的图像(这里只是为了实现简单的任务,只是对原图像进行了旋转,如果是比较复杂的任务,需要将图像经过反转、放缩、仿射、裁切等操作),并且这三个图像的名字是三个相连的数字,也就是说文件夹中每 3 个相连的图片是有关系的一组图片。索引为 9 的验证集数据和预测标签如下,可以看出这两个图片与预测值是对的,很明显这两个是相关的图像,右边的图像是左边图像经过向左旋转得到的。
2025-03-18 08:35:31
1012
原创 tensorflow 实现图像搜索引擎
获取相似的图像是当下搜索引擎的一个重要功能,在本次任务中,我使用 LSH 算法,在预训练图像分类模型 Bit 基础上,实现简单的图像搜索功能。实现过程比较简单,容易理解,是个值得上手练习的案例。
2025-03-18 08:32:24
546
原创 leetcode 2353. Design a Food Rating System(python)
时间复杂度主要消耗在 c2f 中的 SortedSet 的排序上,时间复杂度为 O(NlogN)。先分析 highestRated 函数,它的主要功能是返回 cuisine 菜系中评分最高同时字典顺序最小的菜名,我们为了便于取菜系对应的菜,肯定要用到字典,但是菜系对应的菜要根据分数和名字排序,我们可以借用 SortedSet 的数据结构来解决,我们定义为 c2f ,这样就可以直接调用结果值,时间复杂度为 O(1)。整个解法的时间复杂度为 O(NlogN) ,空间复杂度为 O(N)。
2024-12-12 11:05:32
503
原创 leetcode 2354. Number of Excellent Pairs(python)
从上面可以发现其实题目中要求的运算可以转化为两个数字的二进制表示中出现的 1 的个数之和。我们先将 set(nums) 中的每种数字算出其自身的二进制表示的 1 的个数,然后我们对其进行计数为 counter ,counter 中的 key 是可能出现的 1 的个数,value 表示的是能出现二进制中 1 的个数为 key 的不同十进制数字的个数。返回不同的优秀数字对的数量。函数 c 的时间复杂度基本是常数级别,主要的时间耗在了双重循环上面,时间复杂度为 O(N^2) ,空间复杂度为 O(N)。
2024-12-12 11:05:00
329
原创 leetcode 2357. Make Array Zero by Subtracting Equal Amounts(python)
在写代码的时候有些细节需要注意,时间复杂度为 O(NlogN) ,空间复杂度为 O(1)。根据题意,给定一个非负整数数组 nums。返回使 nums 中的每个元素都等于 0 的最小操作数。您的支持是我最大的动力。
2024-12-09 09:09:24
377
原创 leetcode 2358. Maximum Number of Groups Entering a Competition(python)
上面的写法比较啰嗦,我们可以换一个更简单的思路,我们已经知道了想要构成 n 组,就需要 n(n+1)//2 个人的成绩才行,而我们手上只有 N 个成绩,所以我们先构造出一个数组 L , L[i] 就是构造 i 个组需要的成绩数量,然后我们使用手上的 N 找到 L 中大于等于 N 的数字的索引 i ,如果 L[i] 刚好等于 N 说明刚好能组成 i 组直接返回即可,如果 L[i] 大于 N 说明不能组成 i 组返回 i-1 即可。时间复杂度为 O(NlogN),空间复杂度为 O(N)。
2024-12-09 09:08:51
739
原创 leetcode 2359. Find Closest Node to Given Two Nodes(python)
返回从 node1 和 node2 都可以到达的节点的索引,使得从 node1 到该节点的距离与从 node2 到该节点的距离之间的最大值最小化。如果有多个答案,则返回索引最小的节点,如果不存在可能的答案,则返回 -1。如果没有出边,则 edges[i] == -1。我们定义 BFS 函数,分别找出 node1 和 node2 到可达节点的距离列表 L1 和 L2 ,如果不存在可达距离则为 inf ,这两个列表长度一样,所以直接遍历对应的元素,找出最小的最大值的索引,这个索引就是题目中要找的节点索引。
2024-11-29 16:15:08
1096
原创 leetcode 2360. Longest Cycle in a Graph(python)
该图用给定的大小为 n 的 0 索引数组 edges 来表示,表示从节点 i 到节点 edges[i] 有一条有向边。该图用给定的大小为 n 的 0 索引数组 edges 表示,表示从节点 i 到节点 edges[i] 有一条有向边。我们先用字典 d 找出路每个节点的下一个节点,定义 memo 来记录已经遍历过的节点,然后使用 BFS 来依次从 0 节点开始找可能存在的环的长度,并不断更新最后的结果 result ,遍历完所有的节点之后返回 result 即可。如果不存在循环,则返回-1。
2024-11-29 16:14:33
364
原创 leetcode 2363. Merge Similar Items(python)
这道题其实就是考察字典的常规统计应用,我们分别遍历 items1 和 items2 中的 value 和 weight ,是用字典 d 对 value 的 weight 进行统计,然后将得到的 d 中的键值对变化为列表存到 result 中,最后对 result 进行生序排序返回即可。返回一个二维整数数组 ret,其中 ret[i] = [valuei, weighti],其中 weighti 是所有值为 valuei 的项目的权重之和。时间复杂度为 O(N) ,空间复杂度为 O(N)。
2024-11-28 16:36:38
386
原创 leetcode 2364. Count Number of Bad Pairs(python)
所以总的对数就是 N * (N-1) // 2 ,然后我们计算正确的对数,根据公式我们知道 nums[i] - i == nums[j] - j 即可,其实 i 就是 j ,我们去计算每个元素减去其索引的结果 nums[i] - i 即为 k ,k 出现的次数为 v ,然后使用计数器统计找出出现次数大于 1 说明有能组成 v*(v-1)//2 个正确对,我们将出现不同 k 的所有的正确对数计算出来,再使用总的对数减去所有正确的对数就能算出来错误的对数有多少。返回以 nums 为单位的错误对的总数。
2024-11-28 16:35:59
259
原创 leetcode 2365. Task Scheduler II(python)
根据题意,给定一个 0 索引的正整数数组 tasks ,表示需要按顺序完成的任务,其中 tasks[i] 表示第 i 个任务的类型。另外还给到一个正整数 space ,它表示在完成某一项任务后必须休息的最少天数,然后才能执行另一项相同类型的任务。其实这道题我们直接按照题意进行模拟过程即可。时间复杂度为 O(N) ,空间复杂度为 O(N)。返回完成所有任务所需的最少天数。您的支持是我最大的动力。
2024-10-16 09:39:54
487
1
原创 leetcode 2366. Minimum Replacements to Sort the Array(python)
其实这道题就是考察贪心,我们想要最后的结果是非递减顺序,那就只需要从前往后进行变化,并且使得变化后的最小数字最大即可。根据题意,给你一个 0 索引的整数数组 nums。在一个操作中,您可以将数组中的任何元素替换为任何两个相加的元素。返回以非递减顺序排序的数组的最小操作数。时间复杂度为 O(N) ,空间复杂度为 O(1)。您的支持是我最大的动力。
2024-10-16 09:36:47
621
原创 leetcode 2367. Number of Arithmetic Triplets(python)
其实这道题目说过 nums 元素严格递增,这里面已经暗示了所有的 nums 元素都是不同的,然后我们只需要遍历 nums 中的每个元素 x ,如果 x-diff 存在于 nums 中并且 x+diff 存在于 nums 中,那就说明这个三元组是唯一的,结果 result 加一即可,遍历结束返回 result。当然了,因为我们知道了 nums 中的元素都不同,为了提高速度,我们可以把 nums 变成集合,这样我们在查找元素的时候时间复杂度为 O(1) ,整体的时间复杂度变成了 O(N)。
2024-10-15 10:35:16
480
原创 leetcode 2368. Reachable Nodes With Restrictions(python)
其实这道题考察的就是 BFS ,我们首先要遍历所有的 edges ,将节点之间的边保存到字典 d 中,然后我们定义一个集合来保存可以访问的节点集合 result ,然后我们使用 BFS 的思路从节点 0 开始不断去访问非 restricted 的节点,并不断保存入 result 中,遍历结束我们返回 result 得长度即可。根据题意,有一棵无向树,其 n 个节点标记为从 0 到 n - 1 和并且有 n - 1 条边。返回可以从节点 0 开始可以到达的所有节点数,而无需访问受限节点。
2024-10-15 10:34:45
485
原创 leetcode 2369. Check if There is a Valid Partition For The Array(python)
这道题其实就是考察动态规划,我们可以定义 dp ,dp[i] 表示前 i+1 个字符是否能分割合法,然后我们先使用上述的三条规则对 dp 前三个元素进行判断,然后我们再从 nums 的第四个元素开始不断遍历,并且回顾并判断 dp[i-1]、dp[i-2]、dp[i-3] 和 nums[i-2]、nums[i-1]、nums[i] 之间的关系是否合法来更新 dp[i]。根据题意,给定一个 0 索引的整数数组 nums。如果 nums 经过划分后的所有子数组符合上面条件返回 true。
2024-10-14 09:17:03
863
原创 leetcode 2370. Longest Ideal Subsequence(python)
返回最长的理想字符串的长度。子序列是可以通过删除一些或不删除字符而不改变剩余字符的顺序从另一个字符串派生的字符串。请注意,“a” 和 “z” 的字母顺序的绝对差异是 25 ,而不是 1。根据题意,给定一个由小写字母组成的字符串 s 和整数 k。时间复杂度为 O(N*2k),空间复杂度为 O(150) ,也就是 O(1)。您的支持是我最大的动力。
2024-10-14 09:16:33
410
原创 leetcode 2373. Largest Local Values in a Matrix(python)
根据题意,给定一个 n x n 整数矩阵 grid。这道题其实就是考察卷积神经网络中的池化,我们只需要对不同的九宫格取最大值,然后将这些最大值组合起来就是最后的结果矩阵。换句话说,我们想在网格中的每个连续 3 x 3 矩阵中找到最大值。时间复杂度为 O(N^2 * 9) ,空间复杂度为 O(N^2)。您的支持是我最大的动力。
2024-10-12 09:11:18
678
原创 leetcode 2374. Node With Highest Edge Score(python)
该图由长度为 n 的给定 0 索引整数数组 edges 表示,其中 edges[i] 表示从节点 i 到节点 edges[i] 存在有向边。节点 i 的边缘得分定义为所有具有指向 i 的边的节点的标签的总和。返回具有最高边缘分数的节点。如果多个节点具有相同的边缘分数,则返回索引最小的节点。其实这道题看起来是个图,但是真的和图算法一点关系都没有,我们只需根据 edges 将每个节点周围指向它的其他周围节点找到并计算标签和,然后根据此标签和进行排序即可,取和最大并且节点标签最小的节点标签返回即可。
2024-10-10 09:21:34
466
原创 leetcode 2375. Construct Smallest Number From DI String(python)
遍历 pattern 结束,最后将 L[0] 这个此时可用的最小数字拼接到 result 即可。最后返回 result。时间复杂度为 O(N^2) ,空间复杂度为 O(N)。根据题意,给定一个长度为 n 的 0 索引字符串模式,其中包含字符“I”表示增加,“D”表示减少。返回满足条件的字典序最小的可能字符串 num。您的支持是我最大的动力。
2024-10-10 09:21:04
558
原创 leetcode 2376. Count Special Integers(python)
这道题考察的是数位 DP ,可惜我不会做,大家直接看灵神的代码吧,我解释无非就是重复一次他的话 https://leetcode.cn/problems/count-special-integers/solution/shu-wei-dp-mo-ban-by-endlesscheng-xtgx/。根据题意,如果一个整数的所有数字都是不同的,我们称它为特殊的正整数。给定一个正整数 n ,返回属于区间 [1, n] 的特殊整数的个数。您的支持是我最大的动力。
2024-10-09 09:08:11
599
原创 leetcode 2379. Minimum Recolors to Get K Consecutive Black Blocks(python)
根据题意,给定一个长度为 n 的 0 索引字符串 blocks ,其中 blocks[i] 是“W”或“B”,代表第 i 个块的颜色。在一次操作中,我们可以重新着色白色块,使其变为黑色块。返回所需的最小操作数,以便至少出现 k 个连续的黑色块。这道题直接使用滑动窗口的思想解题即可,因为已经告诉我们必须有 k 个连续的黑色块出现,所以我们每次取 k 大小的窗口在 blocks 上从左到右滑动,并且使用 result 来记录当前如果变成全黑色进行的最小操作并不断更新,遍历结束我们直接返回 result 即可。
2024-10-09 09:07:39
335
原创 leetcode 2380. Time Needed to Rearrange a Binary String(python)
我们具体分析例子就会发现,其实将 01 替换成 10 能看作将 1 向左移动一位的操作,如果 1 前面是 0 ,则会向左移动一位进行交换,但是碰到 11 却不能同时移动,右边的 1 比左边的 1 往左走到最终的位置会比左边的 1 多一秒。所以我们根据上面的思路从左到右遍历 s ,不断记录 1 前面的 0 的个数,当遍历到 1 ,就更新所用的最小时间 result ,最后遍历结束直接返回 result 即可。在一秒钟内,所有出现的“01”同时替换为“10”。空间复杂度为 O(1)。时间复杂度为 O(N)。
2024-10-08 10:45:59
545
原创 leetcode 2381. Shifting Letters II(python)md
所以关键就在于我们怎么求出差分数组,根据差分数组的规律,我们在遍历 shifts 的时候,对于区间 [start, end] 的所有元素都加 n 的操作,可以变为将 sub[start] 加 n ,将 sub[end+1] 减 n 的操作,这样遍历 shifts 结束就可以得到完成的差分数组 sub ,然后经过计算就可以得到差分数组的前缀和 cur ,这样就可以知道每个 s[i] 的最终移动方向和距离,只需要对每个字符经过简单的字符变换和拼接变成新的 result 即可。= 0,则向后移动字符。
2024-10-08 10:45:28
726
原创 leetcode 2383. Minimum Hours of Training to Win a Competition(python)
解决这道题目只需要模拟题意写代码即可,这道题的题目有些绕,但是关键点就在于对阵对手的时候经验和能力都要比他高才行,所以我们在对阵每一名选手的时候我们要定义两个临时变量 increase_energy 和 increase_experience ,如果发现当前的能量或者经验不比对手高,就要加上刚好超过对手的量才行,这些量都要计入结果 result 中,然后将当前的能量或者经验加上经过训练增加的量再与对手进行对阵即可,不断重复这个过程,最后返回 result 就是我们需要经过锻炼增加的最少的量。
2024-09-30 09:14:10
824
原创 leetcode 2382. Maximum Segment Sum After Removals(python)
模拟题意正向删除元素的做法不容易实现,我们进行逆向操作,想象一下我们有一个空数组 newNum ,然后不断往里按照逆序的 removeQueries 对应的 nums[i] 进行添加元素的操作,在添加元素的过程中,如果其左/右边界已经出现了相邻的段,则对左/右边相邻段进行合并,并更新段的左右边界和当前段的和,并且更新当前出现的最大的段的和加入到 result 中。返回一个长度为 n 的整数数组 answer ,其中 answer[i] 是执行了第 i 次删除操作后所能出现的最大段总和。
2024-09-30 09:13:37
508
原创 leetcode 2384. Largest Palindromic Number(python)
根据题意,给定一个字符串 num 仅由数字组成。返回可以使用从 num 中获取的数字形成的最大回文整数(以字符串的形式)。时间复杂度为 O(N) ,空间复杂度为 O(N)。您的支持是我最大的动力。
2024-09-26 09:10:09
379
原创 leetcode 2385. Amount of Time for Binary Tree to Be Infected(python)
这个题很明显整体需要 BFS 的方式进行解题,但是关键在于这是一颗树,我们要使用两个字典 parent 和 child 来记录每个节点的父节点和子节点有哪些,这个过程需要最基础的 DFS 进行解决,然后我们得到 parent 和 child 之后,就可以按照 BFS 的思路从 start 开始模拟病毒扩散的效果来解题,使用 result 来记录扩散时间即可。虽然代码量上比较大,但是很好理解,上半部分就是 DFS 过程,下半部分就是 BFS 过程。在第 0 分钟,感染从值为 start 的节点开始。
2024-09-26 09:06:21
496
原创 leetcode 2386. Find the K-Sum of an Array(python)
其实我们很容易就想到所有可能序列的最大和肯定是所有正整数的和 mxSum ,此时我们可以通过不断减小 mxSum 来取得可能的其他子序列的和,可能是加一个负数,也可能是减一个正数,但是对原数组 nums 都进行绝对值化之后得到 absNum ,我们发现其实本质上这个操作就都变成了减一个正数,这样不断减小 mxSum ,就能得到第 k 个大的序列和。解决这种问题最合适的数据结构就是堆 maxHeap ,每个堆的对象中存放的就是 (当前最大子序列和 curMnSum ,absNum 中下一个大的元素的索引)。
2024-09-25 09:17:44
1051
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人