Machine Learning-Ex4(吴恩达课后习题)Neural Networks Learning

news/2024/5/22 6:22:49/文章来源:https://blog.csdn.net/qq_61706112/article/details/130051845

目录

1. Neural Networks

1.1 Visualizing the data

1.2 Model representation

1.3 Feedforward and cost function

1.4 Regularized cost function

2. Backpropagation

2.1 Sigmoid gradient 

2.2 Random initialization

2.3 Backpropagation

2.4 Gradient Checking

2.5 Regularized  Neural Networks

2.6 Learning parameters using fmincg

3. Visualizing the hidden layer


1. Neural Networks

内容:我们将使用反向传播来学习神经网络所需的参数(权重)。

1.1 Visualizing the data

内容:一共有5000个训练集,X为5000×400维度,每行样本数据表示一个由20×20像素组成的手写数字识别图像。y为每个样本的真实标签(注意:0对应的标签为10),维度为5000×1。

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']print(X.shape, y.shape, Theta1.shape, Theta2.shape)
# (5000, 400) (5000, 1) (25, 401) (10, 26)

plot.py

import numpy as np
import matplotlib.pyplot as plt
import matplotlibdef Plot(X):sample_idx = np.random.choice(np.arange(X.shape[0]), 100)  # 从0-4999中随机抽取100个数sample_image = X[sample_idx, :]fig, axisArr = plt.subplots(nrows=10, ncols=10, sharex=True, sharey=True, figsize=(10, 10))for r in range(10):for c in range(10):axisArr[r, c].matshow(sample_image[r * 10 + c].reshape(20, 20).T, cmap=matplotlib.cm.binary)plt.xticks(np.array([]))plt.yticks(np.array([]))plt.show()

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
from plot import *  # 绘图data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
Plot(X)

1.2 Model representation

内容:Theta1:25×401    Theta2:10 ×26

1.3 Feedforward and cost function

内容:根据已给出的Theta1和Theta2进行前向传播以及计算代价函数。特别注意,这里真实标签y需要重新编码一下,可更新为5000×10维度的矩阵,用于计算代价函数。

sigmoid.py

import numpy as npdef Sigmoid(z):return 1 / (1 + np.exp(-z))

forward_propagate.py

import numpy as np
from sigmoid import *def forwardPropagate(Theta1, Theta2, X):X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)a1 = Xz2 = a1 * Theta1.Ta2 = Sigmoid(z2)a2 = np.insert(a2, 0, values=np.ones(a2.shape[0]), axis=1)z3 = a2 * Theta2.Th_theta = Sigmoid(z3)return h_theta

cost_function.py

import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from forward_propagate import *  # 前向传播def costFunction(Theta1, Theta2, X, y):X = np.matrix(X)Theta1 = np.matrix(Theta1)Theta2 = np.matrix(Theta2)m = X.shape[0]h_theta = forwardPropagate(Theta1, Theta2, X)# 对y标签进行编码,使其变成5000×10维度的矩阵encoder = OneHotEncoder(sparse=False)y_onehot = encoder.fit_transform(y)# print(y[0], y_onehot[0, :])  # [10] [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]first = np.sum(np.multiply(y_onehot, np.log(h_theta)), axis=1)second = np.sum(np.multiply(1 - y_onehot, np.log(1 - h_theta)), axis=1)J_theta = -np.sum(first + second) / mreturn J_theta

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
from plot import *  # 绘图
from cost_function import *  # 代价函数data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
print(costFunction(Theta1, Theta2, X, y))

0.2876291651613189

1.4 Regularized cost function

内容:将代价函数进行正则化

cost_function_reg.py

import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from forward_propagate import *  # 前向传播def costFunctionReg(Theta1, Theta2, X, y, learningRate):X = np.matrix(X)Theta1 = np.matrix(Theta1)Theta2 = np.matrix(Theta2)m = X.shape[0]h_theta = forwardPropagate(Theta1, Theta2, X)# 对y标签进行编码,使其变成5000×10维度的矩阵encoder = OneHotEncoder(sparse=False)y_onehot = encoder.fit_transform(y)first = np.sum(np.multiply(y_onehot, np.log(h_theta)), axis=1)second = np.sum(np.multiply(1 - y_onehot, np.log(1 - h_theta)), axis=1)reg = np.sum(np.power(Theta1[:, 1:], 2)) + np.sum(np.power(Theta2[:, 1:], 2))J_theta = -np.sum(first + second) / m + learningRate * reg / (2 * m)return J_theta

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
from plot import *  # 绘图
from cost_function_reg import *  # 代价函数data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
learningRate = 1
print(costFunctionReg(Theta1, Theta2, X, y, learningRate))

0.38376985909092365

2. Backpropagation

内容:利用反向传播来计算神经网络代价函数的梯度,从而将代价函数值最小化。

2.1 Sigmoid gradient 

sigmoid_gradient.py

import numpy as np
from sigmoid import *def sigmoidGradient(z):return np.multiply(Sigmoid(z), 1 - Sigmoid(z))# print(sigmoidGradient(0))  # 0.25

2.2 Random initialization

内容:初始化theta的值。Lin为l层的单元数,Lout为l+1层的单元数。

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
from plot import *  # 绘图
from cost_function_reg import *  # 代价函数
import numpy as npdata = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
learningRate = 1
input_size = 400
hidden_size = 25
num_labels = 10
# np.random.random(size):size指所生成随机数0-1的维度大小
# 这里设范围为[-0.12,0.12]
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
# print(params)
# [-0.09845394  0.07595105  0.05357422 ... -0.11991807 -0.08736149
#  -0.09793505]

2.3 Backpropagation

内容: 求误差项,误差项用于衡量此节点对于最后的输出误差的贡献度。

a. 正向传播

b. 反向传播

forward_propagate.py(增加了返回项)

import numpy as np
from sigmoid import *def forwardPropagate(Theta1, Theta2, X):X = np.insert(X, 0, values=np.ones(X.shape[0]), axis=1)a1 = Xz2 = a1 * Theta1.Ta2 = Sigmoid(z2)a2 = np.insert(a2, 0, values=np.ones(a2.shape[0]), axis=1)z3 = a2 * Theta2.Th_theta = Sigmoid(z3)return a1, z2, a2, z3, h_theta

注意:

1. 在计算误差项时,Z2需要变成26×1(维度)

2. 在训练集上算整体的误差项,所以要在for循环中使用delta_l=delta_l+..

back_propagation.py

import numpy as np
from forward_propagate import *  # 正向传播
from sigmoid_gradient import *  # 激活函数的导数def backPropagation(params, input_size, hidden_size, num_labels, X, y):X = np.matrix(X)y = np.matrix(y)m = X.shape[0]Theta1 = np.matrix(np.reshape(params[:hidden_size * (input_size + 1)], (hidden_size, input_size + 1)))Theta2 = np.matrix(np.reshape(params[hidden_size * (input_size + 1):], (num_labels, hidden_size + 1)))# 1. feedforward->z、a、ha1, z2, a2, z3, h_theta = forwardPropagate(Theta1, Theta2, X)# print(a1.shape, z2.shape, a2.shape, h_theta.shape)# (5000, 401) (5000, 25) (5000, 26) (5000, 10)# 1.初始化梯度以及代价函数J = 0delta1 = np.zeros(Theta1.shape)delta2 = np.zeros(Theta2.shape)# print(delta1.shape, delta2.shape)  # (25, 401) (10, 26)# 2.计算代价函数first_term = np.sum(np.multiply(y, np.log(h_theta)))second_term = np.sum(np.multiply(1 - y, np.log(1 - h_theta)))J = -(first_term + second_term) / m# 3.反向传播计算出误差项(在训练集上算整体的误差项,故要用delta=delta+..)、梯度for i in range(m):a1i = a1[i, :]  # (1,401)z2i = z2[i, :]  # (1,25)a2i = a2[i, :]  # (1,26)h_thetai = h_theta[i, :]  # (1,10)yi = y[i, :]  # (1,10)d_error3 = h_thetai - yi  # (1,10)# 将z2的维度变成26×1z2i = np.insert(z2i, 0, values=np.ones(1))  # (1,26)# 求隐藏层的误差项d_error2 = np.multiply((Theta2.T * d_error3.T).T, sigmoidGradient(z2i))  # (1,26)# 求整个训练集的梯度delta1与delta2delta1 = delta1 + (d_error2[:, 1:]).T * a1idelta2 = delta2 + d_error3.T * a2idelta1 = delta1 / mdelta2 = delta2 / mreturn J, delta1, delta2

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from back_propagation import *  # 反向传播data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagation(params, input_size, hidden_size, num_labels, X, y_onehot)

2.4 Gradient Checking

内容:用于检查梯度是否正确。

2.5 Regularized  Neural Networks

内容:正则化神经网络,即在之前的式子中加入正则项。

注意:用于偏置项的那一列不需要正则化。

back_propagation_reg.py

import numpy as np
from forward_propagate import *  # 正向传播
from sigmoid_gradient import *  # 激活函数的导数def backPropagationReg(params, input_size, hidden_size, num_labels, X, y, learningRate):X = np.matrix(X)y = np.matrix(y)m = X.shape[0]Theta1 = np.matrix(np.reshape(params[:hidden_size * (input_size + 1)], (hidden_size, input_size + 1)))Theta2 = np.matrix(np.reshape(params[hidden_size * (input_size + 1):], (num_labels, hidden_size + 1)))# 1. feedforward->z、a、ha1, z2, a2, z3, h_theta = forwardPropagate(Theta1, Theta2, X)# print(a1.shape, z2.shape, a2.shape, h_theta.shape)# (5000, 401) (5000, 25) (5000, 26) (5000, 10)# 1.初始化梯度以及代价函数J = 0delta1 = np.zeros(Theta1.shape)delta2 = np.zeros(Theta2.shape)# print(delta1.shape, delta2.shape)  # (25, 401) (10, 26)# 2.计算代价函数first_term = np.sum(np.multiply(y, np.log(h_theta)))second_term = np.sum(np.multiply(1 - y, np.log(1 - h_theta)))J = -(first_term + second_term) / m# 3.反向传播计算出误差项(在训练集上算整体的误差项,故要用delta=delta+..)、梯度for i in range(m):a1i = a1[i, :]  # (1,401)z2i = z2[i, :]  # (1,25)a2i = a2[i, :]  # (1,26)h_thetai = h_theta[i, :]  # (1,10)yi = y[i, :]  # (1,10)d_error3 = h_thetai - yi  # (1,10)# 将z2的维度变成26×1z2i = np.insert(z2i, 0, values=np.ones(1))  # (1,26)# 求隐藏层的误差项d_error2 = np.multiply((Theta2.T * d_error3.T).T, sigmoidGradient(z2i))  # (1,26)# 求整个训练集的梯度delta1与delta2delta1 = delta1 + (d_error2[:, 1:]).T * a1idelta2 = delta2 + d_error3.T * a2idelta1 = delta1 / mdelta2 = delta2 / m# 3.添加正则项(用于偏置项的那一列不需要正则化)delta1[:, 1:] = delta1[:, 1:] + (learningRate * Theta1[:, 1:]) / mdelta2[:, 1:] = delta2[:, 1:] + (learningRate * Theta2[:, 1:]) / m# np.ravel:用于将多维数组变成一维数组# np.concatenate((a,b)):用于将多个数组拼接grad = np.concatenate((np.ravel(delta1), np.ravel(delta2)))return J, grad

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from back_propagation_reg import *  # 反向传播data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
learningRate = 1
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagationReg(params, input_size, hidden_size, num_labels, X, y_onehot, learningRate)

2.6 Learning parameters using fmincg

内容:使用fmincg得到参数最优解。

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from scipy.optimize import minimize  # 提供最优化算法函数
from back_propagation_reg import *  # 反向传播data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
learningRate = 1
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagationReg(params, input_size, hidden_size, num_labels, X, y_onehot, learningRate)
# 1.fun:目标函数
# 2.x0:初始的猜测
# 3.args=():优化的附加参数
# 4.method:要使用的方法名称,这里使用的TNC(截断牛顿算法)
# 5.jac=True,则假定fun会返回梯度以及目标函数,若为False,则将以数字方式估计梯度
# 6.options={..},带字典类型进去,maxiter指最大迭代次数
fmin = minimize(fun=backPropagationReg, x0=params,args=(input_size, hidden_size, num_labels, X, y_onehot, learningRate), method='TNC', jac=True,options={'maxiter': 250})
print(fmin)  # x-解决方案

 message: Max. number of function evaluations reached
 success: False
  status: 3
     fun: 0.1509371037493068
       x: [ 1.432e-01 -5.233e-03 ... -5.369e-01 -2.709e-01]
     nit: 22
     jac: [ 1.612e-04 -1.047e-06 ... -9.244e-05 -9.776e-05]
    nfev: 250

用优化后的参数来进行预测(精确度可达98%):

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from sklearn.metrics import classification_report  # 常用的输出模型评估报告方法
from scipy.optimize import minimize  # 提供最优化算法函数
from back_propagation_reg import *  # 反向传播
from forward_propagate import *  # 前向传播data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
learningRate = 1
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagationReg(params, input_size, hidden_size, num_labels, X, y_onehot, learningRate)
fmin = minimize(fun=backPropagationReg, x0=params,args=(input_size, hidden_size, num_labels, X, y_onehot, learningRate), method='TNC', jac=True,options={'maxiter': 250})
X = np.matrix(X)
thetafinal1 = np.matrix(np.reshape(fmin.x[:(input_size + 1) * hidden_size], (hidden_size, input_size + 1)))
thetafinal2 = np.matrix(np.reshape(fmin.x[(input_size + 1) * hidden_size:], (num_labels, hidden_size + 1)))
a1, z2, a2, z3, h_theta = forwardPropagate(thetafinal1, thetafinal2, X)
# 对于argmax,axis=1,是在行中比较,选出最大的列索引
y_pred = np.array(np.argmax(h_theta, axis=1) + 1)
print(classification_report(y, y_pred))
# precision recall f1-score support
# 精确率     召回率  调和平均数  支持度(指原始的真实数据中属于该类的个数)

              precision    recall  f1-score   support

           1       0.98      0.99      0.99       500
           2       0.99      0.98      0.99       500
           3       0.99      0.98      0.98       500
           4       0.99      0.99      0.99       500
           5       0.99      0.99      0.99       500
           6       0.99      0.99      0.99       500
           7       0.99      0.99      0.99       500
           8       0.99      1.00      1.00       500
           9       0.99      0.98      0.98       500
          10       0.99      1.00      0.99       500

    accuracy                           0.99      5000
   macro avg       0.99      0.99      0.99      5000
weighted avg       0.99      0.99      0.99      5000

3. Visualizing the hidden layer

内容:将隐藏层(25个单元)所表达的东西可视化出来。

plot.py

import numpy as np
import matplotlib.pyplot as plt
import matplotlibdef Plot(X):sample_idx = np.random.choice(np.arange(X.shape[0]), 100)  # 从0-4999中随机抽取100个数sample_image = X[sample_idx, :]fig, axisArr = plt.subplots(nrows=10, ncols=10, sharex=True, sharey=True, figsize=(10, 10))for r in range(10):for c in range(10):axisArr[r, c].matshow(sample_image[r * 10 + c].reshape(20, 20).T, cmap=matplotlib.cm.binary)plt.xticks(np.array([]))plt.yticks(np.array([]))plt.show()def plotHidden(theta):fig, axisArr = plt.subplots(nrows=5, ncols=5, sharex=True, sharey=True, figsize=(8, 8))# 1.matplotlib.pyplot.matshow(A,cmap),A-"矩阵"(一个矩阵元素对应一个图像像素),cmap-一种颜色映射方式# 2.matplotlib.cm为色表,binary为灰度图像标准色表,matshow为可绘制矩阵的函数# 3.xticks(),若传入空列表则不显示x轴for r in range(5):for c in range(5):axisArr[r][c].matshow(theta[r * 5 + c].reshape(20, 20), cmap=matplotlib.cm.binary)plt.xticks(np.array([]))plt.yticks(np.array([]))plt.show()

main.py

from scipy.io import loadmat  # 导入MATLAB格式数据
import numpy as np
from sklearn.preprocessing import OneHotEncoder  # 数据预处理
from scipy.optimize import minimize  # 提供最优化算法函数
from back_propagation_reg import *  # 反向传播
from plot import *  # 可绘制隐藏层data = loadmat('ex4data.mat')
X, y = data['X'], data['y']
weights = loadmat('ex4weights.mat')
Theta1, Theta2 = weights['Theta1'], weights['Theta2']
# 初始化值
input_size = 400
hidden_size = 25
num_labels = 10
learningRate = 1
params = (np.random.random(size=hidden_size * (input_size + 1) + num_labels * (hidden_size + 1)) - 0.5) * 2 * 0.12
encoder = OneHotEncoder(sparse=False)
y_onehot = encoder.fit_transform(y)
backPropagationReg(params, input_size, hidden_size, num_labels, X, y_onehot, learningRate)
fmin = minimize(fun=backPropagationReg, x0=params,args=(input_size, hidden_size, num_labels, X, y_onehot, learningRate), method='TNC', jac=True,options={'maxiter': 250})
X = np.matrix(X)
thetafinal1 = np.matrix(np.reshape(fmin.x[:(input_size + 1) * hidden_size], (hidden_size, input_size + 1)))
thetafinal2 = np.matrix(np.reshape(fmin.x[(input_size + 1) * hidden_size:], (num_labels, hidden_size + 1)))
plotHidden(thetafinal1[:, 1:])  # 不带偏置项

注意: 在运用神经网络的过程中,需要正则化,否则可能会引起过拟合现象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_96729.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库原理 • 四】数据库设计和规范化理论

前言 数据库技术是计算机科学技术中发展最快,应用最广的技术之一,它是专门研究如何科学的组织和存储数据,如何高效地获取和处理数据的技术。它已成为各行各业存储数据、管理信息、共享资源和决策支持的最先进,最常用的技术。 当前…

linux之jdk1.8环境安装与配置和Maven安装与配置

文章目录一、jdk1.8环境安装1、官网下载&#xff1a;<https://www.oracle.com/java/technologies/downloads/#java8>2、在usr文件夹下新建一个java文件夹3、解压完成后&#xff0c;将文件jdk文件传入到java目录下二、配置环境&#xff08;重点&#xff09;1、按 i 进行编…

蓝牙技术|苹果获空间音频新专利,AirPods可动态调整声学输出

美国商标和专利局&#xff08;USPTO&#xff09;公示的清单显示&#xff0c;苹果在近日获得了一项名为“测定虚拟聆听环境”的新专利。据悉&#xff0c;该技术可以改善用户的聆听体验&#xff0c;增强空间音频的沉浸感&#xff0c;未来有望应用在AirPods上。 这项专利技术可以…

代码随想录_二叉树_二叉树的层序遍历十道题

leetcode102.二叉树的程序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&…

文心一言对于宣传文案理解

前言 前段时间对于文心一言开放部分内测邀请&#xff0c;有幸获得邀请内测权限&#xff01;抱着试一试的态度对其进行了使用&#xff0c;结果还是比较满意的。我们来看一下我所说的满意是否能够达到你的要求&#xff01;&#xff01;&#xff01; 使用逻辑 文心一言的使用还…

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解

FPGA lattice 深力科LCMXO3LF-4300C-6BG256I 可实现高效、灵活和安全的工业应用开发 低功耗FPGA解决方案详情讲解 超低密度FPGA 是最新的立即启用、非挥发性、小型覆盖区 FPGA&#xff0c;采用先进的封装技术&#xff0c;能让每个元件达到最低成本。此系列采用最新的小型封装&…

android12 displayArea学习

一&#xff1a;数据结构分析 1&#xff1a;android 12 WindowContainer 的类继承关系如下 下图为 WindowContainer 简要的对象图。 下图是 Aosp默认的display层次结构对象图。 Aosp定义的feature有如下 FEATURE_ROOT 0; FEATURE_DEFAULT_TASK_CONTAINER 1; FEATURE_WINDOW_…

正版软件 Directory Opus 12 Pro Windows 平台上的资源管理器,定是功能完全、可定制化程度高的那款。

Directory Opus 是一款 Windows 平台上的资源管理器&#xff0c;定是功能最完全、可定制化程度最高的那款。你可以通过它完成几乎所有操作&#xff0c;包括查看图片元信息、预览图片、阅读文本文件内容、批量重命名、操作压缩文件以及 FTP 同步请求等。 Directory Opus 是一款由…

使用大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据

记录一下使用Java的SpringBoot大华SDK在智慧公厕项目中使大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据 首先根据说明书登录摄像头&#xff0c;一般摄像头都有自己的账号和密码(可能是admin admin 也可能是admin 888888 还有可能是admin 12345)&#xff0c;…

DriveGPT、车企订单背后,为什么毫末每年都能搞出新东西?

作者 | 祥威 编辑 | 德新 4月11日&#xff0c;毫末智行正式发布自动驾驶生成式大模型 DriveGPT&#xff0c;中文名 雪湖海若&#xff0c;可以提升自动驾驶认知能力&#xff0c;最终提升规控效率。 雪湖海若的核心&#xff0c;是将各种驾驶场景作为Token输入到模型中&#xff…

零基础搭建私人影音媒体平台【远程访问Jellyfin播放器】

文章目录1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置4.公网访问测试5. 结语1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&#xf…

react 1:jsx-组件-状态-事件

主要是为了解决什么问题 &#xff1f; 构建那些数据会随时间改变的大型应用 React 特点 虚拟 DOM 组件系统 单向数据流 jsx语法 jsx语法 组件创建方式 两种&#xff1a;class类组件&#xff0c;函数方式创建 代码快捷生成插件&#xff1a;&#xff1a;&#xff1a;rc…

算法 || DFS(深度优先搜索) BFS(广度优先搜索)

&#xff11;、基本概念 dfs全称为Depth First Search,即深度优先搜索。它的思想是沿着每一条可能的路径一个节点一个节点地往下搜索,搜到了路径的到终点再回溯,一直到所有路径搜索完为止。 bfsbfs全称为Breath First Search,即广度(宽度)优先搜索。它的思想是将每一层的结搜…

浅谈 如果做微服务了 这个模块怎么去划分?

如果做微服务了 这个模块怎么去划分&#xff1f; 还是高内聚 低耦合的一个思想吧 &#xff0c;单一职责的设计原则&#xff0c;也是一个封装的思想吧&#xff0c; 业务维度&#xff1a; ​ 按照业务的关联程度来决定&#xff0c;关联比较密切的业务适合拆分为一个微服务&…

Pandas.read_excel详解

文章目录基础知识语法参数详解-index_col参数详解-header参数详解-usecols参数详解-dtype其他参数多表读取基础知识 pandas 可以读取多种的数据格式&#xff0c;针对excel来说&#xff0c;可以使用read_excel()读取数据&#xff0c;如下&#xff1a; import pandas as pd dfp…

linux下使用lftp的小结

lftp的功能比较强大&#xff0c;相比原来用ftp&#xff0c;方便了很多。 1、登陆&#xff1a; lftp ftp://yournamesite pwd:***** 或 open ftp://yournamesite 2、基本操作&#xff08;转&#xff09; lftp使用介绍 lftp 是一个功能强大的下载工具&#xff0c;它支持访问…

JS Hook 基本使用

前言 Hook技术也叫钩子函数&#xff0c;功能是把网站的代码拉出来&#xff0c;改成我们自己想执行的代码片段&#xff0c;简单来说就是可以控制执行函数的入参和出参&#xff1b; 一、资源下载 编程猫插件&#xff1a;https://pan.baidu.com/s/1SP8xHoDpugssFRpu-nLxPw?pwdz…

少儿编程 电子学会图形化编程等级考试Scratch三级真题解析(选择题)2022年12月

2022年12月Scratch等级考试一级真题解析 选择题(共25题,每题2分,共50分) 1、默认小猫角色和气球角色都是显示状态,小猫程序如下图所示,气球没有程序,点击绿旗,舞台上最终显示的效果是 A、可能出现6个不同位置的小猫和6个小球 B、可能出现6个不同位置的小猫和1个气球…

初次使用yolov8遇到的问题

记录第一次使用yolo8跑自己的数据&#xff1b; 首先将官方文档看一下&#xff0c;大概捉摸了2个小时&#xff0c;地址&#xff1a;GitHub - ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > CoreML > TFLite 获得了基本的一些了解&#x…