Python纯手动搭建BP神经网络--手写数字识别
1 实验介绍
实验要求: 实现一个手写数字识别程序, 如下图所示, 要求神经网络包含一个隐层, 隐层的神经元个数为 15。
整体思路:主要参考西瓜书第五章神经网络部分的介绍,使用批量梯度下降对神经网络进行训练。
Tip: 整体代码及数据集链接在文末
2 读取并处理数据
数据读取思路:
- 数据集中给出的图片为28*28的灰度图,利用
plt.imread()
函数将图片读取出来后为 28x28 的数组,如果使用神经网络进行训练的话,我们可以将每一个像素视为一个特征,所以将图片利用numpy.reshape
方法将图片化为 1x784 的数组。读取全部数据并将其添加进入数据集data
内,将对应的标签按同样的顺序添加进labels
内。 - 然后使用
np.random.permutation
方法将索引打乱,利用传入的测试数据所占比例test_ratio
将数据划分为测试集与训练集。 - 使用训练样本的均值和标准差对训练数据、测试数据进行标准化。标准化这一步很重要,开始忽视了标准化的环节,神经网络精度一直达不到效果。
- 返回数据集
这部分代码如下:
# 读取图片数据 参数:数据路径 测试集所占的比例
def loadImageData(trainingDirName='data/', test_ratio=0.3):from os import listdirdata = np.empty(shape=(0, 784))labels = np.empty(shape=(0, 1))for num in range(10):dirName = trainingDirName + '%s/' % (num) # 获取当前数字文件路径# print(listdir(dirName))nowNumList = [i for i in listdir(dirName) if i[-3:] == 'bmp'] # 获取里面的图片文件labels = np.append(labels, np.full(shape=(len(nowNumList), 1), fill_value=num), axis=0) # 将图片标签加入for aNumDir in nowNumList: # 将每一张图片读入imageDir = dirName + aNumDir # 构造图片路径image = plt.imread(imageDir).reshape((1, 784)) # 读取图片数据data = np.append(data, image, axis=0) # 划分数据集m = data.shape[0]shuffled_indices = np.random.permutation(m) # 打乱数据test_set_size = int(m * test_ratio)test_indices = shuffled_indices[:test_set_size]train_indices = shuffled_indices[test_set_size:]trainData = data[train_indices]trainLabels = labels[train_indices]testData = data[test_indices]testLabels = labels[test_indices]# 对训练样本和测试样本使用统一的均值 标准差进行归一化tmean = np.mean(trainData)tstd = np.std(testData)trainData = (trainData - tmean) / tstdtestData = (testData - tmean) / tstdreturn trainData, trainLabels, testData, testLabels
**OneHot编码:**由于神经网络的特性,在进行多分类任务时,每一个神经元的输出对应于一个类,所以将每一个训练样本的标签转化为OneHot形式(将0-9的数据映射在长度为10的向量中,每个样本向量对应位置的值为1其余为0)。
# 对输出标签进行OneHot编码 参数:labels 待编码的标签 Label_class 编码类数
def OneHotEncoder(labels,Label_class):one_hot_label = np.array([[int(i == int(labels[j])) for i in range(Label_class)] for j in range(len(labels))])return one_hot_label
3 训练神经网络
激活函数:激活函数使用sigmoid函数,但是使用定义式在训练过程中总是出现overflow
警告,所以将函数进行了如下形式的转化。
# sigmoid激活函数
def sigmoid(z):for r in range(z.shape[0]):for c in range(z.shape[1]):if z[r,c] >= 0:z[r,c] = 1 / (1 + np.exp(-z[r,c]))else :z[r,c] = np.exp(z[r,c]) / (1 + np.exp(z[r,c]))return z
损失函数:使用均方误差损失函数。其实我感觉在这个题目里面直接使用预测精度也是可以的。
def cost(prediction, labels):return np.mean(np.power(prediction - labels,2))
**训练:**终于来到了紧张而又刺激的训练环节。神经网络从输入层通过隐层传递的输出层进而获得网络的输出叫做正向传播,而从输出层根据梯度下降的方法进行调整权重及偏置的过程叫做反向传播。
前向传播每层之间将每个结点的输出值乘对应的权重ω\omegaω(对应函数中omega1 omega2
)传输给下一层结点,下一层结点将上一层所有传来的数据进行求和,并减去偏置theta
(此时数据对应函数中h_in o_in
)。最后通过激活函数输出下一层(对应函数中h_out o_out
)。
在前向传播完成后计算了一次损失,方便后面进行分析。
反向传播是用梯度下降法对权重和偏置进行更新,这里是最主要的部分。根据西瓜书可以推出输出层权重的调节量为ηyi^(1−yi^)(yi−yi^)bh\eta\hat{y_i}(1-\hat{y_i})(y_i - \hat{y_i})b_hηyi^(1−yi^)(yi−yi^)bh ,其中 η\etaη 为学习率, yiyi^y_i \space\hat{y_i}yi yi^ 分别为对应数据的真实值以及网络的输出, bhb_hbh 为隐层的输出值。这里还要一个重要的地方在于如果将公式向量化的话需要重点关注输出矩阵形状以及每个矩阵数据之间的关系。代码中d2
对应于公式中yi^(1−yi^)(yi−yi^)\hat{y_i}(1-\hat{y_i})(y_i - \hat{y_i})yi^(1−yi^)(yi−yi^) 这一部分,这里需要对应值相乘。最后将这一部分与bhb_hbh进行矩阵乘法,在乘学习率η\etaη得到权重调节量,与权重相加即可(代码中除了训练集样本个数m是因为d2
与h_out
的乘积将所有训练样本进行了累加,所以需要求平均)。
对于其他权重及偏置的调节方式与此类似,不做过多介绍(其实是因为明天要上课,太晚了得睡觉,有空补上这里和其他不详细的地方),详见西瓜书。
# 训练一轮ANN 参数:训练数据 标签 输入层 隐层 输出层size 输入层隐层连接权重 隐层输出层连接权重 偏置1 偏置2 学习率
def trainANN(X, y, input_size, hidden_size, output_size, omega1, omega2, theta1, theta2, learningRate):# 获取样本个数m = X.shape[0]# 将矩阵X,y转换为numpy型矩阵X = np.matrix(X)y = np.matrix(y)# 前向传播 计算各层输出# 隐层输入 shape=m*hidden_sizeh_in = np.matmul(X, omega1.T) - theta1.T# 隐层输出 shape=m*hidden_sizeh_out = sigmoid(h_in)# 输出层的输入 shape=m*output_sizeo_in = np.matmul(h_out, omega2.T) - theta2.T# 输出层的输出 shape=m*output_sizeo_out = sigmoid(o_in)# 当前损失all_cost = cost(o_out, y)# 反向传播# 输出层参数更新d2 = np.multiply(np.multiply(o_out, (1 - o_out)), (y - o_out))omega2 += learningRate * np.matmul(d2.T, h_out) / mtheta2 -= learningRate * np.sum(d2.T, axis=1) / m# 隐层参数更新d1 = np.multiply(h_out, (1 - h_out))omega1 += learningRate * (np.matmul(np.multiply(d1, np.matmul(d2, omega2)).T, X) / float(m))theta1 -= learningRate * (np.sum(np.multiply(d1, np.matmul(d2, omega2)).T, axis=1) / float(m))return omega1, omega2, theta1, theta2, all_cost
4 网络测试
预测函数:这里比较简单,前向传播的部分和前面一样,因为最后网络输出的为样本x为每一类的概率,所以仅需要利用np.argmax
函数求出概率值最大的下标即可,下标0-9正好对应数字的值。
# 数据预测
def predictionANN(X, omega1, omega2, theta1, theta2):# 获取样本个数m = X.shape[0]# 将矩阵X,y转换为numpy型矩阵X = np.matrix(X)# 前向传播 计算各层输出# 隐层输入 shape=m*hidden_sizeh_in = np.matmul(X, omega1.T) - theta1.T# 隐层输出 shape=m*hidden_sizeh_out = sigmoid(h_in)# 输出层的输入 shape=m*output_sizeo_in = np.matmul(h_out, omega2.T) - theta2.T# 输出层的输出 shape=m*output_sizeo_out = np.argmax(sigmoid(o_in), axis=1)return o_out
准确率计算: 这里将所有测试数据X
进行预测,计算预测标签y-hat
与真实标签y
一致个数的均值得出准确率。
# 计算模型准确率
def computeAcc(X, y, omega1, omega2, theta1, theta2):y_hat = predictionANN(X,omega1, omega2,theta1,theta2)return np.mean(y_hat == y)
主函数: 在主函数中通过调用上面的函数对网络训练预测精度,并使用loss_list acc_list
两个list保存训练过程中每一轮的精度与误差,利用acc_max
跟踪最大精度的模型,并使用pickle
将模型(其实就是神经网络的参数)进行保存,后面用到时可以读取。同样在训练完成时我也将loss_list acc_list
进行了保存 (想的是可以利用训练的数据做出一点好看的图)。最后部分将损失以及准确率随着训练次数的趋势进行了绘制。结果如下:
可以看出,模型只是跑通了,效果并不好,训练好几个小时准确率只有91%。原因可能是因为没有对模型进行正则化、学习率没有做动态调节等。
相反使用SVM模型准确率轻松可以达到97%以上。
# 获取数据
from sklearn.datasets import fetch_openml
from sklearn.svm import SVC
mnist = fetch_openml('mnist_784', version=1, as_frame=False) # 默认返回Pandas的DF类型
# sklearn加载的数据集类似字典结构
from sklearn.preprocessing import StandardScaler
X, y = mnist["data"], mnist["target"]
stder = StandardScaler()
X = stder.fit_transform(X)
# 划分训练集与测试集
test_ratio = 0.3shuffled_indices = np.random.permutation(X.shape[0]) # 打乱数据
test_set_size = int(X.shape[0] * test_ratio)
test_indices = shuffled_indices[:test_set_size]
train_indices = shuffled_indices[test_set_size:]X_train, X_test, y_train, y_test = X[train_indices], X[test_indices], y[train_indices], y[test_indices]
# 训练SVMcls_svm = SVC(C=1.0, kernel='rbf')
cls_svm.fit(X_train,y_train)
y_pre = cls_svm.predict(X_test)
acc_rate = np.sum(y_pre == y_test) / float(y_pre.shape[0])
acc_rate
瑟瑟发抖~~~
最后将全部代码贴上:
import numpy as np
import matplotlib.pyplot as plt
import pickle# 读取图片数据
def loadImageData(trainingDirName='data/', test_ratio=0.3):from os import listdirdata = np.empty(shape=(0, 784))labels = np.empty(shape=(0, 1))for num in range(10):dirName = trainingDirName + '%s/' % (num) # 获取当前数字文件路径# print(listdir(dirName))nowNumList = [i for i in listdir(dirName) if i[-3:] == 'bmp'] # 获取里面的图片文件labels = np.append(labels, np.full(shape=(len(nowNumList), 1), fill_value=num), axis=0) # 将图片标签加入for aNumDir in nowNumList: # 将每一张图片读入imageDir = dirName + aNumDir # 构造图片路径image = plt.imread(imageDir).reshape((1, 784)) # 读取图片数据data = np.append(data, image, axis=0) # 划分数据集m = data.shape[0]shuffled_indices = np.random.permutation(m) # 打乱数据test_set_size = int(m * test_ratio)test_indices = shuffled_indices[:test_set_size]train_indices = shuffled_indices[test_set_size:]trainData = data[train_indices]trainLabels = labels[train_indices]testData = data[test_indices]testLabels = labels[test_indices]# 对训练样本和测试样本使用统一的均值 标准差进行归一化tmean = np.mean(trainData)tstd = np.std(testData)trainData = (trainData - tmean) / tstdtestData = (testData - tmean) / tstdreturn trainData, trainLabels, testData, testLabels# 对输出标签进行OneHot编码
def OneHotEncoder(labels,Label_class):one_hot_label = np.array([[int(i == int(labels[j])) for i in range(Label_class)] for j in range(len(labels))])return one_hot_label# sigmoid激活函数
def sigmoid(z):for r in range(z.shape[0]):for c in range(z.shape[1]):if z[r,c] >= 0:z[r,c] = 1 / (1 + np.exp(-z[r,c]))else :z[r,c] = np.exp(z[r,c]) / (1 + np.exp(z[r,c]))return z# 计算均方误差 参数:预测值 真实值
def cost(prediction, labels):return np.mean(np.power(prediction - labels,2))# 训练一轮ANN 参数:训练数据 标签 输入层 隐层 输出层size 输入层隐层连接权重 隐层输出层连接权重 偏置1 偏置2 学习率
def trainANN(X, y, input_size, hidden_size, output_size, omega1, omega2, theta1, theta2, learningRate):# 获取样本个数m = X.shape[0]# 将矩阵X,y转换为numpy型矩阵X = np.matrix(X)y = np.matrix(y)# 前向传播 计算各层输出# 隐层输入 shape=m*hidden_sizeh_in = np.matmul(X, omega1.T) - theta1.T# 隐层输出 shape=m*hidden_sizeh_out = sigmoid(h_in)# 输出层的输入 shape=m*output_sizeo_in = np.matmul(h_out, omega2.T) - theta2.T# 输出层的输出 shape=m*output_sizeo_out = sigmoid(o_in)# 当前损失all_cost = cost(o_out, y)# 反向传播# 输出层参数更新d2 = np.multiply(np.multiply(o_out, (1 - o_out)), (y - o_out))omega2 += learningRate * np.matmul(d2.T, h_out) / mtheta2 -= learningRate * np.sum(d2.T, axis=1) / m# 隐层参数更新d1 = np.multiply(h_out, (1 - h_out))omega1 += learningRate * (np.matmul(np.multiply(d1, np.matmul(d2, omega2)).T, X) / float(m))theta1 -= learningRate * (np.sum(np.multiply(d1, np.matmul(d2, omega2)).T, axis=1) / float(m))return omega1, omega2, theta1, theta2, all_cost# 数据预测
def predictionANN(X, omega1, omega2, theta1, theta2):# 获取样本个数m = X.shape[0]# 将矩阵X,y转换为numpy型矩阵X = np.matrix(X)# 前向传播 计算各层输出# 隐层输入 shape=m*hidden_sizeh_in = np.matmul(X, omega1.T) - theta1.T# 隐层输出 shape=m*hidden_sizeh_out = sigmoid(h_in)# 输出层的输入 shape=m*output_sizeo_in = np.matmul(h_out, omega2.T) - theta2.T# 输出层的输出 shape=m*output_sizeo_out = np.argmax(sigmoid(o_in), axis=1)return o_out# 计算模型准确率
def computeAcc(X, y, omega1, omega2, theta1, theta2):y_hat = predictionANN(X,omega1, omega2,theta1,theta2)return np.mean(y_hat == y)if __name__ == '__main__':# 载入模型数据trainData, trainLabels, testData, testLabels = loadImageData()# 初始化设置input_size = 784hidden_size = 15output_size = 10lamda = 1# 将网络参数进行随机初始化omega1 = np.matrix((np.random.random(size=(hidden_size,input_size)) - 0.5) * 0.25) # 15*784omega2 = np.matrix((np.random.random(size=(output_size,hidden_size)) - 0.5) * 0.25) # 10*15# 初始化两个偏置theta1 = np.matrix((np.random.random(size=(hidden_size,1)) - 0.5) * 0.25) # 15*1theta2 = np.matrix((np.random.random(size=(output_size,1)) - 0.5) * 0.25) # 10*1# 学习率learningRate = 0.1# 数据集m = trainData.shape[0] # 样本个数X = np.matrix(trainData) # 输入数据 m*784y_onehot=OneHotEncoder(trainLabels,10) # 标签 m*10iters_num = 20000 # 设定循环的次数loss_list = []acc_list = []acc_max = 0.0 # 最大精度 在精度达到最大时保存模型acc_max_iters = 0for i in range(iters_num):omega1, omega2, theta1, theta2, loss = trainANN(X, y_onehot, input_size, hidden_size, output_size, omega1,omega2, theta1, theta2, learningRate)loss_list.append(loss)acc_now = computeAcc(testData, testLabels, omega1, omega2, theta1, theta2) # 计算精度acc_list.append(acc_now)if acc_now > acc_max: # 如果精度达到最大 保存模型acc_max = acc_nowacc_max_iters = i # 保存坐标 方便在图上标注# 保存模型参数f = open(r"./best_model", 'wb')pickle.dump((omega1, omega2, theta1, theta2), f, 0)f.close()if i % 100 == 0: # 每训练100轮打印一次精度信息print("%d Now accuracy : %f"%(i,acc_now))# 保存训练数据 方便分析f = open(r"./loss_list", 'wb')pickle.dump(loss_list, f, 0)f.close()f = open(r"./acc_list", 'wb')pickle.dump(loss_list, f, 0)f.close()# 绘制图形plt.figure(figsize=(13, 6))plt.subplot(121)x1 = np.arange(len(loss_list))plt.plot(x1, loss_list, "r")plt.xlabel(r"Number of iterations", fontsize=16)plt.ylabel(r"Mean square error", fontsize=16)plt.grid(True, which='both')plt.subplot(122)x2 = np.arange(len(acc_list))plt.plot(x2, acc_list, "r")plt.xlabel(r"Number of iterations", fontsize=16)plt.ylabel(r"Accuracy", fontsize=16)plt.grid(True, which='both')plt.annotate('Max accuracy:%f' % (acc_max), # 标注最大精度值xy=(acc_max_iters, acc_max),xytext=(acc_max_iters * 0.7, 0.5),arrowprops=dict(facecolor='black', shrink=0.05),ha="center",fontsize=15,)plt.plot(np.linspace(acc_max_iters, acc_max_iters, 200), np.linspace(0, 1, 200), "y--", linewidth=2, ) # 最大精度迭代次数plt.plot(np.linspace(0, len(acc_list), 200), np.linspace(acc_max, acc_max, 200), "y--", linewidth=2) # 最大精度plt.scatter(acc_max_iters, acc_max, s=180, facecolors='#FFAAAA') # 标注最大精度点plt.axis([0, len(acc_list), 0, 1.0]) # 设置坐标范围plt.savefig("ANN_plot") # 保存图片plt.show()
代码及数据集网盘连接:
链接:https://pan.baidu.com/s/1kGJtaylhyUmkzOmWvovi1A
提取码:4zpb
其实是机器学习与数据挖掘课上老师布置的作业,垃圾的我做了三天。。。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 动态规划学习
动态规划 动态规划问题简称为DP问题(dynamic problem) 规模是否可缩小用函数思想构造一个状态表达式(黑盒思路)构造状态转移优化(memorization/tabulation) e.g. Longest Common Subsequence(LCS) 规模是…...
2024/4/16 22:22:30 - 李宏毅2021春机器学习课程笔记--类神经网络(四)
视频链接:https://www.bilibili.com/video/BV1Wv411h7kN?p14&spm_id_frompageDriver 如何分类 分类与回归 class 不能单纯根据123来分类,会有关系远近的误导,一般采用one-hot。(单位向量) a1/a2/a3 不同的weig…...
2024/4/15 2:09:25 - Vue 中使用 localStorage 详解
文章目录1、什么是 localStorage ?2、使用方法2.1 保存2.2 获取2.3 删除3、案例展示1、什么是 localStorage ? 使用 Web Storage 存储键值对比存储 Cookie 方式更直观,而且容量更大,它包含两种:localStorage 和 sessi…...
2024/4/15 2:09:30 - 20211104 指针模仿strcat strncat函数
#include <stdio.h> #include <string.h> #define MAX 1024 int main() { int ch0,i,m,n; char str1[MAX] ""; char str2[MAX] ""; char *pstr2; printf("请输入第一个字符串:"); fgets(str…...
2024/4/20 12:30:15 - LeetCode 2006. 差的绝对值为 K 的数对数目
给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| k 。 |x| 的值定义为: 如果 x > 0 ,那么值为 x 。 如果 x < 0 ,那么值为 -x 。 1 < nums.lengt…...
2024/4/15 2:10:26 - 复制状态机简介
读过Paxos等论文的读者,应该对复制状态机(Replicated State Machine)的概念并不陌生。复制状态机在分布式系统中是一个很简单却很强大的模型,也是一种很有价值的思想。模型一句话描述就是:多个节点上,从相同…...
2024/4/18 22:53:49 - Github 上神经网络渲染 的源代码
Pixel2Mesh https://github.com/Tong-ZHAO/Pixel2Mesh-PytorchNeural Renderer: https://github.com/daniilidis-group/neural_renderer...
2024/5/5 7:40:01 - SQL2005 SQL2008 远程连接配置方法
第一步(SQL2005、SQL2008):开始-->程序-->Microsoft SQL Server 2008(或2005)-->配置工具-->SQL Server 配置管理器-->SQL Server网络配置-->MSSQLSERVER(这个名称以具体实例名为准) 的协议-->TCP/IP-->右键-->启用第二步:SQL2005: 开始-->…...
2024/4/7 1:37:03 - 机器学习Sklearn实战——手写线性回归
手写线性回归 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression X np.linspace(2,10,20).reshape(-1,1) y np.random.randint(1,6,size 1)*X np.random.randint(-5,5,size 1) #噪声 加盐 y np.random.randn(20,1…...
2024/4/25 13:43:40 - Hibernate+Struts基础应用
实验五Hibernate 基础应用——基于Hibernate 框架的用户登录模块 一、基础实验——Hibernate 框架搭建 实验内容及步骤 新建maven项目 搭建项目框架 新建数据库 create table customer (customerID int not nullprimary key,Account varchar(20) null,Passwo…...
2024/4/15 2:10:11 - 2.5约瑟夫问题(OJ 2746)DAY 2
描述 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外&a…...
2024/5/4 20:54:24 - #121 实现函数逆序输出一组数据
题目描述: 函数实现将输入的一组数据逆序输出的功能。(参考函数原型:void isort(int a[], int n)) 输入输出格式要求:编写函数void isort(int a[], int n);n表示数组元素个数输出格式为:n1,n2,n3,...,nn 例…...
2024/5/4 23:43:37 - MQTT测试环境搭建
之前做MQTT项目,现把测试环境搭建记录一下。 物联网设备很多会用到MQTT协议,我们的项目也用到了,需要把消息报警数据通过MQTT协议上传到第三方平台。设备端只要用到publish协议即可,但是,设备端程序开发完成后…...
2024/5/4 23:08:46 - vue-vue2脚手架3-ref函数
vue-vue2脚手架3-ref函数 tips: 在vscode 使用 <v 可以直接生成系列模板ref 函数 1. 被用来给元素或子组件注册引用信息(id的替代者) 2. 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc&#x…...
2024/4/15 2:10:21 - Java 主函数 main 中的关键字 static
相信很多人在运行第一个可以运行的 Java 程序的时候都会要求写一个主函数。 然后很多人都会照葫芦画瓢的写一个下面的函数: public static void main(String[] args) {}IJ 甚至非常贴心的给你 main 的代码提示: 这个函数里面有几个定义和关键字&#x…...
2024/5/4 16:19:47 - 2021-11-04一键重置wordpress网站数据
wp后台---外观---上传wp5.9程序 授权 工具--导入--相应风格 over ----------- 重置 一键重置wordpress网站数据,快速删除网站数据 WordPress Reset插件,使用WordPress Reset插件,可以直接在后台一键恢复,自动删除已有的内容…...
2024/4/15 2:10:21 - Java集合与数据结构-哈希表
哈希桶解决哈希冲突: import java.util.Arrays; import java.util.Objects;public class HashBucket<K,V> {static class Node<K,V> {public K key;public V val;public Node<K,V> next;public Node(K key, V val) {this.key key;this.val val…...
2024/4/15 11:21:50 - HTML Dom结合js实例练习题:模拟用户登录验证
HTML Dom结合js实例练习题:模拟用户登录验证 在登录界面可以实现用户名,密码,验证码输入,点击登录按钮可以判断用户输入是否正确从而判断是否登录成功 参考程序: <!DOCTYPE html> <html lang"en"…...
2024/5/4 17:50:23 - JavaScript 上传表单无反应
在运行这个表单时,本应该在选择valuecarte tudiant’时会报错,但尝试多次无反应 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-…...
2024/4/15 2:10:01 - 截屏,并传递到后台
简化版 <div refbox></div>screenshot(){ html2canvas(this.$refs.box,{ backgroundColor:null,//避免图片有白色边框 useCORS:true, allowTaint:true }).then(canvas>{ let dataURL canvas.toDataURL(image/png,1.0) //默认截取的图片就是base64格式的&#…...
2024/4/7 1:36:55
最新文章
- 国内各种免费AI聊天机器人(ChatGPT)推荐(中)
作者主页:点击! 国内免费AI推荐(ChatGPT)专栏:点击! 创作时间:2024年4月29日15点20分 随着人工智能技术的不断发展,AI聊天机器人已经逐渐融入我们的日常生活。它们可以提供各种服务,例如聊天、…...
2024/5/5 8:40:10 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - test4111
欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…...
2024/5/4 18:17:44 - redis之主从复制、哨兵模式
一 redis群集有三种模式 主从复制: 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。 主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。 缺陷: 故障恢复无法自动化&…...
2024/5/1 13:42:29 - 【Qt 学习笔记】Qt 背景介绍
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt 背景介绍 文章编号:Qt 学习笔记 / 01 文章目录 Qt 背景…...
2024/5/4 21:42:41 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/4 23:54:56 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/4 23:54:56 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/4 23:55:17 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/4 23:55:16 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/4 18:20:48 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/4 23:55:06 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/4 23:55:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57