在huggingface上制作小demo
在huggingface上制作小demo
今天好兄弟让我帮他搞一个模型,他有小样本的化学数据,想让我根据这些数据训练一个小模型,他想用这个模型预测一些值
最终我简单训练了一个小模型,起初想把这个模型和GUI界面打包成exe发给他,但是发现打包后3.9GB,太大了吧!!!后来我又找了别的方案,即将训练好的模型以及相关代码、环境配置文件上传到huggingface上,通过hf的界面端直接使用这个模型,接下来我回顾一下整个流程
1.训练模型并写一个简单的GUI
训练数据
模型输入值:substance、N、C、C/N、K、Cellulose、Hemicellulose、Lignin
模型输出值:Alkaliniy400、Alkalinity600
训练代码train.py
由于样本较小,为了减小误差,这里采用5折交叉验证
import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import TensorDataset, DataLoader
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler, OneHotEncoder
import joblib# 定义神经网络模型
class AlkalinityNet(nn.Module):def __init__(self, input_dim):super(AlkalinityNet, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, 64),nn.ReLU(),nn.Dropout(0.2),nn.Linear(64, 32),nn.ReLU(),nn.Dropout(0.2),nn.Linear(32, 2) # 输出两个值:400℃ 和 600℃ 碱度)def forward(self, x):return self.model(x)def train_model(model, train_loader, criterion, optimizer, device):model.train()running_loss = 0.0for X_batch, y_batch in train_loader:X_batch = X_batch.to(device)y_batch = y_batch.to(device)optimizer.zero_grad()outputs = model(X_batch)loss = criterion(outputs, y_batch)loss.backward()optimizer.step()running_loss += loss.item() * X_batch.size(0)return running_lossdef evaluate_model(model, val_loader, criterion, device):model.eval()running_loss = 0.0with torch.no_grad():for X_batch, y_batch in val_loader:X_batch = X_batch.to(device)y_batch = y_batch.to(device)outputs = model(X_batch)loss = criterion(outputs, y_batch)running_loss += loss.item() * X_batch.size(0)return running_lossdef main():# 读取 Excel 数据data = pd.read_excel('~/PycharmProjects/Alkalinity/datasets/data.xlsx')# 假设第一列为物质名称,列名为 "Substance"# 数值特征num_features = ["N", "C", "C/N", "K", "Cellulose", "Hemicellulose", "Lignin"]targets = ["Alkalinity400", "Alkalinity600"]# 提取物质类别和数值特征substances = data["Substance"].values.reshape(-1, 1)X_num = data[num_features].valuesy = data[targets].values.astype(np.float32)# 对物质类别使用 OneHotEncoder 编码encoder = OneHotEncoder(sparse_output=False, handle_unknown='ignore')X_cat = encoder.fit_transform(substances)joblib.dump(encoder, 'encoder.pkl')# 对数值特征进行标准化scaler_X = StandardScaler()X_num_scaled = scaler_X.fit_transform(X_num)joblib.dump(scaler_X, 'scaler_X.pkl')# 拼接类别特征和数值特征X_combined = np.hstack([X_cat, X_num_scaled]).astype(np.float32)# 对目标值进行标准化scaler_y = StandardScaler()y_scaled = scaler_y.fit_transform(y)joblib.dump(scaler_y, 'scaler_y.pkl')# 转换为 PyTorch tensorX_tensor = torch.from_numpy(X_combined)y_tensor = torch.from_numpy(y_scaled)# 设置设备device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 交叉验证设置kf = KFold(n_splits=5, shuffle=True, random_state=42)num_epochs = 100batch_size = 8criterion = nn.MSELoss()fold_losses = []print("开始 5 折交叉验证...")for fold, (train_index, val_index) in enumerate(kf.split(X_tensor), 1):X_train, X_val = X_tensor[train_index], X_tensor[val_index]y_train, y_val = y_tensor[train_index], y_tensor[val_index]train_dataset = TensorDataset(X_train, y_train)val_dataset = TensorDataset(X_val, y_val)train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=False)model = AlkalinityNet(input_dim=X_tensor.shape[1]).to(device)optimizer = optim.Adam(model.parameters(), lr=0.001)for epoch in range(num_epochs):train_loss = train_model(model, train_loader, criterion, optimizer, device)val_loss = evaluate_model(model, val_loader, criterion, device)# 这里可以打印每折每轮的损失,也可以选择每隔一定轮数打印一次# print(f"Fold {fold}, Epoch {epoch+1}/{num_epochs}, Train Loss: {train_loss/len(train_dataset):.4f}, Val Loss: {val_loss/len(val_dataset):.4f}")avg_val_loss = val_loss / len(val_dataset)print(f"第 {fold} 折验证 Loss: {avg_val_loss:.4f}")fold_losses.append(avg_val_loss)print("5 折交叉验证平均 Loss:", np.mean(fold_losses))# 在全数据集上训练最终模型final_dataset = TensorDataset(X_tensor, y_tensor)final_loader = DataLoader(final_dataset, batch_size=batch_size, shuffle=True)final_model = AlkalinityNet(input_dim=X_tensor.shape[1]).to(device)optimizer = optim.Adam(final_model.parameters(), lr=0.001)print("开始在全数据集上训练最终模型...")for epoch in range(num_epochs):train_loss = train_model(final_model, final_loader, criterion, optimizer, device)# 可打印训练进度# print(f"Epoch {epoch+1}/{num_epochs}, Loss: {train_loss/len(final_dataset):.4f}")# 保存最终模型参数torch.save(final_model.state_dict(), 'final_model.pth')print("最终模型已保存到 final_model.pth")if __name__ == '__main__':main()
推理代码eval.py
import numpy as np
import torch
import torch.nn as nn
import joblib
from sklearn.preprocessing import StandardScaler, OneHotEncoder# 定义与训练时相同的网络结构
class AlkalinityNet(nn.Module):def __init__(self, input_dim):super(AlkalinityNet, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, 64),nn.ReLU(),nn.Dropout(0.2),nn.Linear(64, 32),nn.ReLU(),nn.Dropout(0.2),nn.Linear(32, 2))def forward(self, x):return self.model(x)def predict_alkalinity(input_data):"""参数 input_data 为字典,包含以下键值:"Substance": 物质名称,例如 "玉米秸秆""N", "C", "C/N", "K", "Cellulose", "Hemicellulose", "Lignin"返回预测的 [400℃ 碱度, 600℃ 碱度]"""# 数值特征顺序与训练时一致num_features = ["N", "C", "C/N", "K", "Cellulose", "Hemicellulose", "Lignin"]# 提取物质名称与数值特征substance = np.array([[input_data["Substance"]]])X_num = np.array([input_data[feat] for feat in num_features]).reshape(1, -1).astype(np.float32)# 加载保存的 OneHotEncoder 和 StandardScalerencoder = joblib.load('encoder.pkl')scaler_X = joblib.load('scaler_X.pkl')scaler_y = joblib.load('scaler_y.pkl')X_cat = encoder.transform(substance)X_num_scaled = scaler_X.transform(X_num)# 拼接类别特征和数值特征X_combined = np.hstack([X_cat, X_num_scaled]).astype(np.float32)# 转换为 tensorX_tensor = torch.from_numpy(X_combined)# 加载模型,注意输入维度需与训练时保持一致input_dim = X_combined.shape[1]model = AlkalinityNet(input_dim=input_dim)# 加载模型参数model.load_state_dict(torch.load('final_model.pth', map_location=torch.device('cpu'), weights_only=True))model.eval()with torch.no_grad():y_pred_tensor = model(X_tensor)y_pred_scaled = y_pred_tensor.numpy()# 将预测结果反标准化y_pred = scaler_y.inverse_transform(y_pred_scaled)return y_pred[0]if __name__ == '__main__':# 示例输入,请根据实际物质成分调整数值input_data = {"Substance": "鸡粪","N": 1.0,"C": 40.0,"C/N": 40.0,"K": 2.5,"Cellulose": 29.0,"Hemicellulose": 25.0,"Lignin": 12.0}result = predict_alkalinity(input_data)print("预测 400℃ 碱度:", result[0])print("预测 600℃ 碱度:", result[1])
本地推理看看
GUI界面代码app.py
import tkinter as tk
from tkinter import messagebox
import tkinter.font as tkFont
import joblib
import numpy as np
import torch
import torch.nn as nn# 定义与训练时一致的模型结构
class AlkalinityNet(nn.Module):def __init__(self, input_dim):super(AlkalinityNet, self).__init__()self.model = nn.Sequential(nn.Linear(input_dim, 64),nn.ReLU(),nn.Dropout(0.2),nn.Linear(64, 32),nn.ReLU(),nn.Dropout(0.2),nn.Linear(32, 2) # 输出 400℃ 和 600℃ 的碱度值)def forward(self, x):return self.model(x)def predict():try:# 获取用户输入的各项数值substance = entry_substance.get()N = float(entry_N.get())C = float(entry_C.get())C_N = float(entry_CN.get())K = float(entry_K.get())cellulose = float(entry_cellulose.get())hemicellulose = float(entry_hemicellulose.get())lignin = float(entry_lignin.get())except ValueError:messagebox.showerror("输入错误", "请确保所有数值项均正确填写")return# 构造输入字典input_data = {"Substance": substance,"N": N,"C": C,"C/N": C_N,"K": K,"Cellulose": cellulose,"Hemicellulose": hemicellulose,"Lignin": lignin}try:# 加载保存的预处理器encoder = joblib.load('encoder.pkl')scaler_X = joblib.load('scaler_X.pkl')scaler_y = joblib.load('scaler_y.pkl')except Exception as e:messagebox.showerror("加载错误", f"加载预处理器失败:{e}")return# 对物质类别特征进行 one-hot 编码substance_arr = np.array([[input_data["Substance"]]])X_cat = encoder.transform(substance_arr)# 数值特征转换与标准化X_num = np.array([[input_data["N"], input_data["C"], input_data["C/N"], input_data["K"],input_data["Cellulose"], input_data["Hemicellulose"], input_data["Lignin"]]], dtype=np.float32)X_num_scaled = scaler_X.transform(X_num)# 拼接特征X_combined = np.hstack([X_cat, X_num_scaled]).astype(np.float32)X_tensor = torch.from_numpy(X_combined)# 加载模型(注意:模型参数文件和输入预处理器需放在同一目录下)input_dim = X_combined.shape[1]model = AlkalinityNet(input_dim=input_dim)try:model.load_state_dict(torch.load('final_model.pth', map_location=torch.device('cpu'), weights_only=True))except Exception as e:messagebox.showerror("加载模型错误", f"加载模型失败:{e}")returnmodel.eval()with torch.no_grad():y_pred_tensor = model(X_tensor)y_pred_scaled = y_pred_tensor.numpy()# 反标准化得到预测值y_pred = scaler_y.inverse_transform(y_pred_scaled)pred_400 = y_pred[0, 0]pred_600 = y_pred[0, 1]# 在界面上显示预测结果label_pred_400.config(text=str(pred_400))label_pred_600.config(text=str(pred_600))# 创建 GUI 主窗口
root = tk.Tk()
root.title("碱度预测模型")# 设置参考尺寸与基础字体大小(可根据需要调整)
REF_WIDTH = 800
REF_HEIGHT = 600
BASE_FONT_SIZE = 18# 用于存放所有需要动态调整字体的控件
widgets_to_update = []# 创建一个默认字体对象,初始大小 BASE_FONT_SIZE
default_font = tkFont.Font(family="SimSun", size=BASE_FONT_SIZE)# 辅助函数:创建标签并加入更新列表(居中显示)
def create_label(text, row, col):lbl = tk.Label(root, text=text, font=default_font, anchor="center")lbl.grid(row=row, column=col, padx=5, pady=5, sticky="nsew")widgets_to_update.append(lbl)return lbl# 辅助函数:创建输入框并加入更新列表(内容居中)
def create_entry(row, col):ent = tk.Entry(root, font=default_font, justify="center")ent.grid(row=row, column=col, padx=5, pady=5, sticky="nsew")widgets_to_update.append(ent)return ent# 定义行列权重,使控件居中扩展
for i in range(11):root.grid_rowconfigure(i, weight=1)
for j in range(2):root.grid_columnconfigure(j, weight=1)# 创建左侧标签
label_substance = create_label("物质", 0, 0)
label_N = create_label("N", 1, 0)
label_C = create_label("C", 2, 0)
label_CN = create_label("C/N", 3, 0)
label_K = create_label("K", 4, 0)
label_cellulose = create_label("纤维素", 5, 0)
label_hemicellulose = create_label("半纤维素", 6, 0)
label_lignin = create_label("木质素", 7, 0)
label_400 = create_label("400摄氏度碱度", 8, 0)
label_600 = create_label("600摄氏度碱度", 9, 0)# 创建右侧输入框
entry_substance = create_entry(0, 1)
entry_N = create_entry(1, 1)
entry_C = create_entry(2, 1)
entry_CN = create_entry(3, 1)
entry_K = create_entry(4, 1)
entry_cellulose = create_entry(5, 1)
entry_hemicellulose = create_entry(6, 1)
entry_lignin = create_entry(7, 1)# 用于显示预测结果的标签(400℃ 和 600℃)
label_pred_400 = create_label("未预测", 8, 1)
label_pred_600 = create_label("未预测", 9, 1)# 预测按钮(也加入更新列表)
predict_button = tk.Button(root, text="预测", font=default_font, command=predict)
predict_button.grid(row=10, column=0, columnspan=2, pady=10)
widgets_to_update.append(predict_button)# 定义一个函数,在窗口大小变化时更新所有控件的字体大小
def on_resize(event):# 根据窗口当前尺寸与参考尺寸计算缩放比例scale_factor = min(event.width / REF_WIDTH, event.height / REF_HEIGHT)new_font_size = max(int(BASE_FONT_SIZE * scale_factor), 8) # 设置最小字体为8# 更新所有控件字体new_font = (default_font.actual("family"), new_font_size)for widget in widgets_to_update:widget.config(font=new_font)# 绑定窗口尺寸变化事件
root.bind("<Configure>", on_resize)root.mainloop()
本地运行看看效果
2.在huggingface上创建Space
点击new space
填写相关信息后点击Create
3.上传模型、代码、环境配置文件
上传你的模型和相应代码、以及requirements.txt
requirements.txt中直接写需要用到的库
上传文件中需要有个名为 app.py的文件,huggingface会根据这个文件创建网页端应用
为了能够让hf分享别人可以访问的public链接,在app.py中添加参数share=True
# Launch the app with shareable link
if __name__ == "__main__":iface.launch(share=True)
为了不让模型自动推理运行,而是让它点击运行时才推理,我们需要将app.py中 live=True设置为False
# Create Gradio interface
iface = gr.Interface(fn=predict,inputs=[gr.Textbox(label="Substance", placeholder="Enter substance"),gr.Number(label="N"),gr.Number(label="C"),gr.Number(label="C/N"),gr.Number(label="K"),gr.Number(label="Cellulose"),gr.Number(label="Hemicellulose"),gr.Number(label="Lignin")],outputs=[gr.Number(label="400℃ Alkalinity"),gr.Number(label="600℃ Alkalinity")],live=False, # Disable live prediction to avoid automatic predictiontitle="Alkalinity Prediction Model",description="Input relevant data and click the 'Predict' button to get predictions."
)
hf会根据环境配置文件下载相关库并根据app.py创建应用
这样就可以在网页端直接使用模型
将左侧输入值填入后,点击submit后模型输出值显示到右侧
将分享链接分享给好兄弟后,他就可以直接在网页端使用我训练好的简单模型了
相关文章:
在huggingface上制作小demo
在huggingface上制作小demo 今天好兄弟让我帮他搞一个模型,他有小样本的化学数据,想让我根据这些数据训练一个小模型,他想用这个模型预测一些值 最终我简单训练了一个小模型,起初想把这个模型和GUI界面打包成exe发给他࿰…...
Spring、Spring Boot和 Spring Cloud 的关系
Spring、Spring Boot和 Spring Cloud 的关系 Spring, Spring Boot 和 Spring Cloud 都是 Spring 生态系统中的重要组成部分,它们之间有紧密的关系,但各自有不同的定位和功能。下面是它们之间的关系和区别: 1、Spring Framework:…...
[蓝桥杯] 求和(C语言)
题目链接 P8772 [蓝桥杯 2022 省 A] 求和 - 洛谷 题目理解 这道题就是公式题,我们模拟出公式后,输出最终结果即可。 本题不难,相信很多同学第一次见到这道题都是直接暴力解题。 两个for循环,测试样例,直接拿下。 #in…...
从用户需求到产品迭代:Scrum 实践全流程详解
目录 前言1. 用户需求与产品待办列表的形成1.1 用户需求的来源与整理1.2 构建产品待办列表(Product Backlog) 2. 迭代计划与目标设定2.1 Sprint 的时间周期设定2.2 设定明确的 Sprint 目标 3. 开发执行与每日站会3.1 高效协作的开发过程3.2 每日站会&…...
windows10安装配置并使用Miniconda3
windows10安装配置并使用Miniconda3 Conda 与 Anaconda 的区别 Conda 是包管理和环境管理工具,Anaconda 在 Conda 的 基础上预装了大量科学计算包 Conda 与 pip 的区别 Conda 是跨语言的包和环境管理器(支持 Python/R 等),能安…...
16-产品经理-需求的评审
在创建需求的时候,有一个"不需要评审"的复选框,如果选中该复选框的话,需求的创建成功后状态是激活的。 但大部分情况下面,需求还是需要评审的。 即使产品完全由一个人负责,也可以将一些不成熟的想法存为草…...
【java图形化界面编程】
文章目录 一、GUI简介二、Swing1.容器组件2. 布局管理器:BorderLayout3.代码实现 实验总结: 一、GUI简介 GUI:图形用户界面。通过图形用户界面,程序的输入输出可以脱离控制台JAVA中实现GUI主要使用3种技术:AMT&#x…...
BGP路由协议之属性1
公认属性是所有 BGP 路由器都必须能够识别的属性 公认必遵 (Well-known Mandatory) : 必须包括在每个 Update 消息里公认任意 (Well-known Discretionary) : 可能包括在某些 Update 消息里。 可选属性不需要都被 BGP 路由器所识别 可选过渡(OptionalTransitive) : BGP 设备不…...
架构思维: 数据一致性的两种场景深度解读
文章目录 Pre案例数据一致性问题的两种场景第一种场景:实时数据不一致不要紧,保证数据最终一致性就行第二种场景:必须保证实时一致性 最终一致性方案实时一致性方案TCC 模式Seata 中 AT 模式的自动回滚一阶段二阶段-回滚二阶段-提交 Pre 架构…...
压测工具开发实战篇(四)——client子窗口功能
你好,我是安然无虞。 文章目录 树控件添加文件补充学习: 函数定义中循环体里的局部变量补充学习: 动态添加对象属性 刷新文件上下文菜单 (右键菜单)实现右键菜单功能 编辑节点文本 在学习本篇文章之前, 建议先看一下上篇介绍MDI子窗口的文章: 压测工具开发实战篇(三…...
如何开发 HTML 游戏
开发 HTML 游戏适合初学者学习编程和游戏开发的基础知识。HTML 游戏通常结合了 HTML、CSS 和 JavaScript 技术,利用浏览器的渲染能力来实现交互式的游戏体验。 1. 确定游戏类型 在开始开发之前,你需要明确你的游戏类型。例如: 简单游戏&…...
机器学习 从入门到精通 day_01
1. 机器学习介绍与定义 1.1 机器学习定义 机器学习(Machine Learning)本质上就是让计算机自己在数据中学习规律,并根据所得到的规律对未来数据进行预测。 机器学习包括如聚类、分类、决策树、贝叶斯、神经网络、深度学习(…...
React中的跨组件通信
在React中,跨组件通信有几种常见的方式。每种方式适用于不同的场景,下面是几种常见的跨组件通信方法: 1. 通过父子组件传递 Props 父组件可以通过 props 将数据传递给子组件,子组件只能接收和使用这些数据。 父组件(…...
Vue项目 bug 解决
Vue2项目部署失败 从gitee 上拉下一个前端项目,然后npm install,报错如下: 解决办法: 从 npm切换到cnpm:npm install -g cnpm执行命令export NODE_OPTIONS--openssl-legacy-provider下载依赖:cnpm instal…...
Python 3.13.2 安装教程(附安装包)轻松开启编程之旅
文章目录 前言软件介绍安装步骤1. 下载安装包2. 运行安装程序3. 选择安装选项4. 等待安装完成5. 验证安装结果 前言 在数字化时代,Python 作为一种简洁、高效且功能强大的编程语言,广泛应用于 Web 开发、数据科学、人工智能等诸多领域。无论是编程新手入…...
Meta 最新发布的 Llama 4:多模态开源大模型全面解析
TL;DR 2025 年 4 月 5 日,Meta AI 正式发布了第四代大型语言模型 Llama 4。引入了 Mixture-of-Experts (MoE,专家混合) 架构,同时原生支持多模态输入,最小的 Llama 4 Scout 模型支持 10m 的长文本输入。 Paper name The Llama 4…...
Web开发:常用 HTML 表单标签介绍
在 Web 开发中,HTML 表单是实现用户交互的关键元素,它为用户提供了输入数据的途径,广泛应用于注册登录、搜索查询、问卷调查等功能场景。本文将详细介绍常用的 HTML 表单标签及其使用方法。 表单容器标签 <form> <form>标签用…...
力扣HOT100之链表:2. 两数相加
这道题就是按照正常的数学思维去做的,设置一个标志位flag用来标记进位的情况,当发生进位时设置为1,否则设置为0,初始时设置为0。我们同时遍历两个链表,将两个节点的值相加,再加上上一位的进位flagÿ…...
Spring Boot 项目集成 License 授权与续期完整指南
一、背景说明 在 Spring Boot 项目中,通过引入第三方 spring-boot-starter-license 组件,可以快速实现系统权限到期控制、License 证书管理等功能。本文详细介绍如何集成 License 功能,并解决证书安装、权限配置、异常拦截及续期流程等关键问…...
2010年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2010年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激…...
典型的ETL使用场景与数据集成平台的应用
在当今数字化时代,数据已经成为企业决策和运营的核心资产。为了更好地管理和利用数据,企业需要借助高效的数据处理技术。ETL(Extract,Transform,Load)作为数据处理的核心技术之一,广泛应用于数据…...
深入解析嵌入式Linux系统架构:从Bootloader到用户空间 - 结合B站视频教学
B站视频链接,请多多关注本人B站: 📌 Yocto项目实战教程:第二章 视频讲解 目录 第2章 Linux系统架构 2.1 GNU/Linux2.2 Bootloader2.3 内核空间2.4 用户空间 总结 第2章 Linux系统架构 {#linux系统架构} 嵌入式Linux系统是Linux内核的精简版…...
从Oracle和TiDB的HTAP说起
除了数据库行业其他技术群体很多不知道HTAP的 时至今日还是有很多人迷信Hadoop,觉得大数据就是Hadoop。这是不正确的。也难怪这样,很多人OLTP和OLAP也分不清,何况HTAP。 Oracle是垂直方向实现 TiDB是水平方向实现 我个人认为这是两种流派…...
【Vue-路由案例】面经基础版
目录 <<回到导览1.面经基础版1.1.VueCli建项目1.1.1.VueCli 自定义项目1.1.2.ESlint代码规范 1.2.项目路由1.2.1.一级路由配置1.2.2.二级配置路由1.2.3.设置高亮1.2.4.发生请求、渲染1.2.5.跳转传参、再发请求1.2.6.体验优化1.2.7.keep-alive <<回到导览 1.面经基…...
C#调用C++动态库时出现`System.DllNotFoundException`错误的解决思路
文章目录 1. DLL文件路径问题2. 依赖的运行时库缺失3. 平台不匹配(x86/x64)4. 导出函数名称不匹配5. DLL文件损坏或权限问题6. 运行时库冲突(MT/MD不匹配)7. 使用DLLImport时的常见错误总结步骤 在C#中调用C动态库时出现System.Dl…...
数据清洗
map阶段:按行读入内容,对内容进行检查,如果字段的个数少于等于11,就删除这条日志(不保留)去除日志中字段个数小于等于11的日志内容。 <偏移量,第一行的内容> → <通过刷选之后的第一行…...
ubuntu 20.04 编译和运行A-LOAM
1.搭建文件目录和clone代码 mkdir -p A-LOAM/src cd A-LOAM/src git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM cd .. 2.修改代码文件 2.1 由于PCL版本1.10,将CMakeLists.txt中的C标准改为14: set(CMAKE_CXX_FLAGS "-stdc14"…...
Oracle迁移翻车,数据校验没做好...
作为DBA,你是否经历过这样的噩梦?数据库迁移、主从同步、容灾切换后,数据不一致却迟迟无法定位,只能手动写脚本逐表比对,熬到凌晨还在查差异… Oracle GoldenGate Veridata(OGG Veridata) 就是…...
小刚说C语言刷题——第17讲 循环之for语句
在生活中,我们经常会碰到重复去做某一件事。例如,一个人绕着操场跑圈,一天24小时往复。这些周而往复的事,我们称为循环。 1.循环的作用 在编程时,我们用循环的目的有两个。一个是减少循环时代码量,一个是通…...
如何使用 Coze 的 HTTP 请求节点实现高效数据交互
如何使用Coze的HTTP请求节点实现高效数据交互 在自动化工作流开发中,与外部服务进行数据交互是核心需求之一。Coze平台的HTTP请求节点提供了强大的解决方案,支持通过HTTP协议实现数据的获取、提交、更新和删除等操作。本文将结合官方文档,详…...
【力扣hot100题】(071)每日温度
经典单调栈问题。 感觉自己对这类问题还是不太熟练,想了很久思路,还想了很久是单调递增栈还是单调递减栈…… 方法是维护一个单调递减栈。先将结果result初始化为0,如果温度一直递减,那么result就不用变化了。 遍历每日温度&am…...
ChatBI的落地挑战——技术先进≠产品可用
近年来,大语言模型(LLM)的爆发让“对话式BI”(ChatBI)成为行业热点。然而,许多企业发现,尽管技术Demo令人惊艳,实际落地却困难重重——用户提问率低、回答准确度不稳定、使用场景模糊…...
1.2 测试设计阶段:打造高质量的测试用例
测试设计阶段:打造高质量的测试用例 摘要 本文详细介绍了软件测试流程中的测试设计阶段,包括测试用例设计、测试数据准备、测试环境搭建和测试方案设计等内容。通过本文,读者可以系统性地了解测试设计的方法和技巧,掌握如何高效…...
x64dbg调试python解释器
可以先写个input()这会让dbg中断在ntdll模块中,查看调用堆栈在系统调用结束后的打断点 然后直接断到PyObject_Vectorcall函数...
浙江大学DeepSeek系列专题线上公开课第二季第四期即将上线!端云协同:让AI更懂你的小心思! - 张圣宇 研究员
今晚8点10分左右,端云协同:让AI更懂你的小心思!浙大学者张圣宇研究员将揭秘人机交互新玩法。浙江大学DeepSeek系列专题线上公开课第二季第四期即将上线! 讲座 主题: 大小模型端云协同赋能人机交互 主讲人:…...
【项目管理】第3章 信息系统治理 --知识点整理
相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 对应:第1章-第5章 (二)知识笔记 三、信息系统治理 本文涉及信息系统治理与审计的核心知识。 1)…...
算法与数据结构线性表之栈和队列
Hello大家好! 很高兴与大家见面! 给生活添点快乐,开始今天的编程之路。 我的博客:<但愿. 我的专栏:C语言、题目精讲、算法与数据结构、C 欢迎点赞,关注 一 栈 1概念:栈是⼀种特殊的线性表,其只允许…...
【Introduction to Reinforcement Learning】翻译解读2
2.2 马尔可夫决策过程(MDPs) 马尔可夫决策过程(MDP)为顺序决策提供了框架,其中动作不仅影响即时奖励,还会影响未来结果。与多臂老虎机问题不同,MDP中的即时奖励与延迟奖励相平衡。在多臂老虎机…...
2016年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析
2016年-全国大学生数学建模竞赛(CUMCM)试题速浏、分类及浅析 全国大学生数学建模竞赛(China Undergraduate Mathematical Contest in Modeling)是国家教委高教司和中国工业与应用数学学会共同主办的面向全国大学生的群众性科技活动,目的在于激励学生学习数学的积极性,提高学…...
UI测试(2)
1、HTML 是用来描述网页的一种语言。 指的是超文本标记语言 (Hyper Text Markup Language) ,HTML 不是一种编程语言,而是一种标记语言 (markup language) 负责定义页面呈现的内容:标签语言:<标签名>标签值<标签名>&am…...
Pr视频剪辑 Premiere Pro 2024 for Mac
Pr视频剪辑 Premiere Pro 2024 for Mac 文章目录 Pr视频剪辑 Premiere Pro 2024 for Mac一、介绍二、效果三、下载 一、介绍 Premiere Pro 2024 for Mac是一款专业的视频编辑软件,广泛应用于电影、电视、广告等领域。它为Mac用户提供了强大的剪辑、调色、音频处理等…...
电源测试系统自动化转型:Chroma 8000 与 NSAT-8000 核心功能对比解析
在全球制造业加速智能化升级的背景下,电源模块测试正从传统手动模式向自动化、智能化深度转型。作为企业降本增效与提升竞争力的关键,如何选择适配的测试系统成为行业焦点。本文聚焦市场主流的 Chroma 8000 与 NSAT-8000 两款系统,从功能设计…...
智能指针和STL库学习思维导图和练习
思维导图: #include <iostream> #include <vector> #include <string> using namespace std;// 用户结构体 struct User {string username;string password; };vector<User> users; // 存储所有注册用户// 使用迭代器查找用户名是否存在 ve…...
【JS】二分查找
题目 步骤 初始化指针:定义 left 和 right 两个指针,分别指向数组的起始位置和末尾位置,确定查找范围。进入循环:只要 left 小于等于 right,就继续执行循环,因为此时查找范围不为空。计算中间索引ÿ…...
Mamba模型
为什么要提出mamba模型? transformer特点:训练快,推理慢,计算成本O(n*n) Rnn的特点:训练慢,推理快,容易遗忘 其实很容易理解,因为RNN的输入只包含前一个隐…...
人工智能通识速览(Part4. 评估指标)
四、评估指标 1.回归模型 均方误差(MSE) 优点:数学性质良好,计算简单,对误差的惩罚力度较大,能很好地反映模型预测值与真实值之间的平均差异程度,便于比较不同模型的性能。缺点:由…...
IT运维服务方案
一、服务目标 IT 运维服务致力于构建稳固、高效且智能的信息系统生态,为客户的业务运营筑牢数字化根基。凭借前沿的主动式维护策略,运用大数据分析、智能监控等技术手段,提前洞察系统隐患,在萌芽阶段化解潜在故障。同时࿰…...
【简历全景认知2】电子化时代对简历形式的降维打击:从A4纸到ATS的生存游戏
一、当简历遇上数字洪流:传统形式的式微 在1990年代,一份排版精美的纸质简历还能让HR眼前一亮;但今天,超过75%的 Fortune 500 企业使用ATS(Applicant Tracking System)进行初筛,未优化的简历可能在5秒内就会沦为数字废土。这种变迁本质上符合「技术接纳生命周期」理论—…...
LLM面试题七
NLP算法工程师面试题8道|含解析 分类场景下bert和gptprompt的方式哪种会有更好效果,为什么? 在分类场景下,BERT比GPT更适合用于建模,因为BERT的结构中包含了双向的Transformer编码器,而GPT的结构中只包含单向的Transf…...
Semaphore
关于作者: CSDN内容合伙人、技术专家, 从零开始做日活千万级APP,带领团队单日营收超千万。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业化变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览…...