问题标签 [mini-batch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
neural-network - Pytorch minibatching 使模型无法训练
我正在尝试通过二进制特征对序列进行分类。我有一个序列/标签对的数据集,并且正在使用一个简单的单层 LSTM 对每个序列进行分类。在我实施 minibatching 之前,我在测试集上获得了合理的准确率(80%),训练损失将从 0.6 变为 0.3(平均)。
我使用本教程的部分内容实现了 minibatching:https ://pytorch.org/tutorials/beginner/chatbot_tutorial.html
但是,现在我的模型在批量大小设置为 1 且所有其他参数完全相同的情况下,不会比 70-72%(70% 的数据有一个标签)做得更好。此外,损失从 0.0106 开始,很快变得非常小,结果没有显着变化。我觉得没有批处理和大小为 1 的批处理之间的结果应该是相同的,所以我可能有一个错误,但对于我的生活,我找不到它。我的代码如下。
训练代码(一个epoch):
功能:
模型:
neural-network - 迷你批处理神经网络
我正在尝试为我自己的 NN 正确实施迷你批处理。
但是我无法理解正在总结的内容?我是否对权重和偏差的梯度或增量权重(学习率已经相乘)求和,在我的示例中是:
三角洲重量:activation'(neurons) ⊗ Error * learningRate x input
三角洲偏差:activation'(neurons) ⊗ Error * learningRate
我是否还将这些总和的增量权重或梯度除以批量大小?
编辑:
所以所有问题总结起来:
- 没有学习率的增量权重称为梯度吗?
- 我是否需要将这些增量权重加起来,无论是否乘以学习率
- 所以我必须保存两个单独的渐变?(偏差+权重)
python - 如何使用 Tensorflow 2.0 生成自定义 mini-batches,例如论文“In defence of the triplet loss”中的那些?
我想使用 tf.data.Dataset API 在 Tensorflow 2.0 中实现一个自定义小批量生成器。具体来说,我有图像数据,100 个类,每个类约 200 个示例。对于每个 mini-batch,我想随机抽取 P 个类别和每个类别的 K 个图像,以获得 mini-batch 中的总共 P*K 个示例(如论文In Defense of the Triplet Loss for Person Re-识别])。
我一直在搜索tf.data.Dataset的文档,但似乎找不到正确的方法。我已经研究了该from_generator
方法,但它似乎不适合这个,因为据我所知,它从头开始生成整个数据集。
在我看来,一种方法是创建一个类似于BatchDataset
可以在tf.data.Dataset 源代码中找到的新类,我会在其中以某种方式实现逻辑,但我希望有一个更简单的解决方案说实话。
matlab - 代理何时在 Matalb 强化学习工具箱中学习?
我目前正在 Matlab R2019a 中测试强化学习工具箱。到目前为止一切都运行良好,但我偶然发现了一个文档无法令人满意地回答的问题:
代理什么时候学习?
文档说明了 minibatch-size
在每个训练集期间,代理在计算梯度以更新演员和评论家属性时从经验缓冲区中随机采样经验。
问题在于,“训练集”究竟是什么意思没有得到澄清。
RL-Toolbox 的训练功能是在一个情节结束时还是在情节中当步数超过小批量大小时(如基线算法中)训练代理?
我有以下代理设置
Ts = 0.25。一集的长度设置为 2000 步,因为代理在一个长期运行的过程中学习他的行为。不可能使情节更短,因为否则代理将无法满足所有有趣的状态。
也许有人可以启发我或给我一个提示我如何仔细检查?
我有监控 epsilon-decay 的想法(每次训练后都会发生),但我不知道如何在封闭的快速重启循环中执行此操作(这已经阻止我打开另一个 .m 文件)。
cluster-analysis - Mini Batch K-Means 和 Sequential/online K-Means 之间的差异
我正在使用 scikit-learn 库 sklearn.cluster 尝试 K-Means 及其变体的示例。minibatch K-Means clustering 和 online/sequential K-Means clustering 有什么区别?
我在 scikit 库中找不到在线 KMeans 的实现。如果批量大小为 1,那么 minibatch K-Means 将充当在线 K-Means ?
python - 尽管屏蔽了对 keras 中零填充小批量 LSTM 训练的支持,但预测为零
问题陈述
我在带有 tensorflow 后端(tf 版本 1.13.1)的 keras 中训练一个多对多 LSTM,在标记的文本序列上使用预训练的 GloVe 嵌入来预测序列中每个元素的标签。我的训练方案涉及小批量随机梯度下降,每个小批量矩阵按列进行零填充,以确保网络的输入长度相等。
至关重要的是,由于任务和数据的性质对我的小批量进行了自定义约束,我没有使用 keras 嵌入层。我的目标是为我的零填充单元实现屏蔽机制,以确保损失计算不会虚假地将这些单元视为真正的数据点。
方法
正如 keras文档中所解释的,keras 可以通过三种方式设置遮罩层:
-
使用设置为配置
keras.layers.Embedding
层。mask_zero
True
- 添加
keras.layers.Masking
图层; - 调用循环层时手动传递掩码参数。
因为我没有使用嵌入层来编码我的训练数据,所以我无法使用带有掩码嵌入层的选项 (1)。因此,我选择了 (2) 并在初始化模型后立即添加了一个遮罩层。然而,这种变化似乎没有产生效果。事实上,不仅我的模型的准确性没有提高,在预测阶段模型仍然产生零预测。为什么我的遮罩层不遮盖零填充单元格?这可能与在我的密集层中我指定 3 个类而不是 2 个(因此包括 0 作为单独的类)这一事实有关吗?
现有资源的限制
已经提出并回答了类似的问题,但我无法使用它们来解决我的问题。虽然这篇文章没有收到直接回应,但评论中提到的链接文章侧重于如何预处理数据以分配掩码值,这在这里没有争议。然而,掩蔽层初始化与此处使用的相同。这篇文章提到了同样的问题 - 遮罩层对性能没有影响 - 答案以与我相同的方式定义遮罩层,但再次侧重于将特定值转换为遮罩值。最后,这篇文章中的答案提供了相同的层初始化,没有进一步阐述。
玩具数据生成
为了重现我的问题,我生成了一个包含两个类 (1,2) 的玩具 10 批数据集。批次是一个可变长度的序列,用零填充到最大长度为 20 个嵌入,每个嵌入向量由 5 个单元组成,所以input_shape=(20,5)
. 两个类的嵌入值是从不同但部分重叠的截断正态分布生成的,为网络创建了一个可学习但并非微不足道的问题。我在下面包含了玩具数据,以便您可以重现该问题。
这是带有遮罩的模型的摘要:
我训练了一个有掩蔽层的模型和一个没有掩蔽层的模型,并使用以下方法计算了准确度:
我得到了 53.3% 的不带掩码模型的准确率和 33.3% 的带掩码模型。更令人惊讶的是,我在两个模型中都将零作为预测标签。为什么掩蔽层无法忽略零填充单元格?
重现问题的数据:
X_batches_train
y_batches_train
X_batches_test
y_batches_test
pytorch - Masking and computing loss for a padded batch sent through an RNN with a linear output layer in pytorch
Although a typical use case, I can't find one simple and clear guide on what is the canonical way to compute loss on a padded minibatch in pytorch, when sent through an RNN.
I think a canonical pipeline could be:
1) The pytorch RNN expects a padded batch tensor of shape: (max_seq_len, batch_size, emb_size)
2) So we give an Embedding layer for example this tensor:
9 is the padding index. Batch size is 2. The Embedding layer will make it to be of shape (max_seq_len, batch_size, emb_size). The sequences in the batch are in descending order, so we can pack it.
3) We apply pack_padded_sequence, we apply the RNN, finally we apply pad_packed_sequence. We have at this point (max_seq_len, batch_size, hidden_size)
4) Now we apply the linear output layer on the result and let's say the log_softmax. So at the end we have a tensor for a batch of scores of shape: (max_seq_len, batch_size, linear_out_size)
How should I compute the loss from here, masking out the padded part (with an arbitrary target)? Thanks!
tensorflow - 试图理解 tensorflow 数据集中小批量中的随机播放
从这里我了解了 shuffle、batch 和 repeat 的作用。我正在研究医学图像数据,其中每个小批量都有来自一个患者记录的切片。我正在寻找一种在训练时在小批量中随机播放的方法。我无法增加缓冲区大小,因为我不希望来自不同记录的切片混淆。有人可以解释一下如何做到这一点吗?
matlab - 训练样本成本函数与小批量成本函数之间的差异
假设我有一个名为“NN”的神经网络,具有 500 个权重和偏差(总参数 = 500)。
对于一个训练样本:它是通过'NN'引入的,它输出一个输出(Out1),输出与训练标签进行比较,并且使用反向传播算法,'的每个参数都有一个小的变化(正或负) NN'。成本函数由一个 1x500 维向量表示,所有小的修改都由反向传播算法获得。
假设 mini_batch_size=10
对于一个小批量:10 个训练样本中的每一个都提供 1x500 维度的成本函数。
为了更好地可视化和解释,假设我们创建了一个 10x500(称为 M)的矩阵,其中每一行都是每个训练样本的成本函数。
问题:对于小批量训练的例子,小批量的最终成本函数是所有列元素的平均值吗?
PD。如果问题不够清楚,我会留下一些代码说明我的意思。
Cost_mini_batch 的尺寸为 1x500。
neural-network - 在深度强化学习中,我是计算每小批量一次损失还是小批量每项损失一次?
神经网络和 Pytorch 的新手。
我在每个小批量中有 300 个回放记忆。我见过人们为 300 次回放记忆计算一次损失,但这对我来说并没有什么意义。300 个回放记忆来自非常不同的游戏状态,为什么将预测和目标之间的 300 个差异合并为一个值是有意义的?当模型反向传播时,梯度是否分成 300 个分支,每个分支对应于小批量中的一个条目?
例如,仍然使用其中每个具有 300 个重放存储器的小批量。我的策略网络输出 10 个动作的概率分布,或 300 x 10 张量,我的目标概率分布具有相同的形状。我想找到我的预测和目标之间的交叉熵损失。我想知道是否应该在 300 个大小为 [10] 张量的预测目标对之间找到 300 个交叉熵损失,或者在 1 个大小为 [3000] 张量的预测目标对之间找到 1 个交叉熵损失,如果这有意义的话. 另外我应该如何在 Pytorch 中实现它?我应该期望得到什么形式的损失?