我正在使用 Pytorch 来训练一些神经网络。我感到困惑的部分是:
prediction = myNetwork(img_batch)
max_act = prediction.max(1)[0].sum()
loss = softcrossentropy_loss - alpha * max_act
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,“prediction”是“myNetwork”的输出张量。我希望最大化一批“预测”的最大输出。
例如: [[-1.2, 2.0, 5.0 , 0.1, -1.5] [ 9.6 , -1.1, 0.7, 4,3, 3.3]] 对于第一个预测向量,第 3 个元素是最大的,而对于第二个预测向量,第 3 个元素是最大的,第一个元素是最大值。我想最大化“5.0+9.6”,尽管我们不知道新输入数据的最大输出是什么索引。
事实上,我的训练似乎是成功的,因为“max_act”部分确实增加了,这对我来说是期望的行为。然而,我听到一些关于 max() 操作是否可微的讨论:
Some says, mathmatically, max() is not differentiable.
Some says, max() is just an identity function to select the largest element, and this largest element is differentiable.
Run Code Online (Sandbox Code Playgroud)
所以我现在很困惑,我担心我最大化“max_act”的想法从一开始就是错误的。如果 max() 操作在 Pytorch 中可微分,有人可以提供一些指导吗?
我已经多次使用 pytorch 数据加载器的 shuffle 选项。但我想知道这种 shuffle 何时发生以及它是否在迭代期间动态执行。以下面的代码为例:
namesDataset = NamesDataset()
namesTrainLoader = DataLoader(namesDataset, batch_size=16, shuffle=True)
for batch_data in namesTrainLoader:
print(batch_data)
Run Code Online (Sandbox Code Playgroud)
当我们定义“namesTrainLoader”时,是否意味着shuffle结束,接下来的迭代将基于固定的数据顺序?定义了 namesTrainLoader 后,for 循环中会不会有任何随机性?
我试图用一些特殊值替换“batch_data”的一半:
for batch_data in namesTrainLoader:
batch_data[?8] = special_val
pre = model(batch_data)
Run Code Online (Sandbox Code Playgroud)
假设将有无数个 epoch,“模型”最终会看到“namesTrainLoader”中的所有数据吗?还是说“namesTrainLoader”的一半数据实际上丢给了“model”?