- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习深度学习,我正在尝试将 RNN 与时间序列金融数据的训练、测试和验证集结合使用。下面是我的代码:
def get_lr(optimizer):
for param_group in optimizer.param_groups:
return param_group['lr']
# In[63]:
def train_model(epoch, model, optimizer, train_loader):
model.train()
t0 = time.time()
correct = 0
total = 0
final_loss = 0
for batch_idx, (X,labels) in enumerate(train_loader):
data,labels = map(lambda x: Variable(x), [X,labels])
optimizer.zero_grad()
output = model(data)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
##print('device : ', device)
final_output=output.to(device)
loss = F.cross_entropy(final_output, labels)
final_loss += loss.item()
loss.backward()
optimizer.step()
print('predicted labels',final_output.squeeze())
#print('Actual labels',labels.squeeze())
print('Train Epoch: {} Batch: {} [{}/{} ({:.2f}%, time:{:.2f}s)]\tBatch Loss: {:.6f}'.format(
epoch, batch_idx, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), time.time() - t0,
final_loss))
##avg_loss))
_, predicted = torch.max(output.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
t0 = time.time()
final_loss /= (batch_idx+1)
accuracy = 100*correct/total
lr = get_lr(optimizer)
learning_rates.append(lr)
print('Training Accuracy : ',accuracy)
print('Training Loss : ',final_loss)
print('Learning Rate : ',lr)
if epoch%epoch_interval == 0 or epoch ==1 or epoch == epochs:
path = base_path + 'models/RNN/rnn_'
torch.save(model,path+str(epoch)+'.pth')
##torch.save(model,path)
print('model saved')
if epoch%plot_epoch_interval == 0 or epoch ==1 or epoch == epochs:
epochs_list.append(epoch)
train_loss.append(final_loss)
train_accuracies.append(accuracy)
return lr,final_loss,accuracy
# In[166]:
def validate(epoch,model, val_loader,optimizer):
model.eval()
val_loss = 0
correct = 0
total = 0
loss = 0
ypred,ytrue,scores = [],[],[]
for batch_idx,(X,labels) in enumerate(val_loader):
data,labels = map(lambda x: Variable(x), [X,labels])
output = model(data)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
final_val_output=output.to(device)
val_loss += F.cross_entropy(final_val_output, labels) # sum up batch loss
_, predicted = torch.max(output.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
ypred.extend(predicted.tolist())
ytrue.extend(labels.tolist())
scores.extend(output.tolist())
val_loss /= (batch_idx+1)
accuracy = 100*correct/total
if epoch%plot_epoch_interval == 0 or epoch ==1 or epoch == epochs:
validation_loss.append(val_loss.item())
val_accuracies.append(accuracy)
print('Accuracy : ',accuracy)
print('\nVal set: Average loss: {:.4f}, Accuracy: {}/{} ({:.4f}%)\n'.format(
val_loss, correct,total,accuracy))
print("==============================================")
return "{:.4f}%".format(100.* correct / total), accuracy,loss,ypred,ytrue,scores
# In[276]:
def test(data_loader,model):
torch.manual_seed(1)
np.random.seed(1)
#data_loader = DataLoader(FinancialData(xtest,ytest), batch_size = batch_size, shuffle = False)
model = torch.load(path)
model.eval()
for params in model.parameters():
print(params)
val_loss = 0
correct = 0
total = 0
loss = 0
ypred,ytrue,scores = [],[],[]
with torch.no_grad():
for batch_idx,(X,labels) in enumerate(data_loader):
data,labels = map(lambda x: Variable(x), [X,labels])
output = model(data)
_, predicted = torch.max(output.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
ypred.extend(predicted.tolist())
ytrue.extend(labels.tolist())
scores.extend(output.tolist())
accuracy = 100*correct/total
print('Test Accuracy : ',accuracy)
# In[288]:
def train_on_batch(lr,epochs,momentum,X_train,Y_train,X_val,Y_val,batch_size):
cuda=False
seed=1
torch.manual_seed(seed)
train_loader = DataLoader(FinancialData(X_train,Y_train),batch_size=batch_size,shuffle=True)
val_loader = DataLoader(FinancialData(X_val,Y_val),batch_size=batch_size,shuffle=False)
test_loader = DataLoader(FinancialData(X_test_new,Y_test), batch_size = batch_size, shuffle = False)
input_size = 1
hid_size = 10
num_layers = 2
num_classes = len(np.unique(Y_train))
dropRate = 0.0
bidirection = True
model = Network(input_size=input_size,hid_size =hid_size,window_size = window_size,num_layers=num_layers,
num_classes=num_classes,dropRate = dropRate,bidirection=bidirection)
ypred,ytrue, scores = [],[],[]
for params in model.parameters():
print(params)
optimizer = torch.optim.Adam(model.parameters(), lr=lr, betas=(0.9, 0.999), eps=1e-08, weight_decay=1e-4, amsgrad=False)
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,'max', factor=0.25, patience=6, verbose=True,
threshold_mode='abs', threshold=0.01, min_lr=1e-6)
#scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'max', factor=0.5, patience=5,
# verbose=True,threshold_mode='abs', threshold=0.01,
# min_lr=1e-6)
path = base_path + 'models/RNN/rnn_best_model.pth'
best_val_loss = 0
best_val_acc = 0
best_epoch = 0
best_lr = lr
best_tr_acc = 0
for epoch in range(1, epochs + 1):
tuned_lr,tr_loss,tr_acc = train_model(epoch, model, optimizer, train_loader)
acc_str, val_acc, val_loss, ypred, ytrue, scores = validate(epoch,model,val_loader,optimizer)
if val_acc >= best_val_acc:
torch.save(model,path)
#best_val_loss = val_loss
best_val_acc = val_acc
best_epoch = epoch
best_lr = tuned_lr
best_tr_acc = tr_acc
scheduler.step(val_acc)
#scheduler.step(tr_acc)
print('='*100)
# for params in model.parameters():
# print(params)
# print('='*100)
test(val_loader,model)
test(test_loader,model)
#validate(epoch,model,val_loader,optimizer)
#validate(epoch,model,test_loader,optimizer)
print('best epoch : {}, best_lr : {}, best_tr_acc : {}, best val_acc : {:.4f}\n'.format(best_epoch,best_lr,best_tr_acc,best_val_acc))
scores = np.asarray(scores)
return tr_acc,val_acc, ypred, ytrue, scores
# In[289]:
cuda=torch.cuda.is_available()
X_train,Y_train,X_val,Y_val,X_test,Y_test = splitDataWithVal(feat_wise_data,labels_new,test_size=0.2,val_size=0.25)
X_train_new, X_val_new, X_test_new = standardizeDataVal(X_train, X_test, X_val, mode = 'Normalizer')
# # Check for Class Imbalance
# In[292]:
Ytrain_df= pd.DataFrame(Y_train,columns=[0])
print(Ytrain_df.shape)
print(Ytrain_df.columns)
print(Ytrain_df.groupby(0).size())
train_loss = []
validation_loss = []
epochs_list = []
train_accuracies = []
val_accuracies = []
learning_rates = []
epoch_interval = 1#10
plot_epoch_interval = 5
lr = 0.01
momentum = 0.9
epochs = 3
batch_size = 4
print('batch_size : ',batch_size)
tr_acc,val_acc, ypred, ytrue, scores = train_on_batch(lr,epochs,momentum,X_train_new,Y_train,X_val_new,Y_val,batch_size)
我对其进行了 3 个 epoch 的测试,并在每个 epoch 之后保存了模型。然而,在第 3 个时期之后,即完成 3 个时期的训练后,当我通过调用我的代码的 test() 函数来测试我的模型时,它给出了 49.7% 的验证准确度和 59.3% 的测试准确度。
而如果我在代码中使用 validate() 函数,则在训练循环中的第 3 个训练纪元之后调用时,它会提供 51.146% 的验证准确率。在完成 3 个时期的训练后使用 validate() 函数,即。在 for 循环外,我得到 49.12% 的验证准确率和 54.0697% 的测试准确率。
为什么两次调用相同的验证函数时验证准确性会发生变化,即一次在训练时期循环内,另一次在训练时期循环之后?另外,哪个函数是测试和验证的正确方法,validate() 还是 test()?
我什至加载了我在每个时期后保存的所有模型,并检查了它们的权重,这与它们在训练期间看到的相同。我是这个领域的新手。
最佳答案
Validation
和Test
数据集感到困惑。要测试训练模型的准确性,请使用 test()
函数。 Use the validation()
在最终模型之间进行比较或选择时,可以对最终调整模型的技能进行无偏估计。==========EDIT-1==========
validate()
函数时,它会返回为仅 third(即最后一个纪元)计算的准确度,当您在训练循环后调用相同的 validate()
函数时,准确性是使用它在所有 时期看到的数据计算的.尝试打印您的正确变量,这样您就会注意到准确性背后的原因! :)希望我的解释清楚并注意验证
不学习数据集但only sees
(即微调)它。对于问题的第二部分,请参阅我的第 2 点和第 2 点中的链接。
关于python - PyTorch:为什么在训练时期循环内部或外部调用它后验证准确性会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57442298/
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
这是我的测试用例。 http://tobeythorn.com/isi/dummy2.svg http://tobeythorn.com/isi/isitest.html 如果我自己打开 svg,内部
我正在尝试做类似的事情: SELECT SUM( CASE WHEN ( AND EXISTS(SELECT 1
我想问如何在外部 ng-repeat 内部正确使用内部 ng-repeat: 这意味着你想使用这样的东西: {{milestone.id}} {{
我希望在 wordpress 的仪表板内编辑 css 样式并且如果可能的话不必编辑 php 文件。 我知道至少可以编辑一些属性,所以我希望我可以直接在仪表板中编辑所有属性。 更具体地说如何更改自定义类
我在安装在 windows10 上的 vmware 中的 Ubuntu 上安装了伪分布式独立 hadoop 版本。 我从网上下载了一个文件,复制到ubuntu本地目录/lab/data 我在 ubun
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
我有一个如下所示的 WHERE 语句: WHERE ((@Value1 IS NULL AND [value1_id] IS NULL) OR [value1_id] = ISNULL(@Va
在我的一些测试帮助程序代码中,我有一个名为 FakeDbSet(Of T) 的 IDbSet(Of T) 实现,它模拟了许多 EF 行为,但没有实际的数据库。我将类声明为 Friend ,因为我想强制
我正在寻找 Cassandra/CQL 的常见 SQL 习语 INSERT INTO ... SELECT ... FROM ... 的表亲。并且一直无法找到任何以编程方式或在 CQL 中执行此类操作
如何防止内部 while 循环无限运行?问题是,如果没有外部 while 循环,内部循环将毫无问题地运行。我知道它必须对外循环执行某些操作,但我无法弄清楚是什么导致了问题。 import java.u
我正在努力学习更多有关 C++ 的知识,但在国际象棋程序中遇到了一些代码,需要帮助才能理解。我有一个 union ,例如: union b_union { Bitboard b; st
这是我项目网页中的代码片段。这里我想显示用户选择的类别,然后想显示属于该类别的主题。在那里,用户可以拥有多个类别,这没有问题。我可以在第一个 while 循环中打印所有这些类别。问题是当我尝试打印主题
我想知道如何在 swing 中显示内部框架。这意味着,当需要 JFrame 时,通常我所做的是, new MyJFrame().setVisible(true); 假设之前的表单也应该显示。当显示这个
我最近发现了一些有趣的行为,这让我想知道对象如何知道存在哪些全局变量。例如,假设我有一个文件“test.py”: globalVar = 1 toDelete = 2 class Test(objec
我知道它已经在这里得到回答: google maps drag and drop objects into google maps from outside the Map ,但这并不完全是我所需要的
我目前正在学习Javascript DOM和innerHTML,发现在理解innerHTML方面存在一些问题。 这是我的代码:http://jsfiddle.net/hphchan/bfjx1w70/
我构建了一个布局如下的库: lib/ private_class_impl.cc private_class_decl.h public_class_impl.cc include/
我有一个使用 bootstrap 3 的组合 wordpress 网站。它基本上是一个图像网格。当屏幕展开时,它会从三列变为四列。移动时它是一列。 我想出了如何调整图像的顶部和底部边距,但我希望图像的
我正在试用 MSP-EXP430G2 的教程程序,使用 Code Composer Studio 使 LED 闪烁。最初,它有一个闪烁的无限循环: for(;;) // This emp
我是一名优秀的程序员,十分优秀!