深度学习 第六章 深度前馈网络 后半部分
ztj100 2025-04-24 10:43 11 浏览 0 评论
深度学习计算图是一种图形化表示神经网络中计算流程的方法。它由节点和边组成,节点代表计算操作,边代表数据流动。每个节点接收输入数据并进行一些计算操作,然后将结果传递给其他节点。
举例来说,假设我们要实现一个简单的神经网络来识别手写数字。我们可以使用深度学习框架如TensorFlow或PyTorch来构建计算图。
首先,我们需要定义输入节点,表示输入的手写数字图像。然后,我们可以通过卷积操作来提取图像的特征,这可以使用卷积层节点来表示。接下来,我们可以使用池化层节点来降低特征图的大小。然后,我们可以使用全连接层节点来将特征图映射到输出类别。最后,我们可以使用softmax节点来计算输出类别的概率分布。
下面是一个使用TensorFlow构建的简单计算图的示例代码:
import tensorflow as tf
# 定义输入节点
input_node = tf.placeholder(tf.float32, shape=[None, 28, 28, 1])
# 定义卷积层节点
conv1 = tf.layers.conv2d(input_node, filters=32, kernel_size=[3, 3], activation=tf.nn.relu)
conv2 = tf.layers.conv2d(conv1, filters=64, kernel_size=[3, 3], activation=tf.nn.relu)
# 定义池化层节点
pool1 = tf.layers.max_pooling2d(conv2, pool_size=[2, 2], strides=2)
# 将特征图展平
flatten = tf.layers.flatten(pool1)
# 定义全连接层节点
fc1 = tf.layers.dense(flatten, units=128, activation=tf.nn.relu)
fc2 = tf.layers.dense(fc1, units=10)
# 定义输出节点
output_node = tf.nn.softmax(fc2)
在这个例子中,我们首先定义了一个输入节点input_node,然后通过卷积层节点conv1和conv2进行特征提取,接着使用池化层节点pool1进行特征图的降维,然后将特征图展平为一维向量,再通过全连接层节点fc1和fc2进行特征映射,最后使用softmax节点output_node计算输出类别的概率分布。
这个计算图表示了神经网络的计算流程,我们可以通过向输入节点传入手写数字图像数据,然后通过计算图进行前向传播,最终得到输出类别的概率分布。
链式法则是微积分中用于计算复合函数导数的重要规则。在深度学习中,链式法则被广泛应用于计算神经网络中各层之间的梯度。
链式法则的数学表达式如下:
假设有函数 y = f(g(x)),其中 f 和 g 是可微分函数,则 y 对 x 的导数可以通过以下公式计算:
dy/dx = df/dg * dg/dx
在深度学习中,我们通常将 f 称为损失函数,g 称为激活函数,x 表示输入数据,y 表示输出数据。
下面是一个使用链式法则计算梯度的简单示例,使用 Python 代码实现:
import numpy as np
# 定义损失函数 f
def f(x):
return x**2
# 定义激活函数 g
def g(x):
return np.exp(x)
# 定义输入数据 x
x = 2
# 计算 f 对 g 的导数
df_dg = 2 * g(x)
# 计算 g 对 x 的导数
dg_dx = np.exp(x)
# 计算 y 对 x 的导数
dy_dx = df_dg * dg_dx
print(dy_dx) # 输出结果为 29.5562243957226
在上述示例中,我们定义了一个简单的损失函数 f 和一个激活函数 g,并给定了输入数据 x。通过链式法则,我们计算了 y 对 x 的导数,并打印出结果。
需要注意的是,深度学习中的计算通常是在张量(tensor)上进行的,而不是单个数值。因此,在实际应用中,我们需要使用张量操作库(如 TensorFlow 或 PyTorch)来实现链式法则的计算。
在深度学习中,反向传播是一种用于计算神经网络中参数梯度的方法,它使用了链式法则的递归应用。
反向传播的过程可以简单概括为以下几个步骤:
- 前向传播:通过神经网络的前向计算,从输入到输出计算每一层的输出结果。
- 计算损失函数:根据网络的输出和真实标签计算损失函数,用于衡量模型预测的准确性。
- 反向传播:从损失函数开始,计算每个参数对损失函数的梯度。
- 更新参数:根据梯度和优化算法的规则,更新网络中的参数。
在反向传播中,链式法则被递归地应用于每个参数的梯度计算。假设我们有一个简单的神经网络,包含一个隐藏层和一个输出层。我们可以使用Python来演示反向传播的实现。
import numpy as np
# 定义前向传播函数
def forward_pass(x, W1, b1, W2, b2):
# 隐藏层的输出
h = np.dot(W1, x) + b1
# 隐藏层的激活函数(例如ReLU)
h_relu = np.maximum(0, h)
# 输出层的输出
y_pred = np.dot(W2, h_relu) + b2
return y_pred, h_relu
# 定义反向传播函数
def backward_pass(x, y, y_pred, h_relu, W1, b1, W2, b2):
# 计算输出层的梯度
grad_y_pred = 2.0 * (y_pred - y)
# 计算输出层参数的梯度
grad_W2 = np.dot(grad_y_pred, h_relu.T)
grad_b2 = np.sum(grad_y_pred, axis=1, keepdims=True)
# 计算隐藏层的梯度
grad_h_relu = np.dot(W2.T, grad_y_pred)
# 计算隐藏层的激活函数的梯度
grad_h = grad_h_relu.copy()
grad_h[h < 0] = 0
# 计算隐藏层参数的梯度
grad_W1 = np.dot(grad_h, x.T)
grad_b1 = np.sum(grad_h, axis=1, keepdims=True)
return grad_W1, grad_b1, grad_W2, grad_b2
# 定义参数和输入数据
x = np.random.randn(3, 1)
y = np.random.randn(2, 1)
W1 = np.random.randn(4, 3)
b1 = np.random.randn(4, 1)
W2 = np.random.randn(2, 4)
b2 = np.random.randn(2, 1)
# 进行前向传播
y_pred, h_relu = forward_pass(x, W1, b1, W2, b2)
# 进行反向传播
grad_W1, grad_b1, grad_W2, grad_b2 = backward_pass(x, y, y_pred, h_relu, W1, b1, W2, b2)
# 更新参数
learning_rate = 0.01
W1 -= learning_rate * grad_W1
b1 -= learning_rate * grad_b1
W2 -= learning_rate * grad_W2
b2 -= learning_rate * grad_b2
在这个例子中,我们首先定义了前向传播函数和反向传播函数。然后,我们生成了随机的输入数据和参数,并使用前向传播计算了网络的输出。接下来,我们使用反向传播计算了参数的梯度,并使用梯度下降法更新了参数。
通过递归地使用链式法则,反向传播可以高效地计算神经网络中的参数梯度,从而实现了深度学习模型的训练。
在深度学习中,全连接多层感知机(Multilayer Perceptron, MLP)是一种常用的神经网络结构。反向传播算法用于计算MLP中参数的梯度,从而进行模型的优化。
反向传播的计算过程可以分为两个步骤:前向传播和反向传播。
- 前向传播:
在前向传播过程中,输入数据通过神经网络的各层进行计算,直至得到最终的预测值。具体的计算过程如下:
- 将输入数据传递给第一层,计算第一层的输出。
- 将第一层的输出作为输入,传递给第二层,计算第二层的输出。
- 重复以上步骤,直至计算出最后一层的输出。
- 反向传播:
在反向传播过程中,通过链式法则计算各层的参数梯度。具体的计算过程如下:
- 计算最后一层的误差(损失函数对最后一层输出的导数)。
- 从最后一层开始,逐层计算梯度并传递给前一层。每一层的梯度计算包括两部分:对该层输入的导数和对该层参数的导数。
- 使用梯度下降等优化算法更新参数。
下面是一个使用Python示例,演示了如何使用反向传播算法计算全连接MLP的参数梯度:
import numpy as np
# 定义MLP的前向传播函数
def forward_propagation(X, W1, b1, W2, b2):
# 第一层的输出
Z1 = np.dot(X, W1) + b1
A1 = np.tanh(Z1)
# 第二层的输出
Z2 = np.dot(A1, W2) + b2
A2 = sigmoid(Z2)
return A2
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义反向传播函数
def backward_propagation(X, y, W1, b1, W2, b2):
m = X.shape[0] # 样本数量
# 前向传播
A2 = forward_propagation(X, W1, b1, W2, b2)
# 计算最后一层的误差
dZ2 = A2 - y
# 计算第二层参数的梯度
dW2 = (1 / m) * np.dot(A1.T, dZ2)
db2 = (1 / m) * np.sum(dZ2, axis=0, keepdims=True)
# 计算第一层参数的梯度
dZ1 = np.dot(dZ2, W2.T) * (1 - np.power(A1, 2))
dW1 = (1 / m) * np.dot(X.T, dZ1)
db1 = (1 / m) * np.sum(dZ1, axis=0, keepdims=True)
return dW1, db1, dW2, db2
# 定义训练函数
def train(X, y, num_iterations, learning_rate):
# 初始化参数
np.random.seed(0)
W1 = np.random.randn(X.shape[1], 4)
b1 = np.zeros((1, 4))
W2 = np.random.randn(4, 1)
b2 = np.zeros((1, 1))
# 迭代训练
for i in range(num_iterations):
# 反向传播计算梯度
dW1, db1, dW2, db2 = backward_propagation(X, y, W1, b1, W2, b2)
# 更新参数
W1 -= learning_rate * dW1
b1 -= learning_rate * db1
W2 -= learning_rate * dW2
b2 -= learning_rate * db2
# 每迭代100次输出一次损失值
if i % 100 == 0:
A2 = forward_propagation(X, W1, b1, W2, b2)
loss = np.mean(np.square(A2 - y))
print(f"Iteration {i}, loss: {loss}")
return W1, b1, W2, b2
# 生成示例数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# 训练模型
W1, b1, W2, b2 = train(X, y, num_iterations=1000, learning_rate=0.1)
# 使用训练好的模型进行预测
A2 = forward_propagation(X, W1, b1, W2, b2)
predictions = (A2 > 0.5).astype(int)
print("Predictions:", predictions)
这个示例演示了一个简单的全连接MLP,使用反向传播算法进行训练,并使用训练好的模型进行预测。
在深度学习中,符号到符号的导数表示了一个符号表达式对于另一个符号表达式的导数。它在计算图中的节点之间传递梯度信息,用于更新参数和优化模型。
举例来说,假设我们有一个简单的数学表达式:y = f(g(x)),其中f和g是一些函数。我们想要计算y对于x的导数。首先,我们计算g对于x的导数,然后将其乘以f对于g的导数,得到y对于x的导数。
下面是一个使用符号到符号的导数计算的示例代码:
import sympy as sp
# 定义符号变量
x = sp.Symbol('x')
# 定义函数表达式
g = x**2
f = sp.sin(g)
# 计算导数
df_dx = sp.diff(f, x)
# 打印结果
print(df_dx)
在这个例子中,我们定义了一个函数表达式f和g,并使用sympy库中的diff函数计算f对于x的导数。最后,我们打印出结果。
这种符号到符号的导数计算方法可以方便地应用于深度学习中的各种模型和算法,例如反向传播算法中的参数更新。
深度学习中的一般化反向传播(Generalized Backpropagation)是指通过链式法则来计算神经网络中各个参数的梯度,从而进行模型的优化。
具体来说,一般化反向传播包括以下步骤:
- 前向传播:将输入数据通过神经网络的各层进行计算,得到输出结果。
- 计算损失函数:将输出结果与真实标签进行比较,计算损失函数。
- 反向传播:通过链式法则,从输出层开始,逐层计算各个参数的梯度。具体步骤如下:
- a. 计算输出层的梯度:根据损失函数的梯度和激活函数的导数,计算输出层的梯度。
- b. 传递梯度:将输出层的梯度传递到前一层,通过权重矩阵的转置和激活函数的导数,计算前一层的梯度。
- c. 计算参数梯度:根据前一层的梯度和输入数据,计算当前层的参数梯度。
- 更新参数:根据参数的梯度和优化算法(如梯度下降),更新神经网络中的参数。
下面是一个简单的示例,展示如何使用Python实现一般化反向传播:
import numpy as np
# 前向传播
def forward_propagation(inputs, weights):
return np.dot(inputs, weights)
# 计算损失函数
def compute_loss(predictions, targets):
return np.mean((predictions - targets) ** 2)
# 反向传播
def backward_propagation(inputs, predictions, targets, weights):
# 计算输出层的梯度
output_gradient = 2 * (predictions - targets)
# 传递梯度
hidden_gradient = np.dot(output_gradient, weights.T)
# 计算参数梯度
weight_gradient = np.dot(inputs.T, output_gradient)
return weight_gradient, hidden_gradient
# 更新参数
def update_weights(weights, weight_gradient, learning_rate):
weights -= learning_rate * weight_gradient
# 训练模型
def train(inputs, targets, weights, learning_rate, epochs):
for epoch in range(epochs):
# 前向传播
predictions = forward_propagation(inputs, weights)
# 计算损失函数
loss = compute_loss(predictions, targets)
# 反向传播
weight_gradient, hidden_gradient = backward_propagation(inputs, predictions, targets, weights)
# 更新参数
update_weights(weights, weight_gradient, learning_rate)
# 打印损失函数
if epoch % 100 == 0:
print(f"Epoch {epoch}: Loss = {loss}")
这是一个简单的单层神经网络的示例,其中使用了线性激活函数和均方误差损失函数。在训练过程中,通过一般化反向传播来更新参数,使得损失函数逐渐减小,从而优化模型。
在深度学习中,多层感知机(Multilayer Perceptron,MLP)是一种常见的神经网络模型。反向传播算法用于训练MLP模型,通过计算参数的梯度来更新模型的权重。
下面是一个用于MLP训练的反向传播的解释和Python示例:
- 初始化模型参数:包括权重和偏置项。
- 前向传播:将输入数据通过多个隐藏层传递,计算输出结果。
- 计算损失函数:比较模型的输出和真实标签,得到一个损失值。
- 反向传播:通过链式法则计算每个参数的梯度。首先计算输出层的梯度,然后逐层向前计算隐藏层的梯度。
- 参数更新:使用梯度下降法或其他优化算法,根据梯度来更新模型的参数。
下面是一个使用Python实现的MLP反向传播的示例代码:
import numpy as np
# 初始化模型参数
input_size = 10
hidden_size = 20
output_size = 5
learning_rate = 0.1
# 随机初始化权重和偏置项
W1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros(hidden_size)
W2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros(output_size)
# 前向传播
def forward(X):
hidden_layer = np.dot(X, W1) + b1
hidden_layer_activation = sigmoid(hidden_layer)
output_layer = np.dot(hidden_layer_activation, W2) + b2
output_layer_activation = sigmoid(output_layer)
return output_layer_activation
# 反向传播
def backward(X, y, output):
output_error = output - y
output_delta = output_error * sigmoid_derivative(output)
hidden_error = np.dot(output_delta, W2.T)
hidden_delta = hidden_error * sigmoid_derivative(hidden_layer_activation)
# 更新参数
W2 -= learning_rate * np.dot(hidden_layer_activation.T, output_delta)
b2 -= learning_rate * np.sum(output_delta, axis=0)
W1 -= learning_rate * np.dot(X.T, hidden_delta)
b1 -= learning_rate * np.sum(hidden_delta, axis=0)
# 训练模型
def train(X, y):
output = forward(X)
backward(X, y, output)
# sigmoid激活函数及其导数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
# 示例数据
X = np.random.randn(100, input_size)
y = np.random.randint(0, 2, (100, output_size))
# 训练模型
for i in range(1000):
train(X, y)
这是一个简单的MLP反向传播的示例,其中包含了前向传播、计算损失函数、反向传播和参数更新的步骤。通过多次迭代训练,模型可以逐渐优化并适应训练数据。
深度学习是一种机器学习方法,通过构建深层神经网络来解决复杂的任务。相比于传统的浅层神经网络,深度学习模型可以学习到更多抽象的特征表示,从而提高模型的性能。
深度学习的复杂化体现在以下几个方面:
- 深层网络结构:深度学习模型通常由多个隐藏层组成,每个隐藏层都包含多个神经元。这种深层结构使得模型能够学习到更多层次的特征表示,从而更好地捕捉数据的复杂性。
- 大规模数据集:深度学习模型通常需要大量的训练数据来进行训练。通过使用大规模数据集,模型可以更好地学习到数据的分布,提高模型的泛化能力。
- 复杂的优化算法:深度学习模型的训练通常使用梯度下降算法及其变种。由于深度学习模型的参数量巨大,优化算法需要处理大规模的参数空间,从而提高模型的性能。
下面是一个使用Python实现的深度学习模型的示例:
import numpy as np
# 定义深度学习模型的参数
input_dim = 100
hidden_dim = 50
output_dim = 10
# 初始化模型的权重
W1 = np.random.randn(input_dim, hidden_dim)
b1 = np.zeros(hidden_dim)
W2 = np.random.randn(hidden_dim, output_dim)
b2 = np.zeros(output_dim)
# 定义前向传播函数
def forward(X):
# 计算隐藏层输出
hidden = np.dot(X, W1) + b1
hidden_activation = np.maximum(0, hidden) # 使用ReLU激活函数
# 计算输出层输出
scores = np.dot(hidden_activation, W2) + b2
return scores
# 定义损失函数
def compute_loss(scores, y):
num_examples = scores.shape[0]
exp_scores = np.exp(scores)
probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
loss = -np.log(probs[range(num_examples), y])
data_loss = np.sum(loss) / num_examples
return data_loss
# 定义反向传播函数
def backward(X, y, scores):
num_examples = X.shape[0]
exp_scores = np.exp(scores)
probs = exp_scores / np.sum(exp_scores, axis=1, keepdims=True)
dscores = probs
dscores[range(num_examples), y] -= 1
dscores /= num_examples
dW2 = np.dot(hidden_activation.T, dscores)
db2 = np.sum(dscores, axis=0)
dhidden = np.dot(dscores, W2.T)
dhidden[hidden <= 0] = 0 # ReLU的导数
dW1 = np.dot(X.T, dhidden)
db1 = np.sum(dhidden, axis=0)
return dW1, db1, dW2, db2
# 定义模型训练函数
def train(X, y, num_epochs, learning_rate):
for epoch in range(num_epochs):
# 前向传播
scores = forward(X)
# 计算损失
loss = compute_loss(scores, y)
# 反向传播
dW1, db1, dW2, db2 = backward(X, y, scores)
# 更新参数
W1 += -learning_rate * dW1
b1 += -learning_rate * db1
W2 += -learning_rate * dW2
b2 += -learning_rate * db2
# 打印损失
if epoch % 100 == 0:
print("Epoch %d, loss: %f" % (epoch, loss))
# 生成随机数据
X = np.random.randn(1000, input_dim)
y = np.random.randint(output_dim, size=1000)
# 训练模型
train(X, y, num_epochs=1000, learning_rate=0.1)
以上示例展示了一个简单的MLP模型的训练过程,包括前向传播、损失计算、反向传播和参数更新。通过多次迭代,模型可以逐渐优化,减小损失。
微分是数学中的一个概念,用于描述函数在某一点的变化率。在深度学习中,微分在反向传播算法中起着重要的作用,用于计算损失函数对于模型参数的梯度,从而进行参数的更新。
下面是一个简单的Python示例,展示如何使用Python库来计算函数的微分:
import sympy as sp
# 定义变量
x = sp.symbols('x')
# 定义函数
f = x**2 + 2*x + 1
# 计算微分
df = sp.diff(f, x)
# 打印结果
print(df)
运行上述代码,将输出函数f的微分结果2*x + 2。
这个示例展示了如何使用Python的sympy库来计算函数的微分。通过定义变量和函数,并使用diff函数来计算微分,可以得到函数在某一点的变化率。在深度学习中,我们经常需要计算损失函数对于模型参数的微分,以便进行梯度下降优化算法的更新。
高阶微分是指对一个函数进行多次微分的过程。在深度学习中,高阶微分可以用于计算函数的二阶导数,从而更精确地描述函数的曲率和变化率。
举个例子,假设我们有一个函数f(x) = x^3,我们想要计算它的二阶导数。在Python中,可以使用SymPy库来进行符号计算:
import sympy as sp
x = sp.symbols('x')
f = x**3
f_2nd_derivative = sp.diff(f, x, 2)
print(f_2nd_derivative)
运行以上代码,我们可以得到函数f(x) = x^3的二阶导数为6。
高阶微分在深度学习中有着重要的应用,例如在优化算法中,如牛顿法和拟牛顿法,使用二阶导数可以更准确地确定梯度下降的方向和步长,从而加快模型的收敛速度。此外,高阶微分还可以用于计算函数的曲率、凸性等特性,对于模型的优化和改进具有重要的指导意义。
深度学习是机器学习的一个分支,旨在通过模拟人类神经系统的工作原理来实现人工智能。它的历史可以追溯到上世纪50年代的感知机模型,但由于当时计算能力和数据量的限制,深度学习的发展进展缓慢。直到近年来,随着计算能力的提升和大规模数据的可用性,深度学习才得以迅速发展。
Python是深度学习领域最常用的编程语言之一,拥有丰富的深度学习库和工具。下面是一个使用Python实现的简单例子,展示了如何使用深度学习进行图像分类:
import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
# 加载MNIST数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 数据预处理
x_train = x_train / 255.0
x_test = x_test / 255.0
# 构建模型
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train, epochs=5)
# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print('Test accuracy:', test_acc)
以上代码使用了TensorFlow库,构建了一个简单的全连接神经网络模型,用于对手写数字进行分类。通过训练和评估模型,可以得到模型在测试集上的准确率。这个例子展示了深度学习在图像分类任务上的应用。
相关推荐
- 如何将数据仓库迁移到阿里云 AnalyticDB for PostgreSQL
-
阿里云AnalyticDBforPostgreSQL(以下简称ADBPG,即原HybridDBforPostgreSQL)为基于PostgreSQL内核的MPP架构的实时数据仓库服务,可以...
- Python数据分析:探索性分析
-
写在前面如果你忘记了前面的文章,可以看看加深印象:Python数据处理...
- C++基础语法梳理:算法丨十大排序算法(二)
-
本期是C++基础语法分享的第十六节,今天给大家来梳理一下十大排序算法后五个!归并排序...
- C 语言的标准库有哪些
-
C语言的标准库并不是一个单一的实体,而是由一系列头文件(headerfiles)组成的集合。每个头文件声明了一组相关的函数、宏、类型和常量。程序员通过在代码中使用#include<...
- [深度学习] ncnn安装和调用基础教程
-
1介绍ncnn是腾讯开发的一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖,跨平台,但是通常都需要protobuf和opencv。ncnn目前已在腾讯多款应用中使用,如QQ,Qzon...
- 用rust实现经典的冒泡排序和快速排序
-
1.假设待排序数组如下letmutarr=[5,3,8,4,2,7,1];...
- ncnn+PPYOLOv2首次结合!全网最详细代码解读来了
-
编辑:好困LRS【新智元导读】今天给大家安利一个宝藏仓库miemiedetection,该仓库集合了PPYOLO、PPYOLOv2、PPYOLOE三个算法pytorch实现三合一,其中的PPYOL...
- C++特性使用建议
-
1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...
- Qt4/5升级到Qt6吐血经验总结V202308
-
00:直观总结增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理。把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能。把一些Qt5中兼容Qt4的方法废...
- 到底什么是C++11新特性,请看下文
-
C++11是一个比较大的更新,引入了很多新特性,以下是对这些特性的详细解释,帮助您快速理解C++11的内容1.自动类型推导(auto和decltype)...
- 掌握C++11这些特性,代码简洁性、安全性和性能轻松跃升!
-
C++11(又称C++0x)是C++编程语言的一次重大更新,引入了许多新特性,显著提升了代码简洁性、安全性和性能。以下是主要特性的分类介绍及示例:一、核心语言特性1.自动类型推导(auto)编译器自...
- 经典算法——凸包算法
-
凸包算法(ConvexHull)一、概念与问题描述凸包是指在平面上给定一组点,找到包含这些点的最小面积或最小周长的凸多边形。这个多边形没有任何内凹部分,即从一个多边形内的任意一点画一条线到多边形边界...
- 一起学习c++11——c++11中的新增的容器
-
c++11新增的容器1:array当时的初衷是希望提供一个在栈上分配的,定长数组,而且可以使用stl中的模板算法。array的用法如下:#include<string>#includ...
- C++ 编程中的一些最佳实践
-
1.遵循代码简洁原则尽量避免冗余代码,通过模块化设计、清晰的命名和良好的结构,让代码更易于阅读和维护...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)