如何将 keras 模型转换成同样的 pytorch 模型
任务描述这个神奇的任务来自于工地上的一个奇葩需求:之前的一些基于 GRU 的 keras 模型需要成等价的 pytorch 模块,要求
模型权重和结构需要保持一致
模型需要嵌入一个更大的模型结构中,作为一个子模块,以进行后续训练
其中样例 GRU 用 keras functional API 构建,模型结构为:
123456789101112131415161718tf.keras.utils.set_random_seed(4396)X = tf.keras.layers.Input(shape=(60, 78), name='factor')x = Xx = tf.keras.layers.GRU(64, return_sequences=True, bias_initializer='glorot_uniform')(x)x = tf.keras.layers.GRU(64, ...
如何科学地在 keras 中构建模型
在 pytorch 中,我们一般通过继承 torch.nn.Module 类来构建模型,将子模块在构造函数 __init__ 中初始化,并在前向传播函数 forward 中,利用先前定义的子模块,定义网络的计算。
但是在 keras 中,事情并没有那么简单。诚然,一般的教程都会以简单的模型来开始;但是我们并不满足于简单的模型,所以会介绍到更复杂的 API。先说结论(太长不看):
简单模块用 Sequential 足矣
稍复杂网络结构用 functional API 构建网络
若非必要,不建议 使用继承类的方式构建网络
注意:以下基于 keras 2.X API 探讨,部分内容可能过于老旧
起手式:Sequential如果是能简单到能串糖葫芦的模型,那么直接用 Sequential 就行了,譬如下面的例子就是把三个线性层串在一起:
1234567891011121314import kerasfrom keras import layers# Define Sequential model with 3 layersmodel = keras.Sequential( [ ...
CryptoCTF 2024 tough 分类 团队解题 writeup
这次 tough 分类配合得不是很好,最后一个解方程的题目想复杂了,被他的题目设置有点弄晕了,所以到结束的时候都没有做出来。配合得不是很好~
Capac题目描述题目基于某一种神奇的曲线:
x^3 + c y^3 + c^2 z^3 - 3 c x y z = 1其中,如果 $z=0$ 的话(也就是题目的生成点 $G$ 满足的条件),$c = (1-x^3) / y^3$。
事实上,上面那个结论就是把 $z=0$ 代入到曲线定义式上面化简得到
然后定义点 $P(x_1, y_1, z_1)$ 和 $Q(x_2, y_2, z_2)$ 的加法:记 $R(x_3, y_3, z_3)=P+Q$,则
x_3 = x_1x_2 + c (y_1z_2 + y_2 z_1)y_3 = x_2y_1 + x_1y_2 + cz_1z_2z_3 = y_1y_2 + x_2z_1 + x_1z_2已知 $n = p^4 q^6$,$P(m_1, m_2, 0)$,计算 $Q=eP$。已知点 $Q$ 的坐标以及 $e$ 的值,求 $m_1, m_2$。
我的解答所以关键在于,求出该曲线的阶。
经过一些尝 ...
CryptoCTF 2024 easy 分类 团队解题 writeup
这次 easy 分类比赛的时候我当时看了一道 MD5 的,结果感觉很谜语,就没去仔细看了。要懂得把球传给队友
那么赛后就复盘一下
Alibos题目描述私钥 $s_k$ 为 $d_s$ 位十进制数,公钥 $p_k$ 可被写成如下形式:
p_k = \lfloor 10^{d_s} \left( \sqrt{s_k} - \lfloor \sqrt{s_k} \rfloor \right) \rfloor记 $p_k$ 为 $d_p$ 位十进制数
加密算法:
在 $m$ 的十进制表示中在右边加上很多个 1,使其成为 $d_p$ 位十进制数;
计算 c = \left( p_k + d_p^2 m \right) \bmod 10^{d_p}
给出 $p_k$ 和 $c$,试求 $m$。
我的解答首先可以求出 $d_p$ 的值,然后直接求出 $m$ 的值即可:
m = \left( c - p_k \right) d_p^{-2} \bmod 10^{d_p}代码如下:
123456789from Crypto.Util.number import *pkey = 85824355125 ...
CryptoCTF 2024 hard 分类 团队解题 writeup 之一
这次 hard 分类的题目难道是碳基生物能整出来的活儿???
Chochol题目描述题目基于 ECC:
E: y^2 = x^3 + ax + b128bit 素数 $p$ 和 $q$ 均满足 $p \equiv q \equiv 3 \pmod{4}$,$a$ 取随机,$b = 0$。
$E_p$ 和 $E_q$ 分别是 $E$ 在 $GF(p)$ 和 $GF(q)$ 下的情形。
生成元 $G_p$ 和 $G_q$ 的横坐标均为 2024。(MAN!)
然后有一个未知的 $s$,$H_p = s G_p$,$H_q = s G_q$
题目对明文的加密采用 RSA:
n = pqc = m^s \bmod n已知 $G_p, H_p, G_q, H_q, c$,求 $m$
我的解答首先是求出 $a, p, q$ 这三个值。以 $p$ 为例,将 $G_p(x_1, y_1)$ 和 $H_p(x_2, y_2)$ 代入椭圆曲线方程:
\left\{\begin{aligned}y_1^2 = x_1^3 + a x_1 \\
y_2^2 = x_2^3 + a x_2\end{aligne ...
CryptoCTF 2024 hard 分类 团队解题 writeup 之二
这次 hard 分类的题目难道是碳基生物能整出来的活儿???
O7R题目描述题目基于 RSA 和七!段!数!码!管!
题目给出了 $p, q, n, n^2$ 的七段数码管的 损坏形式,以及密文 $c$ 的七段数码管形式,其中一个数的七段数码管的损坏形式被定义为:这个七段数码管的每一位数都会以 50%的概率,某一段数码管本来要亮的,结果没亮了,如下就是一个数位 7 损坏了一个数码管的例子:
123456789 xxxx xxxxo x o oo x o oo x o o oooo -> oooo o x o xo x o xo x o x oooo oooo
题目没说 $e$ 是多少(可能要靠猜,譬如 $e=65537$),求明文 $m$。
我的解答当时比赛的时候,我没看这道题,未央、三顺七、苏氨酸当时还就被这个男的女的折磨,多捞哦!
这尼玛是碳基生物整得出的活儿?
首先得把他那个七段数码管切成数,至少转换成七段数 ...
CryptoCTF 2024 medium 分类 团队解题 writeup 之一
这次 medium 分类题量还是最多的,结果一开始里面很多题都不可解,甚至比赛结束了还 TMD 有一道零解。
我去年买了个表
Ahoo题目描述给定整数 $n$,找最小正整数 $c$ 使得 $nc$ 的二进制表示中 1 的个数最小。
我的解答这种问题看上去没有一个比较直观的解。一开始在想是不是要找 $k$ 使得 $n$ 为 $2^k+1$ 的约数,后面发现这个数应该不是所有的数都能找得出来的。这种时候就要学会 站在巨人的肩膀上了
记 $f(n)$ 为题目的答案,先写一个简单的脚(da)本(biao)得出 $f(n)$ 的前几项:
12345678910111213results = []for n in range(1, 15): min_c = 0 min_ones = 4396 for c in range(1, 200000): ones = sum(map(int, f'{n*c:b}')) if ones < min_ones: min_ones = ones ...
CryptoCTF 2024 medium 分类 团队解题 writeup 之二
这次 medium 分类题量还是最多的,结果一开始里面很多题都不可解,甚至比赛结束了还 TMD 有一道零解。
我去年买了个表
Duzly (x)题目描述已知 $p=2^{64} - 59$,下面的运算都在 $\mathbb{Z}/p\mathbb{Z}$ 中讨论。
已知 $c_1, c_2, \ldots, c_6$ 的值,且 $c_1 = 1$
已知 $e_1 = 2^{24} + 17, e_2 = 2^{24} + 3, e_3=3, e_4=2, e_5 = 1, e_6 = 0$
明文 $m$ 首先左右都被 pad 了随机长度的随机 bytes,然后被分成 8 个字节一组 $m_i$。已知 $h_i = \sum_{j=1}^{6}{c_j m_i^{e_j}}$,求 $m_i$
我的乱想这尼玛可做?
一个想法就是找一些不变量,通过一些手法把部分和的结果变到一个阶小的子群里面去,从而把原问题转换成某个多项式加上某个定值的形式,这样或许能缩小解的范围。
譬如将 $f(x) = \sum_{j=1}^{6}{c_j x^{e_j}}$ 拆分成 $g(x) + h(x)$,然后如果 ...
CryptoCTF 2024 medium 分类 团队解题 writeup 之三
这次 medium 分类题量还是最多的,结果一开始里面很多题都不可解,甚至比赛结束了还 TMD 有一道零解。
我去年买了个表
Melek题目描述给定素数 $p$。在 $GF(p)$ 下定义 $t$ 次多项式
f(x) = \sum_{i=0}^{n-1}a_i x^{i}其中 $a_0 = c = m^e \bmod p$,$e$ 已知。然后随机生成 $GF(p)$ 下 $t$ 个数 $x_1, x_2, \ldots, x_t$,并求出 $f(x_1), f(x_2), \ldots, f(x_t)$。已知 $(x_i, f(x_i)), i = 1, 2, \ldots, t$,求 $m$。
我的解答这一看就是 Shamir’s Secret Sharing,其背后的原理是拉格朗日插值定理,这里可以直接以矩阵的视角求出系数即可:
12345678910111213141516171819from Crypto.Util.number import *with open('output.txt', 'r') as f: exec(f.re ...
CryptoCTF 2024 medium 分类 团队解题 writeup 之四
这次 medium 分类题量还是最多的,结果一开始里面很多题都不可解,甚至比赛结束了还 TMD 有一道零解。
我去年买了个表
RM2题目描述题目需要我们和远程服务器交互:
我们需要提供 1024bit 的两个素数 $p, q$,而且 $p \ne q$
服务器提供 $e = 65537$,计算 $n = pq$
服务器生成一个随机的 256byte 可打印字符串 $s$,bytes_to_long 之后就是 $m$,且保证 $m < 4n$
将 $s$ 从中间劈两半成 $s_1, s_2$,分别 bytes_to_long 之后就是 $m1, m2$
计算 $c_1 = m_1^e \bmod (p-1)(q-1)$
计算 $c_2 = m_2^e \bmod (2p+1)(2q+1)$
已知 $c_1, c_2$,求 $s$;$s$ 的两部分必须同时求出来,不能一次只求一边。
我的解答首先可打印字符串是我们需要利用的一个判别条件。
然后因为有两个 $n_1 = (p-1)(q-1)$ 和 $n_2 = (2p+1)(2q+1)$,我们希望这两个玩意儿都能分解。所以我们为了方 ...