profile-img
The merit of an action lies in finishing it to the end.
slide-image

vscode를 이용해서 git 관리를 하고 있는데 (코드를 따로 작성하지는 않고 확장 프로그램을 이용한다) 난생 처음 보는 오류를 맞닥뜨렸다.

"unexpected disconnect while reading sideband packet fatal: the remote end hung up unexpectedly everything up-to-date"

이라는 창이 뜨면서 푸시가 되지 않는 현상이 발생했다.

인터넷 오류인가 싶어서 다른 와이파이를 이용하였지만 이 문제는 아니었다.

 

구글링을 통해 오류의 원인을 파악했다. 

기본적으로 푸시할 수 있는 한 개 파일의 최대 용량이 1MB여서, 용량 초과한 파일을 push할 때 오류가 발생한다고 한다. 이번에 처음으로 1MB가 넘는 파일을 업로드해서 그런 것이었다.

이를 해결하기 위해서 최대 용량을 늘려주면 된다.

터미널을 열고 

git config --local http.postBuffer 2048M

 

해당 명령어를 입력해주니 해결되었다.

이게 먹히지 않으면 ssh에서도 변경해주면 된다고 한다. 

git config --local ssh.postBuffer 2048M

 

출처: https://happy-jjang-a.tistory.com/222

'CS study/기타' Related Articles +

Ensemble Learning이란?

여러 개의 base-learner(base-model)를 조합하는 모델

 

Bagging

- 다른 이름: Bootstrap Aggregating

- Bootstrap: Random Sampling 방법론 중 하나. 복원 추출을 시행한다.

- 복원 추출을 통해 동일한 크기의 데이터셋을 여러 개 생성한 후, 앙상블을 구성하는 학습 방식

- 단점: 랜덤 샘플링은 운에 의존한다.

만약, decision tree를 학습시킨다고 가정해보자.

boostrap으로 데이터를 추출할 경우, 복원 추출이기 때문에 같은 데이터가 여러 번 뽑힐 수 있고, 그렇기 때문에 데이터셋끼리 유사하다. 그러므로 이런 경우 decision tree의 root node는 모델 간에 항상 비슷해질 수밖에 없다. 

 

Boosting

- Bagging과 같은 방법이 randomness에 의존한다는 단점을 보완하기 위해 고안된 방식

- 전체 데이터셋을 3개로 분할한다. (D1, D2, D3)

- 학습 방식

base-learner를 3개 학습시킨다.

1. h1을 D1으로 학습시킨다.

2. h2를 D2 중 h1이 틀렸던 문제 + 맞았던 문제 같은 비율로 구성된 데이터셋으로 학습시킨다.

3. h3을 h2가 틀렸던 문제 데이터셋으로 학습시킨다.

- 예측 방식

h1(x)=h2(x)라면, h1(x)를 반환.

아니라면 h3(x)을 반환. => 틀렸던 문제만으로 학습된 모델이므로 가장 맞을 확률이 높다.

무한스크롤 페이지에서 크롤링을 할 일이 생겼다.

무한스크롤 페이지에서 항목의 목록을 모두 수집하기 위해서는 스크롤 바를 맨 끝까지 내려야한다.

따라서 페이지를 내려도 계속해서 새로운 내용이 로딩되는 무한스크롤 웹페이지에서 스크롤 바를 계속해서 내리는 방법을 알아보자.

 

여러 가지 방법이 있는데, Keys.PAGE_DOWN를 사용할 수 있다.

 

1. 필요 라이브러리를 불러온다.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

 

2. Keys.PAGE_DOWN을 사용하여 페이지 맨 끝에 도달할 때까지 스크롤 바를 내린다.

last_count = len(driver.find_elements(By.CSS_SELECTOR, 'a.contents__title'))  # 현재 페이지에 로드된 리뷰 링크 수

while True:
    body = driver.find_element(By.TAG_NAME, 'body')
    body.send_keys(Keys.PAGE_DOWN)
    time.sleep(1)

    new_count = len(driver.find_elements(By.CSS_SELECTOR, 'a.contents__title'))
        
    # 만약 새로운 링크가 더 이상 로드되지 않는다면 종료
    if new_count == last_count:
        print("더 이상 스크롤할 수 없습니다.")
        break
    
    last_count = new_count  # 개수 업데이트

 

body = driver.find_element(By.TAG_NAME, 'body')를 사용하여 body를 선택한 이후, send_keys 함수를 통해서 page down 키를 누르는 것과 동일한 효과를 준다.

이때, 무한루프를 사용해서 계속해서 스크롤을 내리기 때문에 무한루프 탈출 조건을 설정해야 한다.

나는 스크롤을 내려도 content의 개수가 바뀌지 않을 때 무한루프를 탈출할 수 있도록 조건을 설정하였다.

time.sleep(1)은 페이지 로딩에 딜레이가 걸릴 수 있기 때문에 설정한 값이다.

 

'CS study/파이썬 기초' Related Articles +

학회에서 주어진 지문에 대한 객관식 질문을 생성하는 Question Generation NLP 프로젝트를 진행 중이다.

QG 프로젝트에 사용할 수 있는 대표적인 데이터셋을 소개하고자 한다.

 

1. SQuAD 

https://rajpurkar.github.io/SQuAD-explorer/

 

The Stanford Question Answering Dataset

What is SQuAD? Stanford Question Answering Dataset (SQuAD) is a reading comprehension dataset, consisting of questions posed by crowdworkers on a set of Wikipedia articles, where the answer to every question is a segment of text, or span, from the correspo

rajpurkar.github.io

- 영어 머신러닝 Reading Comprehension 데이터셋 

- 버전: v1.1, v2.0

Stanford Question Answering Dataset (SQuAD)의 약자다. 우리는 QG 프로젝트에 사용했지만, 원래는 QA를 위한 데이터셋이다.

버전 v1.1의 경우에는 500+개의 아티클로 만들어진 100,000+개의 QA 쌍이 존재한다.

사이트에 들어가서 확인해보면, 예시 지문과 ground truth 데이터, 그리고 예측한 답 일부를 확인해볼 수 있다.

아무래도 대회 형식이다 보니까 다른 사용자들이 얼마나 답변을 잘 찾았는지 (높은 점수를 얻었는지) 스코어보드를 확인할 수 있다.

v1.1에는 답변할 수 있는 질문 데이터만 포함되어있다고 한다면, v2.0에는 일부러 답을 찾을 수 없는 문제까지 포함이 되어있다. 이럴 경우에 모델은 답을 찾을 수 없는 문제임을 인식할 수 있어야 한다고 한다.

QG 프로젝트에서는 지문과 질문만 사용하면 되니까 크게 상관은 없다.

 

2. KorQuAD

https://korquad.github.io/

 

KorQuAD

What is KorQuAD 2.0? KorQuAD 2.0은 KorQuAD 1.0에서 질문답변 20,000+ 쌍을 포함하여 총 100,000+ 쌍으로 구성된 한국어 Machine Reading Comprehension 데이터셋 입니다. KorQuAD 1.0과는 다르게 1~2 문단이 아닌 Wikipedia artic

korquad.github.io

- 한국어 머신러닝 Reading Comprehension 데이터셋

- 버전: v1.0, v2.0

SQuAD와 동일한 방식으로 만들어진 데이터셋이다. 대신 한국어로 되어있다는 차이가 있습니다. 위키피디아의 데이터를 활용하여 제작되었다고 한다. SQuAD v2.0은 v1.0과 다르게 1~2문단이 아닌 위키피디아 전체에서 답을 찾는다는 차이가 있다.

 

SQuAD와 KorQuAD는 동일한 어노테이션 구조를 가진 데이터셋이므로, 프로젝트를 진행할 때 원하는 언어가 영어인지 한국어인지에 따라서 적절하게 선택하여 프로젝트를 수행하면 된다.

'CS study/머신러닝' Related Articles +

다이브 가을 기수 2주차 과제 - Audio Classification Model (오디오 분류 모델) 만들기 과제 하는 과정

간략하게 정리해보도록 하겠다.

 

우선, 나는 딥러닝을 그렇게 잘 아는 편은 아니라서 가장 쉬운 방법으로 과제를 해결하기로 하였고

그 과정에서 채택된 것이 바로 CNN 모델이다.

Tensorflow를 이용하였다. (학교에서 시키는 과제는 파이토치를 쓰기 때문에,, 텐서플로우는 처음이다)

 

1) 오디오 데이터 불러오기

사용한 데이터 설명은 다음과 같다.

14개의 악기들별 소리가 저장되어 있는 데이터셋입니다. 오디오를 MFCC 계수의 개수를 13개로 설정한 MFCC 형태로 전처리했으며 전처리 방식은 아래와 같습니다. 전체 데이터셋에서 무작위로 하나의 악기를 고르고, 해당 악기 레이블의 데이터 중 랜덤하게 파일을 골라 그 음성 파일 내에서 공백 부분을 제외하고 0.5초를 샘플링하는 과정을 전체 데이터셋에 대해 56789번 반복했습니다. 데이터의 형태는 다음과 같습니다. 데이터는 어떤 정규화나 표준화도 거치지 않았습니다.

데이터의 형태는 넘파이로 저장되어 있었기 때문에 넘파이를 이용해 불러와준다.

 

import numpy as np
Xdata = np.load("Xdata.npy")
ydata = np.load("ydata.npy")

 

그 후, 필요한 모듈들을 임포트 해온다.

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split

 

2) 정규화 진행 및 데이터 분할

넘파이 배열 형태이기 때문에 전처리로 간단하게 정규화를 진행해 보았다.

Xdata_normalized = (Xdata - np.mean(Xdata)) / np.std(Xdata)

 

또한 학습과 테스트 데이터셋 분리를 위해 train_test_split을 이용하였다.

X_train, X_test, y_train, y_test = train_test_split(Xdata_normalized, ydata, test_size = 0.2, random_state = 42)

 

3) 모델 생성 및 학습 

model = tf.keras.Sequential([
    tf.keras.layers.Conv1D(64, kernel_size=3, activation='relu', input_shape=X_train.shape[1:]),
    tf.keras.layers.MaxPooling1D(pool_size=2),
    tf.keras.layers.Conv1D(128, kernel_size=3, activation='relu'),
    tf.keras.layers.MaxPooling1D(pool_size=2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(y_train.shape[1], activation='softmax')
])

케라스를 이용하여 CNN 층을 쌓아준다. 과적합 방지용으로 Dropout을 이용한다.

층을 쌓는 기준이라 한다면 사실 잘 모르겠고 이것저것 조합해보았다.

# 모델 컴파일
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 모델 학습
history = model.fit(X_train, y_train, epochs=50, batch_size=64)

모델 학습을 위와 같이 진행한다. 에포크 수는 처음에 20으로 했다가 수렴이 안됐길래 더 크게 해줬다.

 

4) 성능 테스트

Epoch 50/50 688/688 [==============================] - 7s 11ms/step - loss: 0.2341 - accuracy: 0.9247

학습 결과 정확도가 0.9247이었다.

더 학습시키면 완전 수렴할 것 같지만 시간관계상..

 

Test 데이터셋으로 다시 평가했을 때 결과는 accuracy: 0.8739 이었다. 약간 과적합이 된 걸까?.? 싶기도...

 

다른 팀원은 LSTM으로 하고 나도 시계열 데이터는 LSTM이 더 성능이 좋다고 알고 있는데 이미 CNN으로 너무 좋은 성능을 내서 더 좋아질 수 있을지 궁금해졌다!

 

++ 딥러닝 공부 좀 해야겠..다

'CS study/기타' Related Articles +
1 2 3 4 ··· 6