跨容器的联邦学习-初步
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)$。 ...
docker部署web应用遇到问题
案例一:ap2部署 基础工作:使用阿里通义生成部署的docker文件和nginx文件。 1. 问题 服务器上的 Docker 版本过旧 (1.13.1),缺少 docker-compose 命令 通过docker解决 由于网络限制,无法从 Docker Hub 拉取镜像 首先使用阿里云加速docker,本地编译vue,将编译后的前端文件打包上传; python版本依赖问题 使用python list 得到全部包版本,交给LLM生成requirements.txt 浏览器访问前端,一直显示空白页面 清除浏览器缓存,by ctrl + shift + del 前端请求404 这个问题常见,多半是请求地址错误 2. 操作 部署和更新 1 2 3 4 5 6 7 8 9 10 11 12 13 # 构建并启动服务 docker compose -f docker-compose.prod.yml up -d --build # 查看服务状态 docker compose -f docker-compose.prod.yml ps # 下面涉及的命令默认dockerfile文件名为docker-compose.yml docker compose down #完全清理当前项目的容器环境,从头开始 docker compose build --no-cache frontend #重新构建名为"frontend"的服务镜像 docker compose up -d #启动所有服务并在后台运行,-d 或 --detach:后台运行模式 # 查看系统端口占用情况 netstat -tlnp | grep -E "(3000|8000)" 验证部署结果 检查容器运行状态: ...
Digital-CV
# 1. 安装核心依赖:vue-router, element-plus, element-plus图标 npm install vue-router element-plus @element-plus/icons-vue # 2. 安装样式预处理器(推荐) npm install -D sass # 3. 运行开发服务器 npm run dev 目录结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Digital-CV/ ├── node_modules/ ├── public/ │ └── favicon.ico (例如,网站的图标) ├── src/ (核心代码目录) │ ├── assets/ (静态资源:图片、字体、全局CSS) │ │ ├── images/ (项目截图、头像等) │ │ └── styles/ (全局样式或Sass变量文件) │ ├── components/ (小型、可复用的 UI 组件) │ │ ├── ProjectCard.vue (作品列表页使用的单个卡片) │ │ └── SocialLinks.vue (社交媒体链接图标组) │ ├── router/ (路由配置) │ │ └── index.js (定义所有路由路径) │ ├── views/ (完整页面组件 - 对应路由) │ │ ├── Home.vue (主页) │ │ ├── Resume.vue (简历页) │ │ ├── Projects.vue (作品列表页) │ │ └── ProjectDetail.vue (作品详情页) │ ├── App.vue (主布局文件:包含菜单和 <router-view>) │ └── main.js (入口文件:创建 Vue 实例、引入 Element Plus 和 Router) ├── .gitignore ├── index.html (Vite 入口 HTML 文件) ├── package.json └── vite.config.js 为了帮助你作为 Vue 初学者复现这个项目,我将核心技术点提炼为 5 个关键模块。你只要掌握这 5 点,就能把这个项目完整做出来,并且理解其中的逻辑。 ...
文章标题
📊 基础定义 TP:真正例 (True Positive) FP:假正例 (False Positive) FN:假负例 (False Negative) TN:真负例 (True Negative) 📈 核心指标公式 1. 准确率 (Accuracy) 2. 精确率 (Precision) 3. 召回率 (Recall) / 敏感度 (Sensitivity) 4. 特异度 (Specificity) 5. F1分数 (F1-Score) 6. 交并比 (IoU, Jaccard Index) IoU(Intersection over Union) IoU = |预测 ∩ 真实| / |预测 ∪ 真实| = TP / (TP + FP + FN) 区域重叠的精确度 高IoU(>0.8):边界对齐很好,区域匹配准确 低IoU(<0.5):要么漏检,要么多检,要么定位不准 收获1:语义分割的关键指标F1,IOU 收获2:使用TensorBoard实时观测训练情况和参数 小提示: 如果您进行了多次实验(例如修改参数 后重新训练),建议每次修改 save_dir 或者在 tb 下建立子文件夹(如 tb/exp1, tb/exp2),这样可以在 TensorBoard 中同时对比多次实验的曲线。 ...
A Neural Representation of Sketch Drawings
A Neural Representation of Sketch Drawings 以向量形式,生成连贯的涂鸦(低分辨率的)。 想法 以人的思维方式进行生成,具体是模拟控笔的动作:移动方向,提笔,结束绘画 什么是:unconditional and conditional generation of vector images composed of a sequence of lines. 数据 dataset 为笔画动作,每个点由5个元素表示,分别是偏移和状态,其中偏移是相对于上一个点的偏移,状态则包含:笔尖触纸、抬笔、结束绘画 方法 经过双向RNN 生成h,经过全连接层投影到$ \mu $和 $\sigma$,使用ex使得$\sigma$非负,再进行$z = \mu + \sigma \odot \mathcal{N}(0, I)$,其中$ \sigma \odot \mathcal{N}(0, I)$,是生成一个符合高斯分布的噪声,并使用$\sigma$进行放缩 为何这样做: Encoder 神经网络输出 $\mu$ 和 $\sigma$ 2,实际上是在告诉系统:“我认为这张草图在潜在空间里的位置大概在这里($\mu$),但我不太确定,允许的误差范围大概是这么大($\sigma$)。 z经过tanh ($[ h0 ; c0 ] = \tanh(W_z z + b_z)$)得到初始状态向量h0,c0,其中前者是初始隐藏状态,代表短期记忆或输出状态,后者是初始细胞状态(LSTM 特有的),代表长期记忆初始细胞状态(LSTM 特有的),代表长期记忆 hi的计算方法: 根据 $h_0$(零状态)和 $S_0$ 计算出 $h_1$。 ...
KNN & 聚类
KNN(k-Nearest Neighbours) KNN,是一种分类算法,无需训练,通过 输入数据点与训练集中距离其最近的k个数据点 的类别来判断当前数据点的类别;其中训练集数据被直接存储下来。 3种距离尺度 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 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)),分别根据簇中所有点的坐标(求平均)计算得到新的中心点,再次聚类,再次计算新的中心点,直到中心点不再更新或者中心点变化极小(小于我们设定的阈值) ...
NLP基础
NLP的核心任务:understanding and synthesizing NLP输入预处理 Tokenization Case folding 将输入统一大小写,以减少内存,提高效率 ,but可能创造歧义,so具体问题具体分析 For example "Green" (name) has a different meaning to "green" (colour) but both would get the same token if case folding is applied. Stop word removal 移除一些含义较少的词,同样提高效率,but可能造成语义不完整,具体问题具体分析 Examples include, "a", "the", "of", "an", "this","that".For some tasks like topic modelling (identifying topics in text), contextual information is not as important compared to a task like sentiment analysis where the stop word "not" can change the sentiment completely. ...
Transformer
1. 理论 输入 embedding words turning each input word into a vector using an embedding algorithm. 问题:The size of this list is hyperparameter we can set – basically it would be the length of the longest sentence in our training dataset. 最底层的编码器输入是 embedding words,其后都是其他编码器的输出 In the bottom encoder that would be the word embeddings, but in other encoders, it would be the output of the encoder that’s directly below BERT实践中也提到了这个,可以查看下 ...
AGG16 & Unet
VGG16 结构 使用TensorFlows实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 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,进行微调即可 ...
医学WSL病灶检测与语义分割
基础概念 弱监督:告知有,而不告知其位置 强监督:精确的告知其位置,明确有 MIL(多实例学习): Bag & Instance,其中前者是整张WSL,后者是切分出来的patch,若patch中有一张是不正常的,则整张WSL都是不正常的 这种MIL的问题在于,若用于病灶检测,可能无法检测出所有病灶,因为检测到一些病灶时就足以判断WSL是不正常的了。 方法: 传统方法:CAM/MIL 新方法:SAM 上手路径: