def Exe_oof(model,origin_state, train_images,train_labels,test_images, optim_flg,epoch_num,str_name,num_acc,num_fold):
cv = StratifiedKFold(n_splits=Nsplits, shuffle=True, random_state=42)
oof_pred = np.zeros( (len(train_images),10 ) )
y_pred_max = np.zeros( (len(test_images),10 ) )
str_model = str_name +'_0_0000'
y_pred_flg=0
for fold, (train_idx, val_idx) in enumerate(cv.split(train_images, train_labels)):
print(fold)
print(num_fold)
if fold==num_fold:
print('True')
max_acc = num_acc
model.load_state_dict(origin_state)
#データを訓練用と検証用に分ける
train_x, valid_x = train_images[train_idx], train_images[val_idx]
train_y, valid_y = train_labels[train_idx], train_labels[val_idx]
#データをローダーに格納する。
train_loader = dataset.DataLoader(
Dataset(train_x, train_y, HoriFlip_p, RandCont_p, RandBrig_p, Blur_p,Cut_p, train=True), batch_size=64, shuffle=True)
valid_loader = dataset.DataLoader(
Dataset(valid_x, valid_y, HoriFlip_p, RandCont_p, RandBrig_p, Blur_p, Cut_p,train=False), batch_size=64, shuffle=False)
if optim_flg == 'Adam':
optimizer = optim.Adam(model.parameters(), lr=lr_par)
else:
optimizer = optim.SGD(model.parameters(), lr=lr_par, weight_decay=0.01, momentum=0.9)
log = []
import datetime
print(datetime.datetime.now())
for epoch in range(epoch_num):
model.train()
with autograd.detect_anomaly():
train_loss, train_accuracy = perform(model, train_loader, optimizer)
model.eval()
with torch.no_grad():
valid_loss, valid_accuracy = perform(model, valid_loader, None)
print('[{}] train(loss/accuracy)={:.2f}/{:.2f}, valid(loss/accuracy)={:.2f}/{:.2f}'.format(epoch + 1, train_loss, train_accuracy, valid_loss, valid_accuracy))
if valid_accuracy > max_acc:
int_model = int(valid_accuracy*10000)
str_model = str_name +'_'+ str(fold) +'_'+ str(int_model)
DATA_DIR = 'drive/My Drive/ProbSpace/Ukiyoe/'+ str_name + '/' + str_model
torch.save(model.state_dict(), DATA_DIR)
#################################
# 検証用データの予測
#################################
model.eval
hogehoge_i = 1
for images, _ in valid_loader:
images = images.cuda()
with torch.no_grad():
if hogehoge_i>=1 :
preds = model(images)
hogehoge_i=0
else:
preds = torch.cat([preds,model(images)],dim=0)
dvs=torch.device('cpu')
preds_cpu = preds.to(dvs)
preds_np = preds_cpu.clone().numpy()
oof_pred[val_idx] = preds_np
#################################
# テスト用データの予測
#################################
dummy_labels = np.zeros( (test_images.shape[0], 1), dtype=np.int64)
test_loader = dataset.DataLoader(Dataset(test_images, dummy_labels,0.,0.,0.,0.,0.), batch_size=64, shuffle=False)
model.eval()
hogehoge_i = 1
for images, _ in test_loader:
images = images.cuda()
with torch.no_grad():
if hogehoge_i>=1 :
preds = model(images)
hogehoge_i=0
else:
preds = torch.cat([preds,model(images)],dim=0)
y_pred_max = preds
#################################
max_acc = valid_accuracy
print(datetime.datetime.now())
log.append( (epoch + 1, train_loss, train_accuracy, valid_loss, valid_accuracy) )
if y_pred_flg==0 :
y_pred = y_pred_max
y_pred_flg=1
else:
y_pred = torch.cat([y_pred,y_pred_max],dim=1)
print('Partial score of fold {} is: {}'.format(fold, max_acc))