我在堆栈溢出问题上问了这个问题,并被告知这是一个更好的地方。
我对术语验证和测试感到困惑,验证模型和测试是一样的吗?是否可以使用测试数据进行验证?
更让我困惑的是,何时使用验证?对于模型来说,这是必要的一步吗?另外,是否有可能进行验证而不是测试?
培训数据也可以与验证数据相同吗?
您还能知道这段代码是否进行测试吗?我真的很困惑
model.fit_generator(
training_gen(1000,25),
steps_per_epoch=50,
epochs=10000,
validation_data=validation_gen(1000, 25),
validation_steps=1,
callbacks=[checkpoint],
verbose=2)
model.load_weights('./temp_trained_25.h5')
BER = []
for SNR in range(5, 30, 5):
y = model.evaluate(
validation_gen(10000, SNR),
steps=1
)
BER.append(y[1])
print(y)
print(BER)注意到training_gen和validation_gen是:
def training_gen(bs, SNRdb = 20):
while True:
index = np.random.choice(np.arange(train_size), size=bs)
H_total = channel_train[index]
input_samples = []
input_labels = []
for H in H_total:
bits = np.random.binomial(n=1, p=0.5, size=(payloadBits_per_OFDM,))
signal_output, para = ofdm_simulate(bits, H, SNRdb)
input_labels.append(bits[0:16])
input_samples.append(signal_output)
yield (np.asarray(input_samples), np.asarray(input_labels))
def validation_gen(bs, SNRdb = 20):
while True:
index = np.random.choice(np.arange(train_size), size=bs)
H_total = channel_train[index]
input_samples = []
input_labels = []
for H in H_total:
bits = np.random.binomial(n=1, p=0.5, size=(payloadBits_per_OFDM,))
signal_output, para = ofdm_simulate(bits, H, SNRdb)
input_labels.append(bits[0:16])
input_samples.append(signal_output)
yield (np.asarray(input_samples), np.asarray(input_labels))我对深入学习很陌生,似乎一切都让我困惑,如果我的问题看起来毫无根据,我很抱歉,但如果你能帮我解决这个困惑,我会很感激。
提前感谢!
发布于 2022-01-22 01:46:16
通常,您首先将数据集拆分为列车/测试集,然后如果模型培训过程需要验证集,则可以将培训集进一步拆分为最终的火车集和验证集。一个简单的规则是,测试集永远不会出现在您的模型开发过程中,包括在您开发数据预处理步骤(例如数据规范化器)时。
在以下情况下,您需要一个验证集:
一个验证集应该只起一个作用,所以如果同时执行1和3,那么首先将数据分割成火车/测试集。然后,在每个交叉验证回合(从N轮中),您将您的火车集分成另一个火车集和1^{st}验证集。然后,在培训您的GBDT模型时,您再次将您的培训集划分为最终的培训集和您的2^{nd}验证集。您的1^{st}验证集用于交叉验证。您的2^{nd}验证集用于GBDT早期停止。
对于您的代码,我看到了两个潜在的问题:
channel_train,那么train_gen和valid_gen都来自同一个源,但是随机生成器的选择是不同的。这是一个问题,因为您不能保证您的列车和您的有效数据是相互不同的。因此,您有执行所有操作的代码,但是您可能没有确保train/valid/test数据是相互排斥的。
发布于 2022-01-21 21:59:54
您可以使用测试数据来执行超参数优化,以查看模型管道中哪些超参数工作得最好。然后,验证数据只使用一次来查看整个模型管道是如何在样本外数据上工作的。对于此过程,不能再次使用测试数据集,因为这些数据已经用于选择最佳的超参数。测试和验证的过程是相同的(即在样本外数据上测试模型的性能),但是应用这些概念的模型开发阶段是不同的。
发布于 2022-01-22 23:26:12
这个问题证明了科学方法已经迷失在ML世界关于模型的传播方式中,它会让学生在进入行业工作时感到困惑。
让我们通过对即将到来的赛季足球队训练的隐喻来说明不同之处。
当你在学校的时候,你通常会从大量的标签数据开始,并随机地将其划分为训练、验证和测试数据集。这并不一定是坏事,但它掩盖了数据集服务的不同目的。
培训数据应该是廉价的、丰富的和多样化的--这就是你的模型将用来实际学习的东西。验证数据是为了确保你的模型在训练过程中真的变得更好了--你不想要一支擅长训练,但在实际比赛中却很糟糕的足球队。测试数据是一个最终的检查,您的模型可以在尽可能接近它将看到的条件下运行。通常,测试看起来与培训和验证非常不同--例如,您可能在标记的输入数据上训练和验证一个分类器,但随后在一些下游任务上测试模型,这些下游任务使用分类器作为输入特性的来源。
https://datascience.stackexchange.com/questions/107327
复制相似问题