def save_model(self, epoch): user_factor_path = os.path.join( util.data_home(), 'checkpoint', '%s_%d_user.npy' % (self.model_name, epoch)) item_factor_path = os.path.join( util.data_home(), 'checkpoint', '%s_%d_item.npy' % (self.model_name, epoch)) np.save(user_factor_path, self.X) np.save(item_factor_path, self.Y) print("checkpoint saved!")
def kfold_split(matrix, k, coordi_type): coordi_list = [] output_dir = os.path.join(util.data_home(), 'binary_kfold') rows, cols = matrix.shape for i in range(rows): for j in range(cols): if matrix[i][j] == 1: coordi_list.append((i, j)) random.shuffle(coordi_list) kfold_size = int(len(coordi_list) / k) print('start to generate %d fold train/test data, each size: %d' % (k, kfold_size)) for i in range(k): kfold_train = np.copy(matrix) kfold_test = np.zeros(matrix.shape) for j in range(kfold_size): cur_coordi = coordi_list.pop() if not cur_coordi: break kfold_train[cur_coordi[0]][cur_coordi[1]] = 0 kfold_test[cur_coordi[0]][cur_coordi[1]] = 1 train_npy_path = os.path.join( output_dir, coordi_type, 'train_kfold_%s_%d.npy' % (coordi_type, i)) test_npy_path = os.path.join(output_dir, coordi_type, 'test_kfold_%s_%d.npy' % (coordi_type, i)) np.save(train_npy_path, kfold_train) np.save(test_npy_path, kfold_test) print('%d kfold generated' % (i + 1)) print('k-fold generate finish')
def get_num_lines(input_data): print('start read line num') input_path = os.path.join(util.data_home(), 'origin', input_data) csv_file = csv.reader(open(input_path, "r")) count = 0 for i, line in enumerate(csv_file): if i == 0: continue count += 1 return count
def train_kfold(model_config): validate_k = model_config['validate_k'] coordi_type = model_config['voxel_cluster_type'] for i in range(validate_k): train_matrix_data = 'train_kfold_%s_%d.npy' % (coordi_type, i) train_matrix_path = os.path.join(util.data_home(), 'binary_kfold', coordi_type, train_matrix_data) train_matrix = np.load(train_matrix_path) validation_matrix_data = 'test_kfold_%s_%d.npy' % (coordi_type, i) validation_matrix_path = os.path.join(util.data_home(), 'binary_kfold', coordi_type, validation_matrix_data) validation_matrix = np.load(validation_matrix_path) # 모델을 초기화 한 다음에 학습을 진행한다. # 로스 변화 시각화는 train 함수에서 실행하며, 모델의 저장은 각 모델 클래스 파일에 정의되어 있다. model = initialize_model(model_config, train_matrix, validation_matrix) train(model, model_config, i) logger.info('train and save model') print('kfold step %d finish' % i)
def get_voxel_cluster_dict(coordi_data): coordi_path = os.path.join(util.data_home(), 'coordi', coordi_data) coordi_df = pd.read_csv(coordi_path) coordi_df = coordi_df.drop(columns=['mni_x', 'mni_y', 'mni_z']) # 기존 코디네이트 테이블이 1번부터 region index를 매겼기 때문에 1씩 빼준다. coordi_df['shen_regionid'] = (coordi_df['shen_regionid'].astype('int64') - 1) coordi_df = coordi_df.set_index('voxel_id') # max 값에 + 1을 취해주는 것은 각 인덱스를 모조리 -1 해주었기 때문에 0부터 시작한다 그러므로 +1을 해주어야 전체 개수가 된다. return coordi_df.to_dict()['shen_regionid'], int( coordi_df['shen_regionid'].max()) + 1
def get_keyword_dict(keyword_data): keyword_path = os.path.join(util.data_home(), 'keyword', keyword_data) keyword_csv = csv.reader(open(keyword_path, 'r')) keyword_dict = {} keyword_count = 0 for i, row in enumerate(keyword_csv): if i == 0: continue if not keyword_dict.keys().__contains__(row[1]): keyword_dict.update({row[1]: keyword_count}) keyword_count += 1 else: print('dupli!', row) return keyword_dict, keyword_count
def kfold_generate(): # 세 가지 복셀 클러스터 중 하나 선택: atlas morphome org coordi_type = 'org' coordi_data = 'coordi_%s.csv' % coordi_type # 선택안: keyword_origin.csv, keyword_sample.csv keyword_data = 'keyword_origin.csv' voxel_cluster_dict, voxel_cluster_count = dataload.get_voxel_cluster_dict( coordi_data) keyword_dict, keyword_count = dataload.get_keyword_dict(keyword_data) binary_matrix_data = 'matrix_%s.npy' % coordi_type binary_path = os.path.join(util.data_home(), 'binary_npy', binary_matrix_data) binary_marix = np.load(binary_path) kfold_split(binary_marix, 4, coordi_type)
def main(): config = (util.readconfig())['preprocess'] data_dir = os.path.join(util.project_home(), 'data', 'origin') # 입력 데이터 설정 # 선택안: train_origin.csv, test_origin.csv, total_origin.csv input_data = 'train_origin.csv' # 세 가지 유형의 voxel cluster 중 하나 선택: atlas, morphome, org coordi_type = 'org' coordi_data = 'coordi_%s.csv' % coordi_type # 선택안: keyword_origin.csv, keyword_sample.csv keyword_data = 'keyword_origin.csv' input_csv = get_input_data(input_data) voxel_cluster_dict, voxel_cluster_count = dataload.get_voxel_cluster_dict( coordi_data) keyword_dict, keyword_count = dataload.get_keyword_dict(keyword_data) matrix = np.zeros([keyword_count, voxel_cluster_count]) for i, row in tqdm(enumerate(input_csv), total=get_num_lines(input_data)): if i == 0: continue if not voxel_cluster_dict.get(row[1]): continue row_coord = keyword_dict.get(row[0]) col_coord = voxel_cluster_dict.get(row[1]) matrix[row_coord][col_coord] += 1 # 특정 임계치 이상 언급 횟수가 있으면 1, 아니면 0으로 정규화해준다. if config['binarize']: matrix[matrix < config['positive_limit']] = 0 matrix[matrix >= config['positive_limit']] = 1 # 결과 numpy array를 파일 형태로 저장한다. np_path = os.path.join( os.path.join(util.data_home(), 'binary_npy', 'matrix_%s.npy' % coordi_type)) np.save(np_path, matrix)
if __name__ == '__main__': config = util.readconfig() model_config = config['model_params'] # 세 가지 유형의 voxel cluster 중 하나 선택: atlas, morphome, org coordi_type = 'atlas' coordi_data = 'coordi_%s.csv' % coordi_type user_factor_path = os.path.join(util.checkpoint_home(), 'als_atlas_kfold_0_5_user.npy') item_factor_path = os.path.join(util.checkpoint_home(), 'als_atlas_kfold_0_5_item.npy') org_data_path = os.path.join(util.data_home(), 'binary_kfold', 'atlas', 'train_kfold_atlas_0.npy') org_matrix = np.load(org_data_path) # 선택안: keyword_origin.csv, keyword_sample.csv keyword_data = 'keyword_origin.csv' voxel_cluster_dict, voxel_cluster_count = dataload.get_voxel_cluster_dict( coordi_data) keyword_dict, keyword_count = dataload.get_keyword_dict(keyword_data) user_factor = np.load(user_factor_path) item_factor = np.load(item_factor_path) model = ALS(model_config) model.predict_initialize(user_factor, item_factor)
def get_input_data(input_data): input_path = os.path.join(util.data_home(), 'origin', input_data) return csv.reader(open(input_path, 'r'))
def kfold_check(): test_kfold = np.load( os.path.join(util.data_home(), 'binary_kfold', 'test_kfold_atlas_0.npy')) np.savetxt('foo.csv', test_kfold.astype(int), fmt='%i', delimiter=',') print(test_kfold)