コード例 #1
0
ファイル: test.py プロジェクト: xxxgp/DogsVsCats
def test():

    # setting model
    model = Net()                                       # 实例化一个网络
    model.cuda()                                        # 送入GPU,利用GPU计算
    model = nn.DataParallel(model)
    model.load_state_dict(torch.load(model_file))       # 加载训练好的模型参数
    model.eval()                                        # 设定为评估模式,即计算过程中不要dropout

    # get data
    files = random.sample(os.listdir(dataset_dir), N)   # 随机获取N个测试图像
    imgs = []           # img
    imgs_data = []      # img data
    for file in files:
        img = Image.open(dataset_dir + file)            # 打开图像
        img_data = getdata.dataTransform(img)           # 转换成torch tensor数据

        imgs.append(img)                                # 图像list
        imgs_data.append(img_data)                      # tensor list
    imgs_data = torch.stack(imgs_data)                  # tensor list合成一个4D tensor

    # calculation
    out = model(imgs_data)                              # 对每个图像进行网络计算
    out = F.softmax(out, dim=1)                         # 输出概率化
    out = out.data.cpu().numpy()                        # 转成numpy数据

    # pring results         显示结果
    for idx in range(N):
        plt.figure()
        if out[idx, 0] > out[idx, 1]:
            plt.suptitle('cat:{:.1%},dog:{:.1%}'.format(out[idx, 0], out[idx, 1]))
        else:
            plt.suptitle('dog:{:.1%},cat:{:.1%}'.format(out[idx, 1], out[idx, 0]))
        plt.imshow(imgs[idx])
    plt.show()
コード例 #2
0
def test():

    model = Net()  # 实例化一个网络
    model.cuda()  # 送入GPU,利用GPU计算
    model.load_state_dict(torch.load(model_file))  # 加载训练好的模型参数
    model.eval()  # 设定为评估模式,即计算过程中不要dropout

    datafile = DVCD('test', dataset_dir)  # 实例化一个数据集
    print('Dataset loaded! length of train set is {0}'.format(len(datafile)))

    index = np.random.randint(0, datafile.data_size,
                              1)[0]  # 获取一个随机数,即随机从数据集中获取一个测试图片
    img = datafile.__getitem__(index)  # 获取一个图像
    img = img.unsqueeze(
        0)  # 因为网络的输入是一个4维Tensor,3维数据,1维样本大小,所以直接获取的图像数据需要增加1个维度
    img = Variable(img).cuda()  # 将数据放置在PyTorch的Variable节点中,并送入GPU中作为网络计算起点
    out = model(img)  # 网路前向计算,输出图片属于猫或狗的概率,第一列维猫的概率,第二列为狗的概率
    print(out)  # 输出该图像属于猫或狗的概率
    if out[0, 0] > out[0, 1]:  # 猫的概率大于狗
        print('the image is a cat')
    else:  # 猫的概率小于狗
        print('the image is a dog')

    img = Image.open(datafile.list_img[index])  # 打开测试的图片
    plt.figure('image')  # 利用matplotlib库显示图片
    plt.imshow(img)
    plt.show()
コード例 #3
0
 def test():

     model = Net()                                        #네트워크실제화
     model.cuda()                                         # GPU로 계산
     model.load_state_dict(torch.load(model_file))       # 학습된 모델 로딩
     model.eval()                                        # eval모델

     datafile = DVCD('test', dataset_dir)                # dataset 실례화
     print('Dataset loaded! length of train set is {0}'.format(len(datafile)))

     index = np.random.randint(0, datafile.data_size, 1)[0]      # random수로 image를 임의 선택함
     img = datafile.__getitem__(index)                           # image 하다 받다
     img = img.unsqueeze(0)                                      
     img = Variable(img).cuda()                                  # Data를 PyTorch의 Variable노드에서 놓고 ,또는 GPU에서 들어가고 시작점을 담임힘.
     out = model(img)                                            
     out = F.softmax(out, dim=1)                                        # SoftMax으로 2个개 output값을 [0.0, 1.0]을 시키다,합이1이다.
     print(out)                      # output는 개/고양이의 확률
     if out[0, 0] > out[0, 1]:                   # 개<고양이
         print('the image is a cat')
     else:                                       # 개>고양이
         print('the image is a dog')

     img = Image.open(datafile.list_img[index])      # text image open
     plt.figure('image')                             # matplotlib로  image show
     plt.imshow(img)
     plt.show()
コード例 #4
0
ファイル: main.py プロジェクト: kevinghst/spaceship_submit
def eval():
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    np.random.seed(seed=46)

    model = Net()
    path = 'model.pth.tar'

    checkpoint = torch.load(path, map_location=torch.device('cpu'))
    model.load_state_dict(checkpoint)
    model = model.to(device)
    model.eval()

    ious = []
    for _ in tqdm(range(1000)):
        img, label = make_data()
        img = torch.from_numpy(np.asarray(img, dtype=np.float32))
        img = torch.unsqueeze(img, 0)
        img = torch.unsqueeze(img, 0)
        img = img.to(device)

        pred = model.predict(img)
        ious.append(score_iou(label, pred))

    ious = np.asarray(ious, dtype="float")
    ious = ious[~np.isnan(ious)]  # remove true negatives
    print((ious > 0.7).mean())
コード例 #5
0
def test():

    model_file = model_path + 'model.pth'
    model = Net()
    model.cuda()
    model = nn.DataParallel(model)
    model.load_state_dict(torch.load(model_file))
    model.eval()

    files = os.listdir(dataset_dir)
    imgs_data = []
    out1 = []
    for file in files:
        img = Image.open(dataset_dir + file)
        img_data = getdata.dataTransform(img)
        imgs_data.append(img_data)
        imgs_data = torch.stack(imgs_data)
        out = model(imgs_data)
        out = F.softmax(out, dim=1)
        out = out.data.cpu().numpy()
        out2 = out[0]
        out1.append(out2)
        imgs_data = []
    out3 = np.array(out1)
    x = []
    y = []

    for idx in range(len(files)):
        a = files[idx]
        (filename, extension) = os.path.splitext(a)
        b = int(filename)
        if b <= 900:
            y.append(1)
            if out3[idx, 0] > out3[idx, 1]:
                x.append(1)
            else:
                x.append(0)
        else:
            y.append(0)
            if out3[idx, 0] > out3[idx, 1]:
                x.append(1)
            else:
                x.append(0)

    p = metrics.precision_score(y, x)
    r = metrics.recall_score(y, x)
    f1 = metrics.f1_score(y, x)

    print('-------------test-----------------')
    print('precision: %f' % p)
    print('recall: %f' % r)
    print('f1_score: %f' % f1)
コード例 #6
0
ファイル: main.py プロジェクト: hsouri/Cirlcle-Detection-CNN
def find_circle(img):
    model = Net()
    checkpoint = torch.load('model.pth.tar')
    model.load_state_dict(checkpoint)
    model.eval()

    with torch.no_grad():
        image = np.expand_dims(np.asarray(img), axis=0)
        image = torch.from_numpy(np.array(image, dtype=np.float32))
        normalize = transforms.Normalize(mean=[0.5], std=[0.5])
        image = normalize(image)
        image = image.unsqueeze(0)
        output = model(image)

    return [round(i) for i in (200 * output).tolist()[0]]
コード例 #7
0
def cvt_model(pickle_model, script_model):
    print("start convert")
    checkpoint = torch.load(pickle_model)
    
    net = Net()
    net.load_state_dict(checkpoint['model_state_dict'])
    #net.cuda()
    net.eval()  # must be call
    
    #example = torch.rand(1,3,32,32).cuda() 
    example = torch.rand(1,3,32,32).cpu()
    
    traced_script_module = torch.jit.trace(net, example)
    traced_script_module.save(script_model)
    
    print("convert complete")
コード例 #8
0
def inference(time_series_data, start_date, model_path='./model_best.pth', save_output=False):
    data_channels = 2
    input_time_interval = 365
    output_time_interval = 7
    
    predict_date_start = start_date
    predict_date_end = predict_date_start + datetime.timedelta(days=output_time_interval - 1)
    input_date_start = predict_date_start - datetime.timedelta(days=input_time_interval)
    input_date_end = predict_date_start - datetime.timedelta(days=1)
    
    input = time_series_data[input_date_start:input_date_end].values.transpose(1, 0)
    input = input.reshape((1, data_channels, input_time_interval)).astype(np.float)
    
    target = time_series_data[predict_date_start:predict_date_end]['peak_load'].values
    
    net = Net(in_ch=data_channels, out_ch=output_time_interval)
    
    checkpoint = torch.load(model_path)
    net.load_state_dict(checkpoint['net'])
    
    net.eval()
    torch.set_grad_enabled(False)
    
    input = torch.tensor(input, dtype=torch.float)
    output = net(input).detach().numpy()
    
    print('input: {} ~ {}, output: {} ~ {}'.format(input_date_start.isoformat(), input_date_end.isoformat(),
                                                   predict_date_start.isoformat(), predict_date_end.isoformat()))
    print('output: ', list(map('{:.0f}'.format, output[0])))
    
    if len(target) == output_time_interval:
        target = target.reshape((1, output_time_interval)).astype(np.float)
        score = rmse(target, output)
        print('target: ', list(map('{:.0f}'.format, target[0])))
        print('RMSE:   {}'.format(score))

    if save_output:
        date_list = [(start_date + datetime.timedelta(days=x)).strftime('%Y%m%d') for x in range(0, 7)]
        df_dict = {
            'date': date_list,
            'peak_load(MW)': np.around(output[0]).astype(np.int)
        }
    
        df = pd.DataFrame(df_dict)
        df.to_csv('submission.csv', encoding='UTF-8', index=0)
コード例 #9
0
def main():
    model = Net()
    model.load_state_dict(torch.load("perfume_cnn.pt"))
    model.eval()

    summary(model, (3, 64, 64))

    path_list = glob.glob("who_is_this_member/*")
    print("path_list: {}".format(path_list))

    out_dir = "./her_name_is"
    if not os.path.exists(out_dir):
        os.makedirs(out_dir)

    for path in path_list:
        image_name = path.split("/")[-1]
        who = detect_who(path, model)
        save_path = os.path.join(out_dir + "/" + image_name)
        cv2.imwrite(save_path, who)
コード例 #10
0
ファイル: test.py プロジェクト: www096/pytorch_learn
def test(mid_model_name):
    print("=================================================")
    print("test model:", mid_model_name)

    checkpoint = torch.load(mid_model_name)

    net = Net()
    net.load_state_dict(checkpoint['model_state_dict'])
    net.eval()  # must be call

    dataiter = iter(testloader)
    images, labels = dataiter.next()

    print(len(images), type(images[0]))

    torchvision.utils.save_image(images[0], "test_image.bmp")

    # file = open("xxx.dat", "w")
    # for c in range(3):
    #     for h in range(32):
    #         for w in range(32):
    #             #print(images[0][c][h][w])
    #             file.write(str(float(images[0][c][h][w])) + ",")
    #         file.write("\n")
    # file.close()

    outputs = net(images)

    # imshow(torchvision.utils.make_grid(images))
    print('GroundTruth: ',
          ' '.join('%5s' % classes[labels[j]] for j in range(batch_size)))

    prob, predicted = torch.max(outputs, 1)

    print('Predicted: ',
          ' '.join('%5s' % classes[predicted[j]] for j in range(batch_size)))
    print('Predicted: ',
          ' '.join('%2.2f' % prob[j] for j in range(batch_size)))
コード例 #11
0
ファイル: test.py プロジェクト: www096/pytorch_learn
def test_local_bmp(mid_model_name):
    print("=================================================")
    print("test model:", mid_model_name)

    checkpoint = torch.load(mid_model_name)

    net = Net()
    net.load_state_dict(checkpoint['model_state_dict'])
    net.eval()  # must be call

    images = get_local_image()

    outputs = net(images)

    # imshow(torchvision.utils.make_grid(images))
    # print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(batch_size)))

    prob, predicted = torch.max(outputs, 1)

    print('Predicted: ',
          ' '.join('%5s' % classes[predicted[j]] for j in range(batch_size)))
    print('Predicted: ',
          ' '.join('%2.2f' % prob[j] for j in range(batch_size)))
コード例 #12
0
ファイル: main.py プロジェクト: HareshKarnan/TD3
        # T[0] because currently using only 1 thread for environment
        if args.model_based is not "None":
            T[0].append((
                state, action,
                reward))  # append the state, action and reward into trajectory

        done_bool = float(
            done) if episode_timesteps < env._max_episode_steps else 0

        # Store data in replay buffer
        replay_buffer.add(state, action, next_state, reward, done_bool)

        if args.model_based == "forward" or args.model_based == "dual":
            # add imagined trajectories from fwd model into fwd_model_replay_buffer
            if first_update:  # model has been updated atleast once
                forward_dynamics_model.eval()  # model has a dropout layer !

                t_s, t_a, t_ns, t_r, t_nd = _duplicate_batch_wise(state, args.model_iters, device, True), \
                                            _duplicate_batch_wise(action, args.model_iters, device, True), \
                                            _duplicate_batch_wise(next_state, args.model_iters, device, True), \
                                            _duplicate_batch_wise(reward, args.model_iters, device, True), \
                                            _duplicate_batch_wise(done, args.model_iters, device, True)

                t_s = t_s.cpu().numpy()
                t_a = t_a.cpu().numpy()

                for _ in range(args.imagination_depth):
                    # add noise to actions and predict
                    t_a = (
                        t_a +
                        np.random.normal(0, max_action * args.expl_noise / 10,
コード例 #13
0
def predict():

    #------Settings---------------------------
    weights = "./full_epoch_final.pth"
    device = True
    #-----------------------------------------

    #------ Use GPU computation
    # gpuInfo = GPUInfo()
    # if device and not pt.cuda.is_available():
    #     raise Exception("No GPU found, please run without --cuda")
    # else:
    #     GPU = gpuInfo.getGPUs()
    # if device:
    #     pt.cuda.set_device(GPU)
    #     print("")
    #     print("Using --> GPU:{}".format(pt.cuda.current_device()))
    # else:
    #     print("Using --> CPU")
    #device = pt.device("cuda:0" if device else "cpu")

    #------ Use CPU computation
    device = pt.device("cpu")

    print("Open File")
    f = h5py.File('../../../thz-dataset/MetalPCB_446x446x91.mat', 'r')
    d = f.keys()
    dset = f['data_complex_roi']

    x, y, z = dset.shape

    params = np.ndarray(shape=(x, y, countParam), dtype=float)
    params2 = np.ndarray(shape=(x, y, countParam), dtype=float)
    curves = np.ndarray(shape=(x, y, valuesCurve), dtype=complex)
    curvesPred = np.ndarray(shape=(x, y, valuesCurve), dtype=complex)

    print("Network setup:\n")
    net = Net()

    #------ save model weight
    matfiledata = {}
    for name, param in net.named_parameters():
        matfiledata[name.replace('.', '_')] = param.detach().numpy()
    hdf5storage.write(matfiledata, '.', 'Model.mat', matlab_compatible=True)

    # Load trained CNN weights
    print("\nLoading trained parameters from '%s'..." % weights)
    net = pt.load(weights, map_location=lambda storage, loc: storage)
    net = net.to(device)
    net = net.eval()
    print("Done!")

    learnedEpochs = weights.split('_')[-1]
    learnedEpochs = learnedEpochs.split('.')[0]

    predict_curve_time = time.time()

    t2 = 0
    FileContent = "y,StartTime,EndTime\n"
    print("y,StartTime,EndTime")

    for i in range(y):
        curveData = dset[0:x, i, 0:z]
        curveData = curveData['real'] + 1j * curveData['imag']

        t1 = time.time()

        curves[0:x, i, 0:z] = curveData

        curve = np.ndarray(shape=(len(curveData[:,
                                                0]), len(curveData[0, :]), 2),
                           dtype=float)

        curve[:, :, 0] = curveData.real
        curve[:, :, 1] = curveData.imag

        curve = pt.from_numpy(curve)
        curve = curve.float().permute(0, 2, 1)
        curve = curve.unsqueeze(3).unsqueeze(3)

        start_time = datetime.now()
        y_predict = net(curve.to(device))
        end_time = datetime.now()
        elapsed_time = end_time - start_time

        start_tstr = start_time.strftime("%Y/%m/%d:%H:%M:%S.%f")
        end_tstr = end_time.strftime("%Y/%m/%d:%H:%M:%S.%f")

        t2 = t2 + (time.time() - t1)

        output_line = "{0}, {1}, {2}".format(str(i + 1), start_tstr, end_tstr)
        print(output_line)
        FileContent = FileContent + output_line + "\n"

        params[:, i, :] = scaleUpAll(y_predict, False, device).cpu().detach()
        params2[:, i, :] = y_predict.cpu().detach()

    for i in range(x):
        for j in range(y):
            curvesPred[i, j, :] = math.fabs(
                params2[i, j, 3]) * normAFactor * np.sinc(
                    params2[i, j, 0] * (normZ - params2[i, j, 1])) * np.exp(
                        -1j *
                        (normOmega * normZ - 2 * np.pi * params2[i, j, 2]))

    print(time.strftime("Finish at: %H:%M:%S", time.gmtime(time.time())))
    print(time.strftime("Inference Time:\t %H:%M:%S", time.gmtime(t2)))
    print(
        time.strftime("Overall Time:\t %H:%M:%S",
                      time.gmtime(time.time() - predict_curve_time)))

    epochFile = open("predict_measure_result.txt", "w")
    epochFile.write(FileContent)
    epochFile.close()

    print("Writing mat File")
    matfiledata = {}  # make a dictionary to store the MAT data in
    matfiledata[u'A'] = params[:, :, 3]
    matfiledata[u'Sigma'] = params[:, :, 0]
    matfiledata[u'Mu'] = params[:, :, 1]
    matfiledata[u'Phi'] = params[:, :, 2]
    matfiledata[u'curvesIn'] = curves
    matfiledata[u'curvesOut'] = curvesPred
    matfiledata[u'rmse'] = np.mean(
        np.power((curves.real - curvesPred.real), 2) +
        np.power((curves.imag - curvesPred.imag), 2))

    outputName = 'OutputMeasure_' + learnedEpochs + '.mat'

    hdf5storage.write(matfiledata, '.', outputName, matlab_compatible=True)

    print("Done")
コード例 #14
0
        d = euclidean(query_feature, features_dict["features"][i])
        results.append((d, i))
    results = sorted(results)[:top_k]
    return results


train_dataset = datasets.MNIST(root='./mnist/',
                               train=True,
                               transform=transforms.ToTensor())
test_dataset = datasets.MNIST(root='./mnist/',
                              train=False,
                              transform=transforms.ToTensor())
test_loader = Data.DataLoader(dataset=test_dataset, batch_size=1, shuffle=True)
feature_dict = pickle.loads(open("./data/features_dict.pickle", "rb").read())
model = Net()
model.eval()
model.load_state_dict(
    torch.load("./data/model.pth",
               map_location=torch.device(
                   "cuda" if torch.cuda.is_available() else "cpu")))
encoder = model.encoder

for i, (img, lab) in enumerate(test_loader):
    query_feature = encoder(img)
    res = search(query_feature, feature_dict)
    images = []
    for (d, j) in res:
        image = train_dataset.train_data[j, ...]
        image = np.dstack([image] * 3)
        images.append(image)
    query = img.squeeze(0).permute(1, 2, 0)
コード例 #15
0
class MyModel:
    def __init__(self, trained_weights: str, device: str):
        self.net = Net()
        self.weights = trained_weights
        self.device = torch.device('cuda:0' if device == 'cuda' else 'cpu')
        #self.preprocess = transforms.Compose([
        #transforms.Resize((300, 300)),
        #transforms.ToTensor(),
        #transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),])
        self._initialize()

    def _initialize(self):
        # Load weights
        try:
            # Force loading on CPU if there is no GPU
            if (torch.cuda.is_available() == False):
                self.net.load_state_dict(
                    torch.load(self.weights,
                               map_location=lambda storage, loc: storage)
                    ["state_dict"])
            else:
                self.net.load_state_dict(
                    torch.load(self.weights)["state_dict"])

        except IOError:
            print("Error Loading Weights")
            return None
        self.net.eval()

        # Move to specified device
        self.net.to(self.device)

    #def predict(self,path):
    # Open the Image and resize
    #img = Image.open(path)

    # Convert to tensor on device
    #with torch.no_grad():
    #img_tensor = self.preprocess(img) # tensor in [0,1]
    #img_tensor = 1 - img_tensor
    #xb = to_device(img_tensor.unsqueeze(0), self.device) #mg_tensor = img_tensor.view(1, 28, 28, 1).to(self.device)

    # Do Inference
    #yb = self.net(xb) #probabilities = self.net(img_tensor)
    #prob, preds  = torch.max(yb, dim=1) #probabilities = F.softmax(probabilities, dim = 1)
    #output = torch.nn.functional.softmax(yb[0], dim=0)
    #confidence, index = torch.max(yb, dim=1)

    #return (self.classes[index[0].item()], confidence[0].item())

    def infer(self, path):
        img = Image.open(path)
        preprocess = transforms.Compose([
            transforms.Resize((300, 300)),
            transforms.ToTensor(),
            transforms.Normalize(mean=[0.485, 0.456, 0.406],
                                 std=[0.229, 0.224, 0.225]),
        ])
        image_tensor = preprocess(img)

        # create a mini-batch as expected by the model
        input_batch = to_device(image_tensor.unsqueeze(0), self.device)

        with torch.no_grad():
            output = self.net(input_batch)

        #The output has unnormalized scores. To get probabilities, you can run a softmax on it.
        confidence, index = torch.max(output, dim=1)
        return (index[0].item(), confidence[0].item())
コード例 #16
0
class Brain:
    def __init__(self, num_states, num_actions, Double, Dueling, PER):
        self.num_actions = num_actions # 행동 가짓수(2)를 구함
        self.Double = Double
        self.Dueling = Dueling
        self.PER = PER
        
        # transition을 기억하기 위한 메모리 객체 생성
        self.memory = ReplayMemory(CAPACITY)
        
        # 신경망 구성
        n_in, n_mid, n_out = num_states, 32, num_actions
        self.main_q_network = Net(n_in, n_mid, n_out, Dueling) # Net 클래스를 사용
        self.target_q_network = Net(n_in, n_mid, n_out, Dueling) # Net 클래스를 사용
        print(self.main_q_network) # 신경망의 구조를 출력
        
        # 최적화 기법을 선택
        self.optimizer = optim.Adam(self.main_q_network.parameters(), lr=0.0001)
        
        # PER - TD 오차를 기억하기 위한 메모리 객체 생성
        if self.PER == True:
            self.td_error_memory = TDerrorMemory(CAPACITY)

    def replay(self, episode = 0):
        ''' Experience Replay로 신경망의 결합 가중치 학습 '''
        
        # 1. 저장된 transition 수 확인
        if len(self.memory) < BATCH_SIZE:
            return
        
        # 2. 미니배치 생성
        if self.PER == True:
            self.batch, self.state_batch, self.action_batch, self.reward_batch, self.non_final_next_states = self.make_minibatch(episode)
        else:
            self.batch, self.state_batch, self.action_batch, self.reward_batch, self.non_final_next_states = self.make_minibatch()
        
        # 3. 정답신호로 사용할 Q(s_t, a_t)를 계산
        self.expected_state_action_values = self.get_expected_state_action_values()
        
        # 4. 결합 가중치 수정
        self.update_main_q_network()
        
    def decide_action(self, state, episode):
        '''현재 상태로부터 행동을 결정함'''
        # e-greedy 알고리즘에서 서서히 최적행동의 비중을 늘린다
        epsilon = 0.5 * (1 / (episode +1))
        
        if epsilon <= np.random.uniform(0, 1):
            self.main_q_network.eval() # 신경망을 추론 모드로 전환
            with torch.no_grad():
                action = self.main_q_network(state).max(1)[1].view(1, 1)
            # 신경망 출력의 최댓값에 대한 인덱스 = max(1)[1]
            # .view(1,1)은 [torch.LongTensor of size 1]을 size 1*1로 변환하는 역할을 함
            
        else:
            # 행동을 무작위로 반환 (0 혹은 1)
            action = torch.LongTensor([[random.randrange(self.num_actions)]]) #행동을 무작위로 반환(0 혹은 1)
            # action은 [torch.LongTensor of size 1*1] 형태가 된다.
            
        return action
    
    def make_minibatch(self, episode = 0):
        '''2. 미니배치 생성'''
        

        if self.PER == True:
            # 2.1 PER - 메모리 객체에서 미니배치를 추출
            # def make_minibatch(self, episode):
            if episode < 30:
                transitions = self.memory.sample(BATCH_SIZE)
            else:
                # TD 오차를 이용해 미니배치를 추출하도록 수정
                indexes = self.td_error_memory.get_prioritized_indexes(BATCH_SIZE)
                transitions = [self.memory.memory[n] for n in indexes]
        else:
            # 2.1 메모리 객체에서 미니배치를 추출
            transitions = self.memory.sample(BATCH_SIZE)

        # 2.2 각 변수를 미니배치에 맞는 형태로 변형
        # transitions는 각 단계별로 (state, action, state_next, reward) 형태로 BATCH_SIZE 개수만큼 저장됨
        # 다시 말해, (state, action, state_next, reward) * BATCH_SIZE 형태가 된다.
        # 이를 미니배치로 만들기 위해
        # (state*BATCH_SIZE, action*BATCH_SIZE), state_next*BATCH_SIZE, reward*BATCH_SIZE)
        # 형태로 변환한다.
        
        batch = Transition(*zip(*transitions))
        
        # 2.3 각 변수의 요소를 미니배치에 맞게 변형하고, 신경망으로 다룰 수 있게 Variable로 만든다
        # state를 예로 들면, [torch.FloatTensor of size 1*4] 형태의 요소가 BATCH_SIZE 개수만큼 있는 형태다
        # 이를 torch.FloatTensor of size BATCH_SIZE*4 형태로 변형한다
        # 상태, 행동, 보상, non_final 상태로 된 미니배치를 나타내는 Variable을 생성
        # cat은 Concatenates(연접)를 의미한다.
        state_batch = torch.cat(batch.state)
        action_batch = torch.cat(batch.action)
        reward_batch = torch.cat(batch.reward)
        non_final_next_states = torch.cat([s for s in batch.next_state if s is not None])
        
        return batch, state_batch, action_batch, reward_batch, non_final_next_states
    
    def get_expected_state_action_values(self):
        ''' 정답 신호로 사용할 Q(s_t,a_t)를 계산'''
        
        # 3.1 신경망을 추론 모드로 전환
        self.main_q_network.eval()
        self.target_q_network.eval()
        
        # 3.2 신경망으로 Q(s_t, a_t)를 계산
        # self.model(state_batch)은 왼쪽, 오른쪽에 대한 Q값을 출력하며
        # [torch.FloatTensor of size BATCH_SIZEx2] 형태다
        # 여기서부터는 실행한 행동 a_t에 대한 Q값을 계산하므로 action_batch에서 취한 행동
        # a_t가 왼쪽이냐 오른쪽이냐에 대한 인덱스를 구하고, 이에 대한 Q값을 gather메서드로 모아온다.
        self.state_action_values = self.main_q_network(self.state_batch).gather(1, self.action_batch)
        
        # 3.3 max{Q(s_t+1, a)}값을 계산한다. 이때 다음 상태가 존재하는지에 주의해야 한다
        
        # cartpole이 done 상태가 아니고, next_state가 존재하는지 확인하는 인덱스 마스크를 만듬
        non_final_mask = torch.ByteTensor(tuple(map(lambda s: s is not None, self.batch.next_state)))
        
        # 먼저 전체를 0으로 초기화
        next_state_values = torch.zeros(BATCH_SIZE)

        # Double DQN
        if self.Double == True:        
            a_m = torch.zeros(BATCH_SIZE).type(torch.LongTensor)
        
            # 다음 상태에서 Q값이 최대가 되는 행동 a_m을 Main Q-Network로 계산
            # 마지막에 붙은 [1]로 행동에 해당하는 인덱스를 구함
            a_m[non_final_mask] = self.main_q_network(self.non_final_next_states).detach().max(1)[1]
            
            # 다음 상태가 있는 것만을 걸러내고, size 32를 32*1로 변환
            a_m_non_final_next_states = a_m[non_final_mask].view(-1, 1)
            
            # 다음 상태가 있는 인덱스에 대해 행동 a_m의 Q값을 target Q-Network로 계산
            # detach() 메서드로 값을 꺼내옴
            # squeeze()메서드로 size[minibatch*1]을 [minibatch]로 변환
            next_state_values[non_final_mask] = self.target_q_network(
                self.non_final_next_states).gather(1, a_m_non_final_next_states).detach().squeeze()
        else:
            # 다음 상태가 있는 인덱스에 대한 최대 Q값을 구한다
            # 출력에 접근해서 열방향 최댓값(max(1))이 되는 [값, 인덱스]를 구한다
            # 그리고 이 Q값(인덱스 = 0)을 출력한 다음
            # detach 메서드로 이 값을 꺼내온다
            next_state_values[non_final_mask] = self.target_q_network(self.non_final_next_states).max(1)[0].detach()
        
        # 3.4 정답신호로 사용할 Q(s_t, a_t) 값을 Q러닝 식으로 계산
        expected_state_action_values = self.reward_batch + GAMMA * next_state_values
        
        return expected_state_action_values
    
    def update_main_q_network(self):
        ''' 4. 결합 가중치 수정 '''
        
        # 4.1 신경망을 학습 모드로 전환
        self.main_q_network.train()
        
        # 4.2 손실함수를 계산(smooth_l1_loss는 Huber 함수)
        # expected_state_action_values은 size가 [minibatch]이므로 unsqueeze해서 [minibatch*1]로 만듦
        loss = F.smooth_l1_loss(self.state_action_values, self.expected_state_action_values.unsqueeze(1))
        
        # 4.3 결합 가중치를 수정
        self.optimizer.zero_grad() # 경사를 초기화
        loss.backward() # 역전파 계산
        self.optimizer.step() # 결합 가중치 수정
        
    def update_target_q_network(self): # DDQN에서 추가됨
        ''' Target Q-Network을 Main Q-Network와 맞춤 '''
        self.target_q_network.load_state_dict(self.main_q_network.state_dict())

    def update_td_error_memory(self): # Prioritized Experience Replay 에서 추가됨
        ''' TD 오차 메모리에 저장된 TD 오차를 업데이트 '''
        
        # 신경망을 추론 모드로 전환
        self.main_q_network.eval()
        self.target_q_network.eval()
        
        # 전체 transition으로 미니배치를 생성
        transitions = self.memory.memory
        batch = Transition(*zip(*transitions))
        
        state_batch = torch.cat(batch.state)
        action_batch = torch.cat(batch.action)
        reward_batch = torch.cat(batch.reward)
        non_final_next_states = torch.cat([s for s in batch.next_state if s is not None])
        
        # 신경망의 출력 Q(s_t, a_t)를 계산
        state_action_values = self.main_q_network(state_batch).gather(1, action_batch)
        
        # cartpole이 done 상태가 아니고, next_state가 존재하는지 확인하는 인덱스 마스크를 만듦
        non_final_mask = torch.ByteTensor(tuple(map(lambda s: s is not None, batch.next_state)))
        
        # 먼저 전체를 0으로 초기화, 크기는 기억한 transition 개수만큼
        next_state_values = torch.zeros(len(self.memory))
        a_m = torch.zeros(len(self.memory)).type(torch.LongTensor)
        
        # 다음 상태에서 Q값이 최대가 되는 행동 a_m을 Main Q-Network로 계산
        # 마지막에 붙은 [1]로 행동에 해당하는 인덱스를 구함
        a_m[non_final_mask] = self.main_q_network(non_final_next_states).detach().max(1)[1]
        
        # 다음 상태가 있는 것만을 걸러내고, size 32를 32*1 로 변환
        a_m_non_final_next_states = a_m[non_final_mask].view(-1, 1)
        
        # 다음 상태가 있는 인덱스에 대해 행동 a_m의 Q값을 target Q-Network로 계산
        # detach() 메서드로 값을 꺼내옴
        # squeeze() 메서드로 size[minibatch*1]을 [minibatch]로 변환
        next_state_values[non_final_mask] = self.target_q_network(
            non_final_next_states).gather(1, a_m_non_final_next_states).detach().squeeze()
        
        # TD 오차를 계산
        td_errors = (reward_batch + GAMMA * next_state_values) - state_action_values.squeeze()
        # state_action_values는 size[minibatch*1]이므로 squeeze 메서드로 size[minibatch]로 변환
        
        # TD 오차 메모리를 업데이트. Tensor를 detach() 메서드로 꺼내와 NumPy 변수로 변환하고
        # 다시 파이썬 리스트로 반환
        self.td_error_memory.memory = td_errors.detach().numpy().tolist()
コード例 #17
0
def train(n_epochs=n_epochs,
          train_loader=train_loader,
          valid_loader=valid_loader,
          save_location_path=save_location_path):

    train_on_gpu = torch.cuda.is_available()

    def init_weights(m):
        if isinstance(m, nn.Linear):
            I.xavier_uniform_(m.weight)

    model = Net()
    model.apply(init_weights)

    if train_on_gpu:
        model.cuda()

    criterion = nn.MSELoss()
    optimizer = optim.Adam(params=model.parameters(), lr=0.001)

    valid_loss_min = np.Inf

    model.train()

    for epoch in range(1, n_epochs + 1):
        # Keep track of training and validation loss
        train_loss = 0.0
        valid_loss = 0.0

        for data in train_loader:

            # Grab the image and its corresponding label
            images = data['image']
            key_pts = data['keypoints']

            if train_on_gpu:
                images, key_pts = images.cuda(), key_pts.cuda()

            # Flatten keypoints & convert data to FloatTensor for regression loss
            key_pts = key_pts.view(key_pts.size(0), -1)
            if train_on_gpu:
                key_pts = key_pts.type(torch.cuda.FloatTensor)
                images = images.type(torch.cuda.FloatTensor)
            else:
                key_pts = key_pts.type(torch.FloatTensor)
                images = images.type(torch.FloatTensor)

            optimizer.zero_grad()  # Clear the gradient
            output = model(images)  # Forward
            loss = criterion(output, key_pts)  # Compute the loss
            loss.backward()  # Compute the gradient
            optimizer.step()  # Perform updates using calculated gradients

            train_loss += loss.item() * images.size(0)

        # Validation
        model.eval()
        for data in valid_loader:

            images = data['image']
            key_pts = data['keypoints']

            if train_on_gpu:
                images, key_pts = images.cuda(), key_pts.cuda()

            key_pts = key_pts.view(key_pts.size(0), -1)
            if train_on_gpu:
                key_pts = key_pts.type(torch.cuda.FloatTensor)
                images = images.type(torch.cuda.FloatTensor)
            else:
                key_pts = key_pts.type(torch.FloatTensor)
                images = images.type(torch.FloatTensor)

            output = model(images)
            loss = criterion(output, key_pts)

            valid_loss += loss.item() * images.size(0)

        # calculate average losses
        train_loss = train_loss / len(train_loader)
        valid_loss = valid_loss / len(valid_loader)

        print(
            f"epoch: {epoch} \t trainLoss: {train_loss} \t valLoss: {valid_loss}"
        )

        eviz.send_data(current_epoch=epoch,
                       current_train_loss=train_loss,
                       current_val_loss=valid_loss)
コード例 #18
0
class Agent:
    """Interacts with and learns from the environment."""
    def __init__(self):
        self.actions = 4
        self.state_space = 37
        self.memory = deque(maxlen = 100000)
        self.randomness = 1
        self.least_randomness = 0.01
        self.randomness_decay = 0.995
        self.gamma = 0.95
        self.network = Net()
        self.qtarget_net = Net()
        self.optimizer = optim.Adam(self.network.parameters(), lr=3e-4)
        self.loss_func = nn.MSELoss()
        self.tau = 1e-3


    def remember(self, state, next_state, action, reward, done):
        """stores state, next_state, action, reward and done"""
        self.memory.append([state, next_state, action, reward, done])
    
    def action(self, state):
        """returns an action that has to be taken given the state"""
        if random.random() < self.randomness:
            return random.randint(0, self.actions - 1)
        state = torch.from_numpy(np.array(state).reshape(1, self.state_space)).float()
        self.network.eval()
        with torch.no_grad():
            action_values = self.network(state)
        self.network.train()
        #
        return np.argmax(action_values.detach().numpy())

    def save(self, name):
        """save the model"""
        torch.save(self.network.state_dict(), name)
    
    def load_checkpoint(self, name):
        """load the model from memory"""
        self.network.load_state_dict(torch.load(name))

    def train(self, batch_size = 128):
        """trains the network based on previous experiences"""
        try:
            memory_buffer = random.choices(self.memory, k = batch_size)
        except:
            memory_buffer = self.memory
        predictions = []
        actuals = []
        states = []
        next_states = []
        actions = []
        rewards = []
        dones = []
        for state, next_state, action, reward, done in memory_buffer:
            states.append(state)
            next_states.append(next_state)
            actions.append(action)
            rewards.append(reward)
            dones.append(done)
        states, next_states, actions, rewards, dones = [np.array(x).astype(np.float32) for x in [states, next_states, actions, rewards, dones]]
        #print(actions.shape)
        dones = dones.astype(np.uint8)
        states, next_states, actions, rewards, dones = [torch.from_numpy(x).float() for x in [states, next_states, actions, rewards, dones]]
        actions = actions.view(-1, 1)
        rewards = rewards.view(-1, 1)
        #print(actions.shape, states.shape)
        dones = dones.view(-1, 1)
        #print([x.shape for x in [states, actions, rewards, next_states, dones]])
        Q_targets_next = self.qtarget_net(next_states).detach().max(1)[0].unsqueeze(1)
        Q_targets = rewards + (self.gamma * Q_targets_next * (1 - dones))
        Q_expected = self.network(states).gather(1, actions.long())
        #print(Q_expected.shape, Q_targets.shape)
        loss = self.loss_func(Q_expected, Q_targets)
        self.optimizer.zero_grad()
        loss.backward()
        self.optimizer.step()
        self.randomness = max(self.least_randomness, self.randomness*self.randomness_decay)
        for target_param, local_param in zip(self.qtarget_net.parameters(), self.network.parameters()):
            target_param.data.copy_(self.tau*local_param.data + (1.0-self.tau)*target_param.data)
コード例 #19
0
class Trainer:
    def __init__(self, name="openspieltest", backup="on-policy"):
        # Experiment Parameters
        self.name_game = "connect_four"  #"breakthrough(rows=6,columns=6)"         # Name of game (should be from open_spiel library)
        self.name_run = name  # Name of run
        self.model_path = "models/"  # Path to save the models
        self.save = True  # Save neural network
        self.save_n_gens = 10  # How many iterations until network save
        self.test_n_gens = 10  # How many iterations until testing
        self.n_tests = 200  # How many tests to perform for testing
        self.use_gpu = True  # Use GPU (if available)
        self.n_pools = 1  # Amount of worker pools to create (also amount of GPU's to utilize)
        self.n_processes = 1  # Amount of game processes to start for every pool.

        # Algorithm Parameters
        self.n_games_per_generation = 500  # How many games to generate per iteration
        self.n_batches_per_generation = 500  # How batches of neural network training per iteration
        self.n_games_buffer_max = 20000  # How many games to store in FIFO buffer, at most. Buffer is grown.
        self.batch_size = 256  # Batch size for neural network training
        self.lr = 0.001  # Learning rate for neural network
        self.n_games_buffer = 4 * self.n_games_per_generation
        self.temperature = 1.0
        self.dirichlet_ratio = 0.25
        self.uct_train = 2.5
        self.uct_test = 2.5
        self.n_playouts_train = 100
        self.backup = backup
        self.tree_strap = False
        self.it = 0

        # Initialization of the trainer
        self.generation = 0
        self.game = pyspiel.load_game(self.name_game)
        self.buffer = []
        self.num_distinct_actions = self.game.num_distinct_actions()
        self.state_shape = self.game.information_state_normalized_vector_shape(
        )
        self.game = pyspiel.load_game(self.name_game)
        self.games_played = 0
        self.start_time = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")

        # Initialize logger
        formatter = logging.Formatter('%(asctime)s %(message)s')
        logger.setLevel('DEBUG')
        fh = logging.FileHandler("logs/" + str(self.start_time) +
                                 str(self.name_run) + ".log")
        fh.setFormatter(formatter)
        fh.setLevel('INFO')
        ch = logging.StreamHandler()
        ch.setLevel('INFO')
        ch.setFormatter(formatter)
        logger.addHandler(ch)
        logger.addHandler(fh)
        logger.info('Logger started')
        logger.info(str(torch.cuda.is_available()))
        logger.info(str(backup))

        # Setup CUDA if possible
        if self.use_gpu:
            if not torch.cuda.is_available():
                logger.info("Tried to use GPU, but none is available")
                self.use_gpu = False
        self.device = torch.device("cuda:0" if self.use_gpu else "cpu")

        # Initialize neural net
        self.current_net = Net(self.state_shape,
                               self.num_distinct_actions,
                               device=self.device)
        self.current_net.to(self.device)
        self.optimizer = torch.optim.Adam(self.current_net.parameters(),
                                          lr=self.lr,
                                          weight_decay=0.0001)
        self.criterion_policy = nn.BCELoss()
        self.criterion_value = nn.MSELoss()
        self.current_net.eval()

        # Log the settings.
        logger.info(self.__dict__)
        logger.info("Using:" + str(self.device))

    def net_step(self, flattened_buffer):
        """ Samples a random batch and updates the NN parameters with this batch

        Args:
            flattened_buffer: a flat buffer with examples from which to sample from

        Returns:
            loss_p: loss of the policy criterion
            loss_v: loss of the value criterion
        """
        self.current_net.zero_grad()

        # Select samples and format them to use as batch
        sample_ids = np.random.randint(len(flattened_buffer),
                                       size=self.batch_size)
        x = [flattened_buffer[i][1] for i in sample_ids]
        p_r = [flattened_buffer[i][2] for i in sample_ids]
        v_r = [flattened_buffer[i][3] for i in sample_ids]

        x = torch.from_numpy(np.array(x)).float().to(self.device)

        # Pass through network
        p_t, v_t = self.current_net(x)
        p_r = [
            item if item else p_t[i, :].to("cpu").tolist()
            for i, item in enumerate(p_r)
        ]

        p_r = torch.tensor(np.array(p_r)).float().to(self.device)
        v_r = torch.tensor(np.array(v_r)).float().to(self.device)

        # Backward pass
        loss_v = self.criterion_value(v_t, v_r.unsqueeze(1))
        loss_p = -torch.sum(p_r * torch.log(p_t)) / p_r.size()[0]
        loss = loss_v + loss_p
        loss.backward()
        self.optimizer.step()
        self.it += 1
        return loss_p, loss_v

    def train_network(self):
        """Trains the neural network for batches_per_generation batches.


        """
        logger.info("Training Network")
        self.current_net.train()
        flattened_buffer = [sample for game in self.buffer for sample in game]
        flattened_buffer = self.remove_duplicates(flattened_buffer)
        loss_tot_v = 0
        loss_tot_p = 0

        for i in range(self.n_batches_per_generation):
            loss_p, loss_v = self.net_step(flattened_buffer)
            loss_tot_p += loss_p
            v = loss_v
            loss_tot_v += v
            if i % 100 == 99:
                logger.info("Batch: " + str(i) + "Loss policy: " +
                            str(loss_tot_p / 100.) + "Loss value: " +
                            str(loss_tot_v / 100.))
                loss_tot_v = 0
                loss_tot_p = 0
        self.current_net.eval()

    @staticmethod
    def remove_duplicates(flattened_buffer):
        """Removes duplicates from a flattened buffer by averaging values and policy.

        Args:
            flattened_buffer: flat buffer with examples from where the duplicates need to be removed.

        Returns: flat buffer with duplicates removed.

        """

        logger.info("Removing duplciates")
        logger.info("Initial amount of samples: " + str(len(flattened_buffer)))
        start = time.time()

        # Remove duplicates
        flattened_buffer_dict = dict()
        flattened_buffer_counts = dict()
        flattened_buffer_pol = dict()

        for item in flattened_buffer:
            if item[0] in flattened_buffer_dict:
                # Average policy
                if item[2] and flattened_buffer_dict[item[0]][2]:
                    flattened_buffer_dict[item[0]][2] = [
                        sum(x) for x in zip(flattened_buffer_dict[item[0]][2],
                                            item[2])
                    ]
                    flattened_buffer_pol[item[0]] += 1
                elif item[2]:
                    flattened_buffer_dict[item[0]][2] = item[2]

                # Average value
                flattened_buffer_dict[item[0]][3] += item[3]
                flattened_buffer_counts[item[0]] += 1

            else:
                flattened_buffer_dict[item[0]] = item
                flattened_buffer_counts[item[0]] = 1
                flattened_buffer_pol[item[0]] = 1

        for key, value in flattened_buffer_dict.items():
            if flattened_buffer_dict[key][2]:
                flattened_buffer_dict[key][2] = [
                    x / flattened_buffer_pol[key]
                    for x in flattened_buffer_dict[key][2]
                ]
            flattened_buffer_dict[key][3] = flattened_buffer_dict[key][
                3] / flattened_buffer_counts[key]
        flattened_buffer = list(flattened_buffer_dict.values())
        logger.info("New amount of samples: " + str(len(flattened_buffer)))
        logger.info("Duplication removal took:" + str(time.time() - start) +
                    "seconds")
        return flattened_buffer

    def generate_examples(self, n_games):
        """Generates new games in a multithreaded way.

        Arg:
            n_games: amount of games to generate
        """
        logger.info("Generating Data")
        start = time.time()

        # Generate the examples
        generator = ExampleGenerator(self.current_net,
                                     self.name_game,
                                     self.device,
                                     n_playouts=self.n_playouts_train,
                                     temperature=self.temperature,
                                     dirichlet_ratio=self.dirichlet_ratio,
                                     c_puct=self.uct_train,
                                     backup=self.backup,
                                     tree_strap=self.tree_strap,
                                     n_pools=self.n_pools,
                                     n_processes=self.n_processes)
        games = generator.generate_examples(n_games)
        self.games_played += self.n_games_per_generation

        # Add examples to buffer
        for examples in games:
            self.buffer.append(examples)
        logger.info("Finished Generating Data (threaded). Took: " +
                    str(time.time() - start) + " seconds")
        logger.info("Total amount of games played:" +
                    str(self.generation * self.n_games_per_generation))
        self.update_buffer_size()

        # Remove oldest entries from buffer if too long
        if len(self.buffer) > self.n_games_buffer:
            logger.info("Buffer full. Deleting oldest samples.")
            while len(self.buffer) > self.n_games_buffer:
                del self.buffer[0]

    def test_agent(self):
        """Tests the current agent
        Tests against random opponents and pure MCTS agents
        """
        start = time.time()
        logger.info("Testing...")
        generator = ExampleGenerator(self.current_net,
                                     self.name_game,
                                     self.device,
                                     is_test=True,
                                     temperature=self.temperature,
                                     dirichlet_ratio=self.dirichlet_ratio,
                                     c_puct=self.uct_test,
                                     n_pools=self.n_pools,
                                     n_processes=self.n_processes)

        score_tot = 0.
        for i in range(self.n_tests):
            score1, score2 = test_net_vs_random(self.current_net.predict,
                                                self.name_game)
            score_tot += score1
            score_tot += score2
        avg = score_tot / (2 * self.n_tests)
        logger.info("Average score vs random (net only):" + str(avg))

        avg = generator.generate_tests(self.n_tests, test_net_vs_mcts, 100)
        logger.info("Average score vs mcts100 (net only):" + str(avg))

        avg = generator.generate_tests(self.n_tests, test_zero_vs_mcts, 200)
        logger.info("Average score vs mcts200:" + str(avg))

        avg = generator.generate_tests(self.n_tests, test_net_vs_mcts, 200)
        logger.info("Average score vs mcts200 (net only):" + str(avg))

        logger.info("Testing took: " + str(time.time() - start) + "seconds")
        return

    def run(self):
        """Main alphaZero training loop
        """

        # Start with testing the agent
        self.test_agent()

        while self.generation < 201:
            self.generation += 1
            logger.info("Generation:" + str(self.generation))
            self.generate_examples(self.n_games_per_generation
                                   )  # Generate new games through self-play
            self.train_network()  # Train network on games in the buffer

            # Perform testing periodically
            if self.generation % self.test_n_gens == 0:  # Test the alphaZero bot against MCTS bots
                self.test_agent()

            # Periodically save network
            if self.save and self.generation % self.save_n_gens == 0:
                logger.info("Saving network")
                torch.save(
                    self.current_net.state_dict(), self.model_path +
                    self.name_run + str(self.generation) + ".pth")
                logger.info("Network saved")

    def update_buffer_size(self):
        if self.generation % 2 == 0 and self.n_games_buffer < self.n_games_buffer_max:
            self.n_games_buffer += self.n_games_per_generation
        logger.info("Buffer size:" + str(self.n_games_buffer))
コード例 #20
0
 thld = np.arange(0, 1, 0.05)
 accu_tp = []
 accu_fp = []
 accu_iou = []
 for epoch in range(1):
     for i, data in enumerate(loader, 0):
         # get the inputs
         inputs, labels = data
         inputs, labels = inputs.float() / 256, labels.float()
         #
         #                # wrap them in Variable
         #
         inputs, labels = Variable(inputs.cuda()), Variable(labels.cuda())
         #
         threshold = 0.4
         net.eval()
         predicts = net.forward(inputs)
         #            loss, accu = net.loss_function_vec(outputs, labels, threshold, cal_accuracy=True)
         #
         #
         #    #            print (datetime.datetime.now())
         #    #            print ('Epoch %g'%(epoch))
         #                print(loss.data.cpu().numpy())
         #                print(accu)
         #                accu_tp.append(accu[0].data.cpu().numpy()[0])
         #                accu_fp.append(accu[1].data.cpu().numpy()[0])
         #                accu_iou.append(accu[2].data.cpu().numpy()[0])
         #
         #    plt.plot(thld, accu_tp, 'r')
         #    plt.plot(thld, accu_fp, 'b')
         #    plt.plot(thld, accu_iou, 'g')
コード例 #21
0
ファイル: trainprocess.py プロジェクト: jmjkx/lzy
        'learning rate', scheduler.get_lr()[0], epoch)
    # 记录Accuracy
    writer.add_scalars('Accuracy_group', {
        'train_acc': correct / total}, epoch)
    # 每个epoch,记录梯度,权值
    #     for name, layer in cnn.named_parameters():
    #         writer.add_histogram(
    #             name + '_grad', layer.grad.cpu().data.numpy(), epoch)
    #         writer.add_histogram(name + '_data', layer.cpu().data.numpy(), epoch)

    # ------------------------------------ 观察模型在验证集上的表现 ------------------------------------
    if epoch % 1 == 0:
        loss_sigma = 0.0
        cls_num = 10
        conf_mat = np.zeros([cls_num, cls_num])  # 混淆矩阵
        cnn.eval()
        for batch_idx, data in enumerate(test_loader):
            images, labels = data
            images, labels = images.cuda(), labels.cuda()
            images = images.double()
            labels = labels.double()
            cnn.cuda()
            cnn = cnn.train()

            outputs = cnn(images)  # forward

            outputs.detach_()  # 不求梯度

            loss = criterion(outputs, torch.max(labels, 1)[1])  # 计算loss
            # x = Variable(loss,requires_grad=True)
            # loss = loss.requires_grad()
コード例 #22
0
ファイル: test.py プロジェクト: olnayoung/denoising
class testNetwork():
    def __init__(self):
        self.class_num = args.class_num
        self.batch_num = args.batch_num

        self.test_input_path = os.path.join(args.test_path, 'CORD', 'test',
                                            'BERTgrid')
        self.test_label_path = os.path.join(args.test_path, 'CORD', 'test',
                                            'LABELgrid')
        weight_path = os.path.join(args.test_path, 'params', args.weight)

        self.model = Net()
        self.model.cuda()
        self.model.load_state_dict(torch.load(weight_path))
        if args.lossname == 'CrossEntropy':
            self.criterion = nn.CrossEntropyLoss()

    def list_files(self, in_path):
        img_files = []
        for (dirpath, dirnames, filenames) in os.walk(in_path):
            for file in filenames:
                filename, ext = os.path.splitext(file)
                ext = str.lower(ext)
                if ext == '.png':
                    img_files.append(file)
                    # img_files.append(os.path.join(dirpath, file))
        img_files.sort()
        return img_files

    def load_data(self, img_names, label_names):
        assert len(img_names) == len(label_names)

        for idx in range(len(img_names)):
            image = cv2.imread(img_names[idx])
            label = cv2.imread(label_names[idx])

            images = np.zeros((1, self.b_size, self.b_size, 3))
            labels = np.zeros((1, self.b_size, self.b_size, 3))

            image = np.expand_dims(image, axis=0)
            label = np.expand_dims(label, axis=0)

            _, hei, wid, _ = image.shape
            for h in range(0, hei, self.b_size):
                for w in range(0, wid, self.b_size):
                    if h + self.b_size < hei:
                        start_h, end_h = h, h + self.b_size
                    else:
                        start_h, end_h = hei - self.b_size - 1, hei - 1

                    if w + self.b_size < wid:
                        start_w, end_w = w, w + self.b_size
                    else:
                        start_w, end_w = wid - self.b_size - 1, wid - 1

                    temp_image = image[:, start_h:end_h, start_w:end_w, :]
                    temp_label = label[:, start_h:end_h, start_w:end_w, :]

                    images = np.concatenate((images, temp_image), axis=0)
                    labels = np.concatenate((labels, temp_label), axis=0)

        return images, labels

    def val_epoch(self, input_lists):
        self.model.eval()

        losses = 0

        for batch in range(int(len(input_lists) / self.batch_num)):
            self.optimizer.zero_grad()
            input_list, label_list = [], []

            for num in range(self.batch_num):
                idx = batch * self.batch_num + num
                filename = input_lists[idx]

                input_list.append(self.input_path + '/' + filename)
                label_list.append(self.label_path + '/' + filename)

            train_input, train_label = self.load_data(input_list, label_list)

            input_tensor = torch.tensor(train_input, dtype=torch.float).cuda()
            input_tensor = input_tensor.permute(0, 3, 1, 2)
            label_tensor = torch.tensor(train_label, dtype=torch.float).cuda()
            label_tensor = label_tensor.permute(0, 3, 1, 2)

            output = self.model(input_tensor)
            loss = self.criterion(output, label_tensor)
            losses += loss.item()

            return losses / self.batch_num

    # def testMany(self):
    #     test_lists = self.list_files(self.test_input_path)
    #     val_loss, val_acc, val_mic, val_mac = self.val_epoch(test_lists)

    #     print('\tVal Loss: %.3f | Val Acc: %.2f%% | mic: %.2f%% | mac: %.2f%%' % (val_loss, val_acc*100, val_mic*100, val_mac*100))

    def testOne(self, img_path):
        self.model.eval()

        input = cv2.imread(img_path)
        input_tensor = torch.tensor(input, dtype=torch.float).cuda()
        input_tensor = input_tensor.unsqueeze(0)
        input_tensor = input_tensor.permute(0, 3, 1, 2)

        output = self.model(input_tensor)
        output = output.permute(0, 2, 3, 1)
        output = output.squeeze(0)
        output = output.cpu().detach().numpy()

        return output
コード例 #23
0
ファイル: main.py プロジェクト: RMPR/facial_recognition
def __main__():
    ap = argparse.ArgumentParser(
        description='A simple face detector for batch processing')
    ap.add_argument('--biggest',
                    action="store_true",
                    help='Extract only the biggest face')
    ap.add_argument('--best',
                    action="store_true",
                    help='Extract only the best matching face')
    ap.add_argument('-c',
                    '--center',
                    action="store_true",
                    help='Print only the center coordinates')
    ap.add_argument('--data-dir',
                    metavar='DIRECTORY',
                    default=DATA_DIR,
                    help='OpenCV data files directory')
    ap.add_argument('-q',
                    '--query',
                    action="store_true",
                    help='Query only (exit 0: face detected, 2: no detection)')
    ap.add_argument(
        '-s',
        '--search',
        metavar='FILE',
        help='Search for faces similar to the one supplied in FILE')
    ap.add_argument('--search-threshold',
                    metavar='PERCENT',
                    type=int,
                    default=30,
                    help='Face similarity threshold (default: 30%%)')
    ap.add_argument('-o', '--output', help='Image output file')
    ap.add_argument('-d',
                    '--debug',
                    action="store_true",
                    help='Add debugging metrics in the image output file')
    ap.add_argument('file', help='Input image file')
    args = ap.parse_args()

    load_cascades(args.data_dir)

    model = Net()
    model.load_state_dict(torch.load('model.pt'))

    # detect faces in input image
    im, features = face_detect_file(args.file, args.query or args.biggest)

    # match against the requested face
    sim_scores = None
    if args.search:
        s_im, s_features = face_detect_file(args.search, True)
        if len(s_features) == 0:
            fatal("cannot detect face in template")
        sim_scores = []
        sim_features = []
        sim_threshold = args.search_threshold / 100
        sim_template = norm_rect(s_im, s_features[0])
        for i, score in enumerate(
                pairwise_similarity(im, features, sim_template)):
            if score >= sim_threshold:
                sim_scores.append(score)
                sim_features.append(features[i])
        features = sim_features

    # exit early if possible
    if args.query:
        return 0 if len(features) else 2

    # compute scores
    scores = []
    best = None
    if len(features) and (args.debug or args.best or args.biggest
                          or sim_scores):
        scores, best = rank(im, features)
        if sim_scores:
            for i in range(len(features)):
                scores[i]['MSSIM'] = sim_scores[i]

    # debug features
    if True:
        im = cv2.imread(args.file)
        font = cv2.FONT_HERSHEY_SIMPLEX
        fontHeight = cv2.getTextSize("", font, 0.5, 1)[0][1] + 5

        for i in range(len(features)):
            if best is not None and i != best and not args.debug:
                next

            rect = features[i]
            fg = (0, 255, 255) if i == best else (255, 255, 255)

            xy1 = (rect[0], rect[1])
            xy2 = (rect[0] + rect[2], rect[1] + rect[3])
            cv2.rectangle(im, xy1, xy2, (0, 0, 0), 4)
            cv2.rectangle(im, xy1, xy2, fg, 2)

            fontScale = 0.80
            fontColor = (255, 255, 255)
            lineType = 2

            image = cv2.imread(args.file)
            image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
            image = image[rect[1]:rect[1] + rect[3], rect[0]:rect[0] + rect[2]]
            cv2.imwrite('face{}.png'.format(i + 1), image)

            image = cv2.resize(image, (WIDTH, HEIGHT))

            image = torch.tensor(image, dtype=torch.float)

            model.eval()
            output = model(image)
            output = torch.nn.functional.softmax(output, dim=1)
            _, preds = torch.max(output, 1)
            pred = PEOPLE[preds[0].item()]
            cv2.putText(im, pred, (rect[0], rect[1] - 5), font, fontScale,
                        fontColor, lineType)

        cv2.imwrite("output.png", im)

    # output
    if (args.best or args.biggest) and best is not None:
        features = [features[best]]

    return 0
コード例 #24
0
def run(args):
    env = gym.make(args.env_name)
    observation = env.reset()
    steps_per_episode = args.steps
    model_file_output_path = args.from_file
    should_recycle_population = args.recycle_population

    # N is episode steps length; D_in is input observation dimension;
    # H is hidden layer dimension; D_out is output action space dimension.
    N, D_in, H, D_out = args.batch_size, observation.shape[0], 40, 1

    agent = Agent(env, steps_per_episode, args.maximize, args.reward_reducer)
    model = Net(N, D_in, H, D_out, agent)

    # set log level
    agent.log_level = args.log_level

    if args.load_model:
        model.load_state_dict(torch.load(model_file_output_path))
        model.eval()

    # connect network to agent
    agent.attach_model(model)

    if args.load_model:
        agent.run_forever(steps_per_episode)
        exit()

    # fill
    model.train()

    scaling_factor = args.scaling_factor
    crossover_rate = args.crossover_rate
    population_size = args.population_size
    episodes_num = args.episodes  # number of episodes

    # generate flattened weights
    model.flatten()

    problem_size = model.flattened.shape[0]

    print("problem_size: ", problem_size)

    # Initial population, Fitness values
    x = torch.randn(population_size, problem_size, dtype=torch.float64)
    y = torch.randn(population_size, D_out, dtype=torch.float64)

    # Convert to c pointers
    x_c = x.detach().numpy().ctypes.data_as(c.POINTER(
        c.c_double))  # c pointer init population
    y_c = y.detach().numpy().ctypes.data_as(c.POINTER(
        c.c_double))  # c pointer init fitness values

    agent.out_population = x.detach().numpy()
    agent.out_fitnesses = y.detach().numpy()

    # TODO: make these adjustable
    optimizer = getattr(devo, args.optimizer_name)

    generations = episodes_num // population_size

    # Runs 1 generation of DE at a time, using previous run's out population
    # as an input for the next one
    if should_recycle_population:
        for g in range(generations):
            # # Using Adaptive-DEs
            optimizer.run(
                population_size,
                population_size,  # population size
                scaling_factor,  # scaling factor
                crossover_rate,  # crossover rate
                agent.objective_func,
                problem_size,  # problem size
                -100,  # unused value
                100,  # unused value
                x_c,
                y_c,
                agent.results_callback  # no results callback needed
            )

            x_c = agent.out_population.ctypes.data_as(c.POINTER(c.c_double))
            y_c = agent.out_fitnesses.ctypes.data_as(c.POINTER(c.c_double))
    else:
        # # Using Adaptive-DEs
        optimizer.run(
            episodes_num,
            population_size,  # population size
            scaling_factor,  # scaling factor
            crossover_rate,  # crossover rate
            agent.objective_func,
            problem_size,  # problem size
            -100,  # unused value
            100,  # unused value
            x_c,
            y_c,
            agent.results_callback  # no results callback needed
        )

    # Get mins - inverted in output
    print("min_fitness: ", agent.min_reward)

    model.update_weights_from_vec(agent.min_weights)

    result = -agent.run_episode(agent.steps_per_episode, True)

    if args.should_test:
        print("test_run(expected: {}, actual: {})".format(
            agent.min_reward, result))

    env.close()

    if args.save_model:
        print("model_file: ", model_file_output_path)
        # save model
        torch.save(model.state_dict(), model_file_output_path)