跨容器的联邦学习-初步

Multi-Node 问题 镜像分发:VM2 无法读取 VM1 电脑里的 my-fl-app 镜像。 构建镜像,推送到镜像仓库 编排不同:K8s YAML是期望,而普通多容器项目定义的是service,每个service对应一个容器;k8s Yaml 的单位是Pod这可能包含多个容器 FL策略 同步(Synchronous 分发:Server 把模型发给选中的 $K$ 个 Client。 训练:所有 Client 开始训练。 等待 (Barrier):Server 必须等待所有(或指定比例)Client 训练完成并回传参数。 聚合:Server 收到最后一份报告后,进行加权平均,更新全局模型。 下一轮:进入下一轮循环。 该策略存储木桶短板问题,即训练耗时取决于性能最低的那一台机器 异步(Asynchronous 独立行动:Client 只要领到任务就去练,练完立刻上传。 即时更新:Server 收到任何一个 Client 的更新,就立刻更新全局模型,不需要等别人。 继续跑:该 Client 拿最新的模型继续下一轮,不管其他 Client 还在干嘛 该策略,存在模型陈旧 (Staleness)问题,假设当前全局模型是 $W_5$(第5版),VM2 跑得慢,它还在用 $W_2$ 训练,当 VM2 终于提交梯度时,Server 已经更新到 $W_{10}$ 了,用基于旧模型 $W_2$ 算出来的梯度,去更新新模型 $W_{10}$,可能会导致模型“指错路”,甚至发散。 Federated Averaging 每轮选取一组设备参与。 公式: $f(w) \triangleq \sum_{k=1}^{K} \frac{n_k}{n} F_k(w)$ $w$: 全局模型参数 $f(w)$: 全局视角下的损失。假如我们把所有 Client 的数据收集到一个巨大的中心服务器上训练,算出来的 Loss 就是 $f(w)$。 ...

December 9, 2025 · 4 min · 714 words · Bob

KNN & 聚类

KNN(k-Nearest Neighbours) KNN,是一种分类算法,无需训练,通过 输入数据点与训练集中距离其最近的k个数据点 的类别来判断当前数据点的类别;其中训练集数据被直接存储下来。 3种距离尺度 class kNN(): '''k-Nearest Neighbours''' # Initialise def __init__(self, k=3, metric='euclidean', p=None): self.k = k self.metric = metric self.p = p # Euclidean distance (l2 norm) def euclidean(self, v1, v2): return np.sqrt(np.sum((v1-v2)**2)) # Manhattan distance (l1 norm) def manhattan(self, v1, v2): return np.sum(np.abs(v1-v2)) # Minkowski distance (lp norm) def minkowski(self, v1, v2, p=2): return np.sum(np.abs(v1-v2)**p)**(1/p) # kNN 算法没有传统的“训练”阶段来学习模型参数。 # fit 方法只是简单地存储训练数据集 X_train(特征)和 y_train(标签),以便在预测时使用。 # Store train set def fit(self, X_train, y_train): self.X_train = X_train self.y_train = y_train # Make predictions def predict(self, X_test): preds = [] # Loop over rows in test set for test_row in X_test: nearest_neighbours = self.get_neighbours(test_row) majority = stats.mode(nearest_neighbours)[0][0]#返回一个出现最频繁的元素, preds.append(majority) return np.array(preds) # Get nearest neighbours def get_neighbours(self, test_row): distances = list() # Calculate distance to all points in X_train for (train_row, train_class) in zip(self.X_train, self.y_train): if self.metric=='euclidean': dist = self.euclidean(train_row, test_row) elif self.metric=='manhattan': dist = self.manhattan(train_row, test_row) elif self.metric=='minkowski': dist = self.minkowski(train_row, test_row, self.p) else: raise NameError('Supported metrics are euclidean, manhattan and minkowski') distances.append((dist, train_class)) # Sort distances distances.sort(key=lambda x: x[0]) # Identify k nearest neighbours neighbours = list() for i in range(self.k): neighbours.append(distances[i][1]) return neighbours k-Means 通过选择k个中心点,进行聚类。具体实施:初始化k个中心点(它们之间的距离尽可能的远),根据这些点进行聚类(遍历每一个数据样本 $x_i$,计算它到 $k$ 个中心点的距离,把它归类到距离最近的那个中心点所在的簇(Cluster)),分别根据簇中所有点的坐标(求平均)计算得到新的中心点,再次聚类,再次计算新的中心点,直到中心点不再更新或者中心点变化极小(小于我们设定的阈值) ...

November 24, 2025 · 3 min · 497 words · Bob

AGG16 & Unet

VGG16 结构 使用TensorFlows实现 def VGG16(input_shape=(224,224,3)): model = keras.Sequential([ keras.Input(shape=input_shape), layers.Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=64, kernel_size=(3,3), padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), #这里不same,则尺寸减半 layers.Conv2D(filters=128, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=128, kernel_size=(3,3), padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), layers.Conv2D(filters=256, kernel_size=(3,3),padding='same', activation='relu'), layers.Conv2D(filters=256, kernel_size=(3,3),padding='same', activation='relu'), layers.Conv2D(filters=256, kernel_size=(3,3),padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.Conv2D(filters=512, kernel_size=(3,3), padding='same', activation='relu'), layers.MaxPool2D(pool_size=(2,2), strides=(2,2), padding='valid'), layers.Flatten(),#展平 layers.Dense(units=4096, activation='relu'), layers.Dense(units=4096, activation='relu'), layers.Dense(units=4096, activation='softmax') ]) model.compile( optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['sparse_categorical_accuracy'] ) return model 在猫、狗二分类数据集上进行训练,测试,这里我们使用的是内置的预训练好的VGG16,进行微调即可 我们去掉了预训练的输出层(3个全连接层) 原vgg16 处理后的vgg16 # 设置测试集,训练集目录 test_dir="../input/dogs-cats-images/dog vs cat/dataset/test_set"train_dir="../input/dogs-cats-images/dog vs cat/dataset/training_set" train_dir_cats = train_dir + '/cats' train_dir_dogs = train_dir + '/dogs' test_dir_cats = test_dir + '/cats' test_dir_dogs = test_dir + '/dogs' # Preview first few images展示前6张图片 preview_cats = ["/cat.1.jpg", "/cat.10.jpg", "/cat.100.jpg", "/cat.1000.jpg", "/cat.1001.jpg", "/cat.1002.jpg"] preview_dogs = ["/dog.1.jpg", "/dog.10.jpg", "/dog.100.jpg", "/dog.1000.jpg", "/dog.1001.jpg", "/dog.1002.jpg"] print('Cats') plt.figure(figsize=(10,8)) #10,8 英寸 for i in range(6): im_cat = load_img(train_dir_cats + preview_cats[i]) plt.subplot(2, 3, i+1) #展示几行 每行展示几列 i+1 为图所在的子网格位置 plt.imshow(im_cat) plt.axis('off') plt.show() print('Dogs') plt.figure(figsize=(10,8)) for i in range(6): im_dog = load_img(train_dir_dogs + preview_dogs[i]) ax = plt.subplot(1, 6, i+1) plt.imshow(im_dog) plt.axis('off')#关闭当前子图的坐标轴、刻度和标签 plt.show() 数据加载: ImageDataGenerator 配合 flow_from_directory 方法,自动完成了将 ‘Cat’ 和 ‘Dog’ 文件夹名称转换为数字标签 0 和 1 的过程。 ...

November 20, 2025 · 3 min · 610 words · Bob

LeNet-5 & AlexNet

主要介绍LeNet 与 AlexNet,还 涉及到dropout, maxpooling, relu等概念 In this notebook we will motivate and implement from scratch two Convolutional Neural Networks (CNNs) that had big impacts on the field of Deep Learning. Namely, we will look at LeNet-5 (Yann LeCunn et al., 1989), which is considered one of the first CNNs ever and also AlexNet (Alex Krizhevsky et al., 2012), which won the 2012 ImageNet competition by an impressive marging and introduced many techniques that are considered state of the art even today (e.g. dropout, maxpooling, relu, etc). ...

November 16, 2025 · 7 min · 1353 words · Bob

ML-逻辑回归

输入x希望输出y=1的可能性最大 通过sigmod输出映射到0,1,其中0.5为分界线 逻辑回归,使用sigmod为激活函数的神经网络 Evaluating the cost function can be thought of as forward propagation and computing derivatives can be thought of as backpropagation. sigmod中权重越高,越自信,就是轻微的输入变化带来截然不同的结果 偏差的不同呢是的决策边界发生变化,就是说分界点改变了。 least squares不再适用(回归函数经过sigmoid,不再是Convex functions,即凸函数) Convex functions have the useful property that any local minimum is also a global minimum 第一幅为Convex functions,第二幅为非 Convex functions,后者的局部最小值不一定是全局最小值 logistic regression 使用 cross-entropy loss,这是它的凸函数 横轴预测值,竖轴损失:预测错误损失趋向无穷,预测正确损失为0 由最大似然 推出 交叉熵损失, 最大似然,思想是通过选择模型参数,使得 观测到的数据出现的概率最大。 ...

November 14, 2025 · 4 min · 682 words · Bob

Knowledge Graph & NLP Tutorial-(BERT,spaCy,NLTK)

NLP处理阶段 词法:切分为token uneasy” can be broken into two sub-word tokens as “un-easy”. 句法:1.检查句子结构有问题与否;2.形成一个能够体现词间句法关系的结果 eg: “The school goes to the boy” 语义:语义是否正确 semantic analyzer would reject a sentence like “Hot ice-cream” Pragmatic :歧义,中选择一个意思 知识图谱 存储提取的信息的一种方式。存储结构一般包括:a subject, a predicate and an object(主谓宾) 这些技术用于构建知识图谱 sentence segmentation, dependency parsing, parts of speech tagging, and entity recognition. 抽取实体 从句子中抽取主语和宾语,需要特殊处理的是复合名称和修饰词。 抽取关系 从句子中提取“主要的”动词 完成此二者之后便可进行知识图谱的构建,构建时最好将每个关系单独构建一个图谱,这是为了更好可视化。 BERT 适用于少数据集,question answering and sentiment analysis 任务 ...

November 10, 2025 · 2 min · 409 words · Bob

语义分割

图片基础 一个图片通常表现为3维矩阵,长、宽、通道,其中长*宽构成了分辨率,而有多少个通道就相当于有多少个"调色板"页面,这些调色板共同构成了每个像素点的色彩。 eg:1080p的rgb图片,就是1920*1080,通道数为3,其中rgb分别可取(0-255);而单通道就是灰度图像,取值(0-255) CNN CNN【卷积 → 激活 → 池化】 视为一个基础块,其中卷积层的每一个卷积核(滤波器)都可以提取一个特征,而激活层的Re-LU可以将卷积后此特征不明显的值设为0,再经过池化层,保留更为显著的特征(从“精确位置”到“空间存在”)。 随着多层的卷积输出,通道数增加,长、宽降低,而通道意义也变为了不同特征的强弱分布,有多少种通道就对应着多少种特征; 池化操作减少特征图中 参数数量、保留显著特征,只描述哪一个区域有,而不用具体到点。 经过一些列的卷积、激活、池化操作,最终得到长、宽小,而通道数大的特征图 ,经过全连接,输出一个1*n的向量,其中n为分类的数量。 卷积操作 整个卷积层的输出是N张特征图堆叠在一起,形成一个新的三维张量。 输出形状: [新高度, 新宽度, 卷积核数量] 例如: [222, 222, 32] (使用了32个3x3卷积核,尺寸略有缩小)。 此时,张量发生了变化:通道数从原始的3(R,G,B)变成了32,这32个通道不再是颜色,而是32种不同的基础特征的强度分布图。 整体流程 CNN演变 这里我的描述的网络是去掉了全连接层的CNN FCN FCN做出的重要改变是将CNN中全连接换为解码器,保留了原有CNN中的编码器(卷积+池化),这样,原有的CNN用于分类的一维输出,就变为了 “一个高分辨率的、与输入尺寸对应的像素级分类图”。 跳跃连接 编码器中,越浅的层次,图片分辨率更高位置更精细,越深的层次,图片的分辨率更低,but语义信息丰富(知道“这是什么”,但不知道在哪) 在ResNet中的应用 flowchart TD subgraph A [编码器 - 卷积与下采样] direction TB A1[输入图像<br>HxWx3] --> A2[卷积与池化<br>H/2 x W/2 x 64] --> A3[卷积与池化<br>H/4 x W/4 x 128] --> A4[卷积与池化<br>H/8 x W/8 x 256] --> A5[卷积与池化<br>H/16 x W/16 x 512] --> A6[卷积与池化<br>H/32 x W/32 x 1024] end subgraph B [解码器 - 上采样与跳跃融合] direction TB B1[预测层<br>H/32 x W/32 x N] -- 2x上采样 --> B2[score pool4<br>H/16 x W/16 x N] A4 -- 跳跃连接1 --> C1[1x1 卷积<br>H/8 x W/8 x 256] -- 1x1 卷积 --> C2[score pool3<br>H/8 x W/8 x N] B2 -- 与 score pool3 相加 --> B3[融合特征<br>H/8 x W/8 x N] -- 8x上采样 --> B4[最终输出<br>H x W x N] end A6 -- 核心改变: <br>全连接层 -> 卷积层 --> B1 A5 -- 跳跃连接2 --> B2 反卷积(转置卷积) 解码器中用于还原图像到输出大小的部分。 ...

October 25, 2025 · 1 min · 171 words · Bob

机器学习的概统基础-01

基础知识补充: 期望 期望值,是指无限次重复一个随机实验,所能得到的长期平均结果。它是所有可能结果的概率加权和。 计算方法:每个可能的结果乘以其发生的概率,然后将所有乘积相加。 E(X)=∑[xi​⋅P(X=xi​)] (对于连续型变量,使用积分) 联系By大数定律 平均值和期望值通过大数定律 被深刻地联系在一起。 大数定律指出:当试验次数(样本容量 n)足够大时,样本的平均值 xˉ 会无限接近总体的期望值 E(X)。 这就像在掷骰子的例子中,你掷的次数越多,你的平均点数就越接近理论期望值3.5。 通过例子区分平均值和期望:平均值是对已经发生的数据的概括,而期望值是对未来可能性的预测 方差 方差 是衡量随机变量与其平均值(期望值)的偏离程度的量。它描述了数据的离散程度。 计算公式:对于一个随机变量 X,其方差 Var(X) 定义为: Var(X)=E[(X−E[X])2] 直观理解: 方差大:数据点散布得很开,远离均值。不确定性高。 方差小:数据点紧密地聚集在均值周围。不确定性低。 中心极限定理 中心极限定理描述的是样本平均值分布 正态分布 正态分布描述的是数据在其平均值附近波动 正态分布的期望为 μ 区别方差和标准差 后者反应了数据在平均值上下的波动范围,前者由于是后者的平方,更多的是反映数据的分散程度,方差越大,数据越分散。 条件期望 普通期望(无条件期望):E[y] 这是随机变量 y 的全局平均值。它回答的问题是:“在所有可能的情况下,y 平均来看是多少?” 例子:E[身高] = 全体中国成年男性的平均身高(比如175cm)。它不考虑任何其他信息。 条件期望:E[y | x] 这是在给定某些已知信息 x 的情况下,y 的条件平均值。它回答的问题是:“当我们知道了某个信息 x 后,y 平均来看是多少?” 例子:E[身高 | 年龄=10岁] = 已知一个男性年龄是10岁时,他的平均身高(比如140cm)。 核心思想:条件期望让我们能够根据已知信息,做出更精确、更“有条件”的预测。 条件期望随着条件的变化而变化: E[房价 | 面积=50平米] = 可能是 300万(小房子更便宜)。 ...

October 7, 2025 · 1 min · 164 words · Bob