矩阵向量点积
output = relu(dot(W, input) + b)
input的每个元素为三维的特征向量的特征,
W矩阵:
- 行:存储节点权重数组
- 列数表示节点数量
所以result[1]
和result[0]
运算互不干扰,能够并行加速
上述数学角度运算代码如下:
def naive_matrix_vector_dot(x, y):
assert len(x.shape) == 2 # (x为W矩阵,x.shape=(2,3), len(x.shape)=2)
assert len(y.shape) == 1 # (y为input向量)
assert x.shape[1] == y.shape[0]
z = np.zeros(x.shape[0])
for i in range(x.shape[0]):
for j in range(x.shape[1]):
z[i] += x[i, j] * y[j]
return z
两个矩阵点积(矩阵乘法)
def naive_matrix_dot(x, y):
assert len(x.shape) == 2
assert len(y.shape) == 2
assert x.shape[1] == y.shape[0]
z = np.zeros((x.shape[0], y.shape[1]))
for i in range(x.shape[0]):
for j in range(y.shape[1]):
row_x = x[i, :]
column_y = y[:, j]
z[i, j] = naive_vector_dot(row_x, column_y)
return z
# naive_vector_dot, 两个向量对应位置相乘再相加
def naive_vector_dot(x, y):
assert len(x.shape) == 1
assert len(y.shape) == 1
assert x.shape[0] == y.shape[0]
z = 0.
for i in range(x.shape[0]):
z += x[i] * y[i]
return z
随机梯度下降(SGD)
随机是每批小批量数据选取是随机的,但是梯度下降
Batch(批)——每个批、epoch的理解
model.add(layers.Dense(16, activation='relu', input_shape=(1000,))) # 每个样本大小为1000的词向量
每个样本如下(每个样本大小为1000的词向量):
history = model.fit(partial_x_train,
partial_y_train,
epochs=20, # 20轮次
batch_size=512, # batch size为512
validation_data=(x_val, y_val))
-
epochs=20:这里的“epochs”指的是训练周期。在每个 epoch 中,模型将对整个训练数据集进行一次完整的前向和反向传播。换句话说,每个 epoch 都会遍历整个训练数据集。因此,当设置
epochs=20
时,意味着模型将对训练数据集进行 20 次完整的前向和反向传播。在每个 epoch 结束时,模型会计算训练数据集上的损失值和准确率等指标。 -
batch_size=512:这里的“batch_size”指的是每次迭代时使用的样本数量。在训练神经网络时,通常不会对整个训练数据集进行单次前向和反向传播(这称为批量梯度下降,Batch Gradient Descent),因为这可能会非常耗时。相反,我们会将训练数据集分成许多较小的批次(称为 mini-batches),并在每个批次上执行一次前向和反向传播。
batch_size=512
表示每次迭代时从训练数据集中随机抽取 512 个样本进行训练。在每个批次的训练完成后,模型会更新权重以最小化损失函数。然后,在下一次迭代时,模型会从剩余的数据中抽取另一个 512 个样本的批次进行训练,直到整个训练数据集都被遍历一遍,完成一个 epoch。(总结:每个批次取512个,直到取完完成一轮epoch)
疑问点:每个batch会同时处理这 512 个样本,对这 512 个样本执行前向传播。这是为什么呢?
在每次迭代过程中,神经网络会同时接收一个包含 512 个样本的批次。这些样本会被组织成一个形状为 (512, 1000)
的二维数组。
-
右图:之前理解的单个词向量竖向排列,权重矩阵为(1000,16)——>输出(1,16)
-
左图:【每一行】都是【右图的一个词向量】,权重矩阵进行【并行运算】后——>输出(512,16)
并行计算:在神经网络的训练过程中,矩阵乘法操作可以并行化。这意味着我们可以将这个操作分解为许多独立的子任务,这些子任务可以在不同的 CPU 核心或 GPU 核心上同时执行。例如,在上面的例子中,我们可以将权重矩阵与 512 个样本的词向量的矩阵乘法操作分解为 512 个独立的子任务。每个子任务都涉及一个样本的词向量与权重矩阵相乘。通过将这些子任务分配给多个 CPU 核心或 GPU 核心,我们可以同时执行它们,从而大大加速训练过程。
Keras 和底层实现:Keras 是一个高级深度学习库,它抽象了底层计算的细节。当您在 Keras 中定义模型结构并调用
fit()
方法进行训练时,Keras 会自动处理并行计算的细节。对于 CPU 训练,Keras 会使用 NumPy 库执行矩阵运算,NumPy 会自动利用多个 CPU 核心进行并行计算。对于 GPU 训练,Keras 可以与底层深度学习库(如 TensorFlow、Theano 或 CNTK)集成,这些库专门针对 GPU 进行了优化,以实现更高效的并行计算。
one-hot编码
假设总共有1000个不同的单词,其中每个sequence单词个数不定。
python方法实现:
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
results[i, sequence] = 1.
return results
# Our vectorized training data
x_train = vectorize_sequences(train_data)
使用keras.utils.np_utilskeras
from tensorflow.python.keras.utils.np_utils import to_categorical
one_hot_train_labels = to_categorical(train_labels)
标签:训练,点积,样本,矩阵,hot,Batch,assert,shape,512
From: https://www.cnblogs.com/sherioc/p/18309463