深度学习与逻辑回归模型的融合--TensorFlow多元分类的高级应用
手写数字识别
文章目录
- 手写数字识别
- 1、线性回归VS逻辑回归
- Sigmoid函数
- 2、逻辑回归的基本模型-神经网络模型
- 3、多元分类基本模型
- 4、TensorFlow实战解决手写数字识别问题
- 准备数据集
- 数据集划分
- 特征数据归一化
- 归一化方法
- 归一化场景
- 标签数据独热编码
- One-Hot编码
- 构建模型
- 损失函数
- 训练超参数
- 梯度函数
- Adam优化器
- 准确率
- 模型训练
- 显示训练过程数据
- 在测试集完成评估模型
- 模型预测
- 定义可视化函数
- 预测函数可视化预测结果
- 5、完整代码demo
说到数字识别问题,这是一个分类问题,也就是我们要探讨的逻辑回归问题。逻辑回归是机器学习算法中非常经典的一种算法。
1、线性回归VS逻辑回归
线性回归和逻辑回归的关系就是:逻辑回归是广义的线性回归。它们就是一个东西,只是范围不同。我在文章《深度学习在单线性回归方程中的应用–TensorFlow实战详解》讲到的预测问题实则是线性回归,本质就是用一堆数据集点去模拟出一个函数,再用这个函数进行预测。逻辑回归是在这个基础上,将得到的函数放在一个 Sigmoid()
函数里求出来得到一堆概率值,这些概率值就是在0和1之间的。这个时候我们在设置一个阈值,通过比较概率和这个阈值的关系,我们就能达到分类的效果了。
总结一下就是:
线性回归解决的是回归问题,逻辑回归相当于是线性回归的基础上,来解决分类问题。
线性回归:
逻辑回归:
从上面两个公式:逻辑回归可以理解为在线性回归后加了一个Sigmoid
函数。将线性回归变成一个0~1输出的分类问题。
Sigmoid函数
这个函数长成这个样子:
线性回归得到大于0的输出,逻辑回归就会得到0.5 ~ 1的输出;线性回归得到小于0的输出,逻辑回归就会得到0 ~ 0.5的输出;【其实就是上面把Z>0和Z<0两种情况讨论】
他们的联系:线性回归模型试图找到一个线性方程来拟合数据,而逻辑回归模型则试图找到一个逻辑函数来拟合数据。线性回归解决预测问题,逻辑回归解决分类问题。
2、逻辑回归的基本模型-神经网络模型
许多问题的预测结果是一个在连续空间的数值,比如房价预测问题,可以用线性模型来描 述:
但也有很多场景需要输出的是概率估算值,例如:
-
根据邮件内容判断是垃圾邮件的可能性
-
根据医学影像判断肿瘤是恶性的可能性
-
手写数字分别是 0、1、2、3、4、5、6、7、8、9的可能性(概率)
这时需要将预测输出值控制在 [0,1]区间内 二元分类问题的目标是正确预测两个可能的标签中的一个 。
逻辑回归(Logistic Regression)可以用于处理这类问题
3、多元分类基本模型
为什么要讨论多元分类呢?因为我们上面引入了逻辑回归的基本模型,我们把逻辑回归基本模型拼成如下图所示就可以得到一个多元分类模型了:
其实这个模型就是一个全连接神经网络。
这个Softmax
的作用就是让逻辑回归得到的概率值在0-1之间,且概率值相加之和为1!这个Softmax
长成这样:
4、TensorFlow实战解决手写数字识别问题
我们说机器学习呢算法的套路如下:
- 准备数据集
- 构建模型
- 训练模型
- 进行预测
准备数据集
我们现在去哪里搜集数据集呢?
MNIST 数据集可在 http://yann.lecun.com/exdb/mnist/ 获取。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
print("TensorFlow2.0版本是:",tf.__version__)
#打印当前的数据集
mnist=tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()
print("Train images_shape:",train_images.shape,"Train label shape:",train_labels.shape)
print("Test images shape:",test_images.shape,"Test label shape:",test_labels.shape)
数据集划分
为了高考取得好成绩,你需要 模拟卷 ,押题卷, 真题卷。
其中:
- 模拟卷=训练集
- 押题卷=验证集
- 真题卷=测试集
这样分类,才能更好的对你的大脑进行训练,如果不按章法刷题,你上来就做真题卷,押题卷缺少了系统的训练;如果你不做押题卷,只做模拟卷,那么你缺少了对真题命题规律的判断。这在机器学习中叫做过拟合或者欠拟合,意思是你的大脑泛化能力不够好,模型训练的不大好。
我们建立了如下图的新的工作流程:
total_num=len(train_images)
valid_split=0.2 # 验证集的比例占20%
train_num=int(total_num*(1-valid_split))#训练集的数目train_x=train_images[:train_num]#前部分给训练集
train_y=train_labels[:train_num]valid_x=train_images[train_num:]#后20%给验证集
valid_y=train_labels[train_num:]test_x=test_images
test_y=test_labelsvalid_x.shape
特征数据归一化
特征数据归一化(特征归一化)是指将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。特征归一化通常将数据映射到[0,1]区间上,常见的映射范围有[0,1]和[-1,1]。这样可以使得不同指标之间具有可比性。同时,特征归一化也可以消除数据特征之间的量纲影响。
例如,分析一个人的身高和体重对健康的影响 , 如果使用米( m) 和千克( kg )作为单位 , 那么身高特征会在 1.6 ~ l.8m 的数值范围内 , 体重特征会在50 ~ 100kg 的范围内, 分析出来的结果显然会倾向于数值差别比较大的体重特征。 想要得到更为准确的结果,就需要进行特征归一化( Normalization )处理,使各指标处于同一数值量级,以便进行分析。
归一化方法
- 线性函数归 化( Min-Max Scaling )
它对原始数据进行线性变换,使结果映射到[0, 1 ]的范围,实现对原始数据的等比缩放。归一化公式如下:
- 零均值归一化( Z-Score Normalization )
它会将原始数据映射到均值为 0、标准差为1 的分布上。 具体来说, 假设原始特征的均值为 μ、标准差为 σ,那么归一化公式定义为
归一化场景
当然 ,数据归一化并不是万能的。 在实际应用中,通过梯度下降法求解的模型通常是需要归一化的 ,包括逻辑回归、线性回归、逻辑回归、支持向量机、 神经网络等模型。 但对于决策树模型则并不适用 , 以C4.5 为例,决策树在进行节点分裂时主要依据数据集 D 关于特征 x 的信息增益比,而信息增益比跟特征是否经过归一化是无关的,因为归一化并不会改变样本在特征 x 上的信息增益。
# 把(28,28)的结构拉成一行 784
train_x=train_x.reshape(-1,784)
valid_x=valid_x.reshape(-1,784)
test_x=test_x.reshape(-1,784)
# 特征数据归一化
train_x=tf.cast(train_x/255.0,tf.float32)
valid_x=tf.cast(valid_x/255.0,tf.float32)
test_x=tf.cast(test_x/255.0,tf.float32)train_x[1]
标签数据独热编码
在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行特征数字化。
考虑以下三个特征:
[“male”, “female”]
[“from Europe”, “from US”, “from Asia”]
[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]
如果将上述特征用数字表示,效率会高很多。例如:
[“male”, “from US”, “uses Internet Explorer”] 表示为[0, 1, 3]
[“female”, “from Asia”, “uses Chrome”]表示为[1, 2, 1]
但是,转化为数字表示后,上述数据不能直接用在我们的分类器中。因为,分类器往往默认数据数据是连续的,并且是有序的。但按上述表示的数字并不有序的,而是随机分配的。
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
就拿上面的例子来说吧,性别特征:[“男”,“女”],按照N位状态寄存器来对N个状态进行编码的原理,咱们处理后应该是这样的(这里只有两个特征,所以N=2):
男 => 10
女 => 01
祖国特征:[“中国”,"美国,“法国”](这里N=3):
中国 => 100
美国 => 010
法国 => 001
运动特征:[“足球”,“篮球”,“羽毛球”,“乒乓球”](这里N=4):
足球 => 1000
篮球 => 0100
羽毛球 => 0010
乒乓球 => 0001
所以,当一个样本为[“男”,“中国”,“乒乓球”]的时候,完整的特征数字化的结果为:
[1,0,1,0,0,0,0,0,1]
在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。而我们使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,确实会让特征之间的距离计算更加合理。
# 对标签数据进行独热编码
train_y=tf.one_hot(train_y,depth=10)
valid_y=tf.one_hot(valid_y,depth=10)
test_y=tf.one_hot(test_y,depth=10)
train_y
构建模型
#构建模型
def model(x,w,b):pred=tf.matmul(x,w)+breturn tf.nn.softmax(pred)#定义变量
W=tf.Variable(tf.random.normal([784,10],mean=0.0,stddev=1.0,dtype=tf.float32))
B=tf.Variable(tf.zeros([10]),dtype=tf.float32)
损失函数
我们在线性回归的实战中采用的损失函数是 平方损失函数。
在逻辑回归中,我们采用的损失函数是 对数损失函数。
这个函数是一个凸函数,它的图象如下:
在多元分类问题中,我们通常采用交叉熵损失函数:
def loss(x,y,w,b):pred=model(x,w,b)#计算模型预测值和标签值的差异loss_=tf.keras.losses.categorical_crossentropy(y_true=y,y_pred=pred)# 官方的交叉熵损失函数return tf.reduce_mean(loss_)#求均值,得到均方差
训练超参数
training_epochs=20#训练轮数
batch_size=50#单次训练样本
learning_rate=0.001 #学习率
梯度函数
#计算样本数据在[x,y]在参数[w,b]点上的梯度
def grad(x,y,w,b):with tf.GradientTape() as tape:loss_=loss(x,y,w,b)return tape.gradient(loss_,[w,b])#返回梯度向量
Adam优化器
#Adam优化器
optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate)
常用的优化器有:
- SGD
- Adagrad
- RMSprop
- Adam
准确率
#定义准确率
def accuary(x,y,w,b):pred=model(x,w,b)#计算模型预测和标签值的差异# 检查预测类别tf.argmax(pred,1)与实际类别tf.argmax(pred,1)的匹配情况correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))#准确率return tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
模型训练
total_step=int(train_num/batch_size)#一轮训练有多少批次loss_list_train=[]#用于保存训练集loss值的列表
loss_list_valid=[]# 用于保存验证集loss值的列表
acc_list_train=[]# 用于保存训练集Acc的值的列表
acc_list_valid=[]# 用于保存验证集Acc值的列表for epoch in range(training_epochs):for step in range(total_step):xs=train_x[step*batch_size:(step+1)*batch_size]ys=train_y[step*batch_size:(step+1)*batch_size]grads=grad(xs,ys,W,B)#计算梯度optimizer.apply_gradients(zip(grads,[W,B]))#优化器根据梯度自动调整变量w和bloss_train=loss(train_x,train_y,W,B).numpy() #计算当前轮训练损失loss_valid=loss(valid_x,valid_y,W,B).numpy() #计算当前轮损失验证acc_train=accuary(train_x,train_y,W,B).numpy()acc_valid=accuary(valid_x,valid_y,W,B).numpy()loss_list_train.append(loss_train)loss_list_valid.append(loss_valid)acc_list_train.append(acc_train)acc_list_valid.append(acc_valid)print("epoch={:3d},train_loss={:.4f},train_acc={:.4f},val_loss={:.4f},val_acc={:.4f}".format(epoch+1,loss_train,acc_train,loss_valid,acc_valid))
显示训练过程数据
plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.plot(loss_list_train,'blue',label='Train Loss')
plt.plot(loss_list_valid,'red',label='Valid Loss')
plt.legend(loc=1)#通过参数loc指定图例位置plt.xlabel("Epochs")
plt.ylabel("Accuary")
plt.plot(acc_list_train,'blue',label='Train Acc')
plt.plot(acc_list_valid,'red',label='Valid Acc')
plt.legend(loc=1)#通过参数loc指定图例位置
在测试集完成评估模型
acc_test=accuary(test_x,test_y,W,B).numpy()
print("Test accuary:",acc_test)
模型预测
模型建立完成以后并训练完,现在认为准确度可以接受了,接下来可以使用这个模型进行预测了。
# 定义预测函数
def predict(x,w,b):pred=model(x,w,b)#计算预测值result=tf.argmax(pred,1).numpy()return result
pred_test=predict(test_x,W,B)
pred_test[0]
定义可视化函数
def plot_images_labels_prediction(images,# 图象列表labels,# 标签列表preds,#预测值列表index=0,#从第index个开始显示num=10):#缺省一次显示10幅fig=plt.gcf() #获取当前图表fig.set_size_inches(10,4) # 1英寸=2.54cmif num > 10:num = 10 #最多显示10个子图for i in range(0,num):ax=plt.subplot(2,5,i+1)#获取当前要处理的子图ax.imshow(np.reshape(images[index],(28,28)),cmap='binary')# 显示第index个图title="label="+str(labels[index])#构建图上要显示的title信息if len(preds)>0:title+=",predict="+str(preds[index])ax.set_title(title,fontsize=10)#显示图上的title信息ax.set_xticks([])#不显示坐标ax.set_yticks([])index=index+1plt.show()
预测函数可视化预测结果
#可视化预测结果
plot_images_labels_prediction(test_images,test_labels,pred_test,10,10)
可以调整训练迭代次数来提高迭代的准确度。
5、完整代码demo
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
print("TensorFlow2.0版本是:",tf.__version__)mnist=tf.keras.datasets.mnist
(train_images,train_labels),(test_images,test_labels)=mnist.load_data()print("Train images_shape:",train_images.shape,"Train label shape:",train_labels.shape)
print("Test images shape:",test_images.shape,"Test label shape:",test_labels.shape)print("image data:",train_images[1])def plot_image(image):plt.imshow(image.reshape(28,28),cmap='binary')plt.show()
plot_image(train_images[1])total_num=len(train_images)
valid_split=0.2 # 验证集的比例占20%
train_num=int(total_num*(1-valid_split))#训练集的数目train_x=train_images[:train_num]#前部分给训练集
train_y=train_labels[:train_num]valid_x=train_images[train_num:]#后20%给验证集
valid_y=train_labels[train_num:]test_x=test_images
test_y=test_labelsvalid_x.shape# 把(28,28)的结构拉成一行 784
train_x=train_x.reshape(-1,784)
valid_x=valid_x.reshape(-1,784)
test_x=test_x.reshape(-1,784)
# 特征数据归一化
train_x=tf.cast(train_x/255.0,tf.float32)
valid_x=tf.cast(valid_x/255.0,tf.float32)
test_x=tf.cast(test_x/255.0,tf.float32)train_x[1]# 对标签数据进行独热编码
train_y=tf.one_hot(train_y,depth=10)
valid_y=tf.one_hot(valid_y,depth=10)
test_y=tf.one_hot(test_y,depth=10)
train_y#构建模型
def model(x,w,b):pred=tf.matmul(x,w)+breturn tf.nn.softmax(pred)#定义变量
W=tf.Variable(tf.random.normal([784,10],mean=0.0,stddev=1.0,dtype=tf.float32))
B=tf.Variable(tf.zeros([10]),dtype=tf.float32)def loss(x,y,w,b):pred=model(x,w,b)#计算模型预测值和标签值的差异loss_=tf.keras.losses.categorical_crossentropy(y_true=y,y_pred=pred)return tf.reduce_mean(loss_)#求均值,得到均方差training_epochs=20#训练轮数
batch_size=50#单次训练样本
learning_rate=0.001 #学习率#计算样本数据在[x,y]在参数[w,b]点上的梯度
def grad(x,y,w,b):with tf.GradientTape() as tape:loss_=loss(x,y,w,b)return tape.gradient(loss_,[w,b])#返回梯度向量#Adam优化器
optimizer=tf.keras.optimizers.Adam(learning_rate=learning_rate)#定义准确率
def accuary(x,y,w,b):pred=model(x,w,b)#计算模型预测和标签值的差异# 检查预测类别tf.argmax(pred,1)与实际类别tf.argmax(pred,1)的匹配情况correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))#准确率return tf.reduce_mean(tf.cast(correct_prediction,tf.float32))total_step=int(train_num/batch_size)#一轮训练有多少批次loss_list_train=[]#用于保存训练集loss值的列表
loss_list_valid=[]# 用于保存验证集loss值的列表
acc_list_train=[]# 用于保存训练集Acc的值的列表
acc_list_valid=[]# 用于保存验证集Acc值的列表for epoch in range(training_epochs):for step in range(total_step):xs=train_x[step*batch_size:(step+1)*batch_size]ys=train_y[step*batch_size:(step+1)*batch_size]grads=grad(xs,ys,W,B)#计算梯度optimizer.apply_gradients(zip(grads,[W,B]))#优化器根据梯度自动调整变量w和bloss_train=loss(train_x,train_y,W,B).numpy() #计算当前轮训练损失loss_valid=loss(valid_x,valid_y,W,B).numpy() #计算当前轮损失验证acc_train=accuary(train_x,train_y,W,B).numpy()acc_valid=accuary(valid_x,valid_y,W,B).numpy()loss_list_train.append(loss_train)loss_list_valid.append(loss_valid)acc_list_train.append(acc_train)acc_list_valid.append(acc_valid)print("epoch={:3d},train_loss={:.4f},train_acc={:.4f},val_loss={:.4f},val_acc={:.4f}".format(epoch+1,loss_train,acc_train,loss_valid,acc_valid))plt.xlabel("Epochs")
plt.ylabel("Loss")
plt.plot(loss_list_train,'blue',label='Train Loss')
plt.plot(loss_list_valid,'red',label='Valid Loss')
plt.legend(loc=1)#通过参数loc指定图例位置plt.xlabel("Epochs")
plt.ylabel("Accuary")
plt.plot(acc_list_train,'blue',label='Train Acc')
plt.plot(acc_list_valid,'red',label='Valid Acc')
plt.legend(loc=1)#通过参数loc指定图例位置acc_test=accuary(test_x,test_y,W,B).numpy()
print("Test accuary:",acc_test)# 定义预测函数
def predict(x,w,b):pred=model(x,w,b)#计算预测值result=tf.argmax(pred,1).numpy()return result
pred_test=predict(test_x,W,B)
pred_test[0]def plot_images_labels_prediction(images,# 图象列表labels,# 标签列表preds,#预测值列表index=0,#从第index个开始显示num=10):#缺省一次显示10幅fig=plt.gcf() #获取当前图表fig.set_size_inches(10,4) # 1英寸=2.54cmif num > 10:num = 10 #最多显示10个子图for i in range(0,num):ax=plt.subplot(2,5,i+1)#获取当前要处理的子图ax.imshow(np.reshape(images[index],(28,28)),cmap='binary')# 显示第index个图title="label="+str(labels[index])#构建图上要显示的title信息if len(preds)>0:title+=",predict="+str(preds[index])ax.set_title(title,fontsize=10)#显示图上的title信息ax.set_xticks([])#不显示坐标ax.set_yticks([])index=index+1plt.show()#可视化预测结果
plot_images_labels_prediction(test_images,test_labels,pred_test,10,10)
相关文章:

深度学习与逻辑回归模型的融合--TensorFlow多元分类的高级应用
手写数字识别 文章目录 手写数字识别1、线性回归VS逻辑回归Sigmoid函数 2、逻辑回归的基本模型-神经网络模型3、多元分类基本模型4、TensorFlow实战解决手写数字识别问题准备数据集数据集划分 特征数据归一化归一化方法归一化场景 标签数据独热编码One-Hot编码构建模型损失函数…...

水库大坝安全监测参数与设备
智慧水利中,水库大坝的安全监测必不可少。做好水库大坝的安全监测,是确保水库大坝结构安全和预防灾害的重要手段。对于预防灾害、保护人民生命财产安全、优化工程管理、改进工程设计、保护环境资源和提高公众信任等方面有着重要的意义。 水利水库大坝安全…...
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 22 章:情感分析提示
要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 22 章:情感分析提示 情感分析是一种可以让模型确定一段文字的情感基调或态度的技术,比如它是正面的、负面的还是中性的。 要在 ChatGPT 中使用情感分析提示,应向模型提…...

数据清洗、特征工程和数据可视化、数据挖掘与建模的主要内容
1.4 数据清洗、特征工程和数据可视化、数据挖掘与建模的内容 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.4节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学…...

C++ STL容器与常用库函数
STL是提高C编写效率的一个利器 STL容器: 一、#include <vector> 英文翻译:vector :向量 vector是变长数组(动态变化),支持随机访问,不支持在任意位置O(1)插入。为了保证效率,元素的增删一般应该在末尾…...
Nmap脚本简介
什么是Nmap脚本 Nmap脚本是一种由Nmap扫描器使用的脚本语言,用于扫描目标网络中的主机、端口、服务等信息,并提供一系列自动化的测试和攻击功能。从渗透测试工程师的角度来看,Nmap脚本是一种非常有用的工具,能够帮助渗透测试工程师…...

Kafka -- 初识
目录 kafka是什么 Topic Partition Broker Cousumer CousumerGroup Offset reblance broker 消息存储 Isr kafka是什么 Kafka 是一个分布式的消息引擎,能够发布和订阅消息流(类似于消息队列) 以容错的、持久的方式存储消息流 多分区…...

玩转Sass:掌握数据类型!
当我们在进行前端开发的时候,有时候需要使用一些不同的数据类型来处理样式,Sass 提供的这些数据类型可以帮助我们更高效地进行样式开发,本篇文章将为您详细介绍 Sass 中的数据类型。 布尔类型 在 Sass 中,布尔数据类型可以表示逻…...

Django + Matplotlib:实现数据分析显示与下载为PDF或SVG
写作背景 首先,数据分析在当前的信息时代中扮演着重要的角色。随着数据量的增加和复杂性的提高,人们对于数据分析的需求也越来越高。 其次,笔者也确确实实曾经接到过一个这样的开发需求,甲方是一个医疗方面的科研团队࿰…...
【Rust】第一节:安装
1 说明 一些学习记录 环境:MacOS 2 步骤 1、执行curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh 2、看到打印 info: downloading installerWelcome to Rust!... ...This path will then be added to your PATH environment variable by modifyin…...

12-07 周四 Pytorch 使用Visdom 进行可视化
简介 在完成了龙良曲的Pytroch视频课程之后,楼主对于pytroch有了进一步的理解,比如,比之前更加深刻的了解了BP神经网络的反向传播算法,梯度、损失、优化器这些名词更加熟悉。这个博客简要介绍一下在使用Pytorch进行数据可视化的一…...
基于微信小程序的智慧校园导航系统研究
点我下载完整版 基于微信小程序的智慧校园导航系统研究 Research on Smart Campus Navigation System based on WeChat mini program 目录 目录 2 摘要 3 关键词 4 第一章 研究背景与意义 4 1.1 校园导航系统研究的背景 4 1.2 微信小程序在校园导航系统中的应用 5 1.3 研究的目…...

VUE3给table的head添加popover筛选、时间去除时分秒、字符串替换某字符
1. VUE3给table的head添加popover筛选 <el-tableref"processTableRef"class"process-table"row-key"secuId":data"pagingData"style"width: 100%"highlight-current-row:height"stockListHeight":default-exp…...

19、XSS——HTTP协议安全
文章目录 一、Weak Session IDs(弱会话IDs)二、HTTP协议存在的安全问题三、HTTPS协议3.1 HTTP和HTTPS的区别3.2 SSL协议组成 一、Weak Session IDs(弱会话IDs) 当用户登录后,在服务器就会创建一个会话(Session),叫做会话控制&…...

深圳锐杰金融:用金融力量守护社区健康
深圳市锐杰金融投资有限公司,作为中国经济特区的中流砥柱,近年来以其杰出的金融成绩和坚定的社会责任立场引人注目。然而,这并非一个寻常的金融机构。锐杰金融正在用自己的方式诠释企业责任和慈善精神,通过一系列独特的慈善项目&a…...
python对py文件加密
参考文献: 【编程技巧】py文件批量编译,py批量转pyd,PyCharm设置py转pyd功能_py文件编译pyd-CSDN博客 【Python小技巧】加密又提速,把.py文件编译为.pyd文件(类似dll函数库),你值得拥有&#x…...

Thymeleaf生成pdf表格合并单元格描边不显示
生成pdf后左侧第一列的右描边不显示,但是html显示正常 显示异常时描边的写法 cellpadding“0” cellspacing“0” ,td,th描边 .self-table{border:1px solid #000;border-collapse: collapse;width:100%}.self-table th{font-size:12px;border:1px sol…...

C# Solidworks二次开发:三种获取SW设计结构树的方法-第二讲
今天这篇文章是接上一篇文章的,主要讲述的是获取SW设计结构树节点的第二种方法。 这个方法获取节点的逻辑是先获取最顶层节点,然后再通过获取顶层节点的子节点一层一层的把所有节点都找出来,也就是需要递归。想要用这个方法就要了解下面几个…...

分布式搜索引擎03
1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近…...

flex布局的flex为1到底是什么
参考博客:flex:1什么意思_公孙元二的博客-CSDN博客 flex:1即为flex-grow:1,经常用作自适应布局,将父容器的display:flex,侧边栏大小固定后,将内容区flex:1,内…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...

Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...