我从我的训练数据集中加载features和labels。它们最初都是 numpy 数组,但我使用torch.from _numpy(features.copy())和将它们更改为火炬张量torch.tensor(labels.astype(np.bool))。
而且我注意到,torch.autograd.Variable是一样的东西placeholder在tensorflow。
当我训练我的网络时,我首先尝试
features = features.cuda()
labels = labels.cuda()
outputs = Config.MODEL(features)
loss = Config.LOSS(outputs, labels)
Run Code Online (Sandbox Code Playgroud)
然后我试过了
features = features.cuda()
labels = labels.cuda()
input_var = Variable(features)
target_var = Variable(labels)
outputs = Config.MODEL(input_var)
loss = Config.LOSS(outputs, target_var)
Run Code Online (Sandbox Code Playgroud)
两个块都成功激活训练,但我担心可能会有细微差别。
在pytorch分类网络模型中定义为这样,
class Net(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__()
self.hidden = torch.nn.Linear(n_feature, n_hidden) # hidden layer
self.out = torch.nn.Linear(n_hidden, n_output) # output layer
def forward(self, x):
x = F.relu(self.hidden(x)) # activation function for hidden layer
x = self.out(x)
return x
Run Code Online (Sandbox Code Playgroud)
这里应用了 softmax 吗?在我看来,事情应该是这样的,
class Net(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__()
self.hidden = torch.nn.Linear(n_feature, n_hidden) # hidden layer
self.relu = torch.nn.ReLu(inplace=True)
self.out = torch.nn.Linear(n_hidden, n_output) # output layer
self.softmax = torch.nn.Softmax(dim=n_output)
def forward(self, x):
x = …Run Code Online (Sandbox Code Playgroud) 我知道有一个函数scipy.ndimage.zoom可以调整 3D 体积的大小\重新采样,但那是针对 numpy.array 的,而且它的速度非常慢。因此,我用ResampleImageFilterfromSimpleITK代替。我认为基于 C++ simpleitk 工作得更快。
但是使用 simpleitk 重新采样有一个小缺陷。ResampleImageFilter适用于SimpleITK.Image,但不适用于numpy.array,因此进行进一步操作非常不方便。还有其他方法可以对 3D 体积进行重新采样吗?
编辑
为什么我有这个担忧是因为我想利用 SimpleITK 重采样的快速速度,同时我想保持代码干净。例如,我需要对一个卷进行二进制阈值,然后对整个事物进行重新采样。所以这就是我的解决方案
binthresh = sitk.BinaryThresholdImageFilter()
... #setting up params for the binthresh
img = binarythresh.Execute(img)
resample = sitk.ResampleImageFilter()
... #setting up params for the resample
img = resample.Execute(img)
arr = sitk.GetArrayFromImage(img)
... # numpy operations on the arr
Run Code Online (Sandbox Code Playgroud)
但事实上,使用 numpy 进行二进制阈值的逻辑索引要简单得多,这将使我的代码更加紧凑。
总而言之,我想充分利用 SimpleITK 重采样,但有些操作可以通过 numpy 更好地完成,然后我的代码与 SimpleITK 和 numpy 都有点交织在一起。我认为这不是一件好事。
我在优化器 Adam 中设置了学习率衰减,例如
LR = 1e-3
LR_DECAY = 1e-2
OPTIMIZER = Adam(lr=LR, decay=LR_DECAY)
Run Code Online (Sandbox Code Playgroud)
正如 keras 文档Adam所说,在每个 epoch 之后,学习率将是
lr = lr * (1. / (1. + self.decay * K.cast(self.iterations, K.dtype(self.decay))))
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,学习率是这样的,
lr = lr * 1 / ( 1 + num_epoch * decay)
Run Code Online (Sandbox Code Playgroud)
但是在看到打印出来后,我没有看到学习率衰减生效。我用这个有什么问题吗?
编辑
我通过设置 的详细信息打印出学习ReduceLROnPlateau,例如,
ReduceLROnPlateau(monitor='val_loss', factor=0.75, patience=Config.REDUCE_LR_PATIENCE, verbose=1, mode='auto', epsilon=0.01, cooldown=0, min_lr=1e-6
Run Code Online (Sandbox Code Playgroud)
这将监控 val-loss 并通过乘以 来降低学习率factor。打印出来的学习率是这样的,
Epoch 00003: ReduceLROnPlateau reducing learning rate to 0.0007500000356230885.
Run Code Online (Sandbox Code Playgroud)
我将初始学习率设置为 1e-3。因此,看起来学习率从 1e-3 变为 1e-3 * 0.75,所以我怀疑 …
根据这个问题,我了解到,class_weight在keras训练期间应用加权损失,并且sample_weight如果我对所有训练样本没有相同的信心,则会按样本进行一些操作。
所以我的问题是,
class_weight,还是仅在训练期间加权?class_weight来平衡损失甚至使用过采样?可以将稍微不平衡的数据保留为通常的数据集处理吗?sample_weight为每个训练样本赋予的权重吗?而且我的训练样本可以得到同等的置信度,所以我可能不需要使用它。