반응형
remove dict key

Remove Dict Key

딕셔너리에서 키를 안전하게 삭제하는 방법.
샘플로 다음과 같은 dictionary가 있다고 하자.

dic = dict()
dic['apple']=100
dic['banana']=200
dic['orange']=300
# 간단하게 하면 
dic = {'apple':100, 'banana':200, 'orange':300 }

위에서 apple를 지워보자.

del 로 삭제할때…

만약 키가 없으면 어떻게 될까?
del dic['mango']
KeyError!
안전하게 삭제하려면

# 1안
if 'mango' in dic:
	del dic['mango']

위와 같이 존재하는지 검사한다음, 있으면 삭제하는 것으로 할 수 있다.
매번 이렇게 if를 해 주는게 귀찮긴 한데…
일단 삭제를 시도하고, 에러나면 에러 처리하도록 할 수 있다.

# 2안
try:
	del dic['mango']
except KeyError:
	pass

pop으로 삭제할때…

dict()의 pop()을 사용하면 값을 꺼내올 수 도 있고, 해당 키가 삭제되는 효과도 있다. 이것도 키가 없다면? 에러가 발생할 것 같은데…
del과 마찬가지로 KeyError 예외가 발생한다.
즉, 해결방법은 1안과 2안처럼, 존재체크를 하거나 예외 처리를 할 수 있다.

dic.pop('mango')  # mango not found -> KeyError!!!

다른 방법은???
pop()의 다른 형태로는 파라미터에 값을 추가하면 키가 없을 때 디폴트 값을 리턴하도록 하는 기능이 있다. 이 방식을 사용하면 쉽게 안전한 삭제가 가능하다.

# 3안
dic.pop('mango', None) # if not found -> None. (no error!)

이제 있을지 모르는 키를 삭제하려면 pop( [key], None)을 사용하자.

dic.pop('apple', None)

위와 같이 하면 해당 키가 존재하는지 체크를 하거나 except 처리를 할 필요가 없다.

Author: crazyj7@gmail.com

'Python' 카테고리의 다른 글

Jupyter Notebook 소스 복구  (0) 2020.06.16
Docker python venv 패키지 유지  (0) 2020.06.07
파이썬 충돌해결 module conflict  (0) 2019.12.01
파이썬 개발환경/가상환경구축  (0) 2019.12.01
진법 표현 및 수 스트링 변환  (0) 2019.11.24
반응형
XGBoost

XGBoost

eXtreme Gradient Boosting

  • 병렬 처리로 학습, 분류 속도가 빠르다.
  • 다양한 옵션. Customizing 용이
  • Greedy 알고리즘을 사용한 자동 가지치기로 오버피팅 방지가 된다.
  • 다른 알고리즘과 연계에도 성능이 좋다. 뒷단에 다른 레이어 추가.

XGBoost는 딥러닝이 아니다. 여러가지 조건문들이 들어가는 가지치기로 보면 된다. Decision Tree라고 하고 이것들이 다 모이면 최종적으로 forest라고 한다
데이터에 따라 딥러닝보다 성능이 좋은 경우가 많다.

XGBoost는 CART(Classification and regression tree) 앙상블 모델을 사용한다. 모델끼리의 우의 비교를 통해 최종 결정을 내림.

파라미터

  • 일반 파라미터 ; 어떤 모델을 쓸 것인가?
    • gbtree, gblinear, dart
    • nthread ; 쓰레드 수. 디폴트는 max
    • num_feature ; 입력 차원. 디폴트는 max
  • 부스터 파라미터 ; 트리마다 가지치기 옵션
    • eta ; learning rate. 트리에 가지가 많을수록 과적합 발생.
    • gamma ; 정보획득에서 -r. 값이 클수록 트리 depth가 줄어든다. 디폴트는 0
    • max_depth ; 한 트리의 최대 깊이. 클수록 복잡도가 커짐. 즉, 과적합. 디폴트는 6으로 리프노드의 최대개수는 64가 된다.
    • lambda ; L2 Regularization. 클수록 보수적.
    • alpha ; L1 Regularization
  • 학습 과정 파라미터 ; 최적화
    • objective ; 목적함수. reg:linear, binary:logistic, count:poisson 등
    • num_rounds : 라운드 epoch 같은 개념. 너무 커도 좋지 않다.

파라미터를 알아야 모델을 구축할 수 있다.
binary classification 문제에 linear-regression을 적용하면 아무리해도 답이 안나온다.

  • 민감한 정도로 먼저 조정해야 될 것들
    • booster 모양
    • eval_metric(평가함수)/ objective(목적함수)
    • eta (epoch)
    • L1
    • L2

Sample1. XGBClassifier

from numpy import loadtxt
from xgboost import XGBClassifier
from xgboost import plot_importance
from matplotlib import pyplot

dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
x=dataset[:,0:8]
y=dataset[:,8]

# fit model no training data
model = XGBClassifier()
model.fit(x,y)

plot_importance(model)
pyplot.show()
  • fitting후 plot_importance로 어떤 피쳐들의 중요도를 높게 보고있는지 막대그래프로 확인할 수 있다.
  • 중요도가 크게 떨어지는 피쳐들은 삭제하는 것이 성능에 좋은 영향을 주는 경우가 많다.

Sample2. XGBRegressor

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import Imputer

# 데이터를 읽고, null 레코드 삭제
data = pd.read_csv('../input/train.csv')
data.dropna(axis=0, subset=['SalePrice'], inplace=True)
# 출력값은 집값
y = data.SalePrice
# 훈련데이터에서 집값제거하고 수치가 아닌 데이터 삭제.
X = data.drop(['SalePrice'], axis=1).select_dtypes(exclude=['object'])
# 데이터 분리. train, validation data. 
train_X, test_X, train_y, test_y = train_test_split(X.as_matrix(), y.as_matrix(), test_size=0.25)

# 데이터 전처리
my_imputer = Imputer()
train_X = my_imputer.fit_transform(train_X)
test_X = my_imputer.transform(test_X)

  • sklearn의 preprocessing에 Imputer로 데이터를 전처리 하였다.
  • Imputer?
    • 누락 NA 데이터에 대한 전처리가 가능하다.
    • 데이터 파일에서 ‘na’ 스트링을 na로 인식하여 로딩하여도록 하려면 pd.read_csv(‘test.csv’, na_values=‘na’)
  • SimpleImputrer
    -누락된 데이터의 값을 특정 값으로 지정하거나 통계값으로 설정할 수 있다.
    • imp = SimpleImputer(missing_values=np.nan, strategy=‘mean’)
    • imp.fit( data ) ; fitting하여 통계 정보를 구한다.
    • X = imp.transform( data ) ; 위 통계 정보를 사용하여 np.nan값을 컬럼마다 평균값으로 채움.
    • missing_values=-1 로 하면 -1값을 누락값으로 인식.
    • strategy의 종류 ; mean, most_frequent (최고빈도로 스트링 컬럼(category)도 처리가 됨.)
  • Imputer
    • Imputer(missing_vaues=‘NaN’, strategy=‘mean’ , axis=0, verbose=0, copy=True) ; 기본값 확인. (여기는 특이하게 axis=0이 컬럼방향이다.)
from xgboost import XGBRegressor

my_model = XGBRegressor()
# Add silent=True to avoid printing out updates with each cycle
my_model.fit(train_X, train_y, verbose=False)

# make predictions
predictions = my_model.predict(test_X)

from sklearn.metrics import mean_absolute_error
print("Mean Absolute Error : " + str(mean_absolute_error(predictions, test_y)))
  • 학습은 위와 같이 매우 간단하다.

모델 튜닝

  • 성능을 올리기 위한 필수 과정.
  • n_estimators ; 학습 횟수
  • early_stopping_rounds ; n연속으로 발전(기존 max 갱신)이 없으면 강제 중지
my_model = XGBRegressor(n_estimators=1000)
my_model.fit(train_X, train_y, early_stopping_rounds=5, 
             eval_set=[(test_X, test_y)], verbose=False)
  • learning_rate ; 학습률
my_model = XGBRegressor(n_estimators=1000, learning_rate=0.05)
my_model.fit(train_X, train_y, early_stopping_rounds=5, 
             eval_set=[(test_X, test_y)], verbose=False)
  • n_jobs ; 병렬처리로 보통 cpu core 수로 정하는 것이 좋다.

Author: crazyj7@gmail.com

'AI(DeepLearning)' 카테고리의 다른 글

[ChatGPT] 글쓰기  (0) 2023.02.09
[ChatGPT] 글쓰기 테스트  (1) 2023.02.09
처음해본 kaggle 도전기  (1) 2019.11.27
Custom EarlyStopping  (0) 2019.11.11
타이타닉 kaggle 자료 분석  (0) 2019.08.23
반응형
solidity03_data_var

Solidity 03. Variables/Datatypes

변수를 어떻게 사용하는가?

  • 멤버 변수들은 Storage 변수. 상태 변수이다.
  • 파라미터들은 Memory 변수. 함수 리턴시 날라간다.
  • 파라미터에 Storage를 지정하면? 참조가 된다?

integer와 string을 get/set 하는 예제

pragma solidity >=0.4.0 <0.6.0;

contract SimpleStorage {
    uint storedData;
    string storedNm;

    function set(uint x) public {
        storedData = x;
    }

    function setNm(string memory x) public {
        storedNm = x;
    }

    function get() public view returns (uint) {
        return storedData;
    }

    function getNm() public view returns (string memory ) {
        return storedNm;
    }
}
  • 기본 자료형이 아닌 것은 저장소를 명시해 주어야 한다. string을 사용하는 부분에 memory 타입으로 명시함.

datatype

  • 기본형
    uint/int ; uint, int는 뒤에 256이 생략되어 있다. (u는 unsigned 의미)
    uint8~uint256 ; 여기서 숫자는 비트수를 의미. 1바이트부터 32바이트까지 있다.
    bool : true or false
    byte : uint8과 같다고 생각하면 된다.
    address : 20바이트 주소값
    address payable : address타입인데 멤버함수가 있다. transfer, send.
    address payable x = address(uint160(to));

enum State { Created, Locked, Inactive } ;
산술/비교/비트/논리 연산자는 C 와 같음. enum도 같다.

  • 참조형
    배열 : [] array
    구조체: struct
0xffff ; int16(-1)
0x42 ; bytes1(0x42)
0x0003 ; uint16(0x03)
0x48656c6c6f2c20776f726c6421 ; string("Hello, world!") (without null)

address의 멤버

  • balance ; 계정 주소에 있는 이더를 wei로 반환
  • transfer(uint amount) ; 계정 주소(받는 사람 주소)에 있는 amount 금액을 송금. to.transfer(_amount)
  • send(uint amount) returns (bool) ; 상동. 실패시 false 리턴. to_send(_amount)
  • call(…) returns (bool) : 상동, 실패시 false 리턴. 가스량 조절 가능. to.call.value(_amount).gas(1000000)() . 리턴값을 확인하여 false이면 revert()로 롤백한다.
  • delegatecall(…) returns (bool) : 다른 계약의 함수를 호출.
address x=0x123 ;
address myAddress = this ;
if (x.balance<10 && myAddress.balance>=10) x.transfer(10) ;
  • send : low-level의 transfer임. (실패시 롤백없음). 리턴값(true/false)을 반드시 확인.

고정크기 바이트 배열

bytes1/bytes2/bytes3/… bytes32 : bytes뒤에 숫자를 붙인다. 바이트수를 의미.
byte : bytes1과 같다.
멤버
length : 고정된 길이를 반환. 읽기 전용.
bytes32는 32바이트까지만 담을 수 있다.
ex)
bytes2 b = “bac”

동적 크기 바이트 배열

bytes : 임의 길이의 원시데이터.
string : UTF-8 인코딩 문자열. 임의의 길이. 거의 무제한.(2^256 * 256 비트)

  • 멤버로 length, push()가 있다.
  • 작은 따옴표나 큰 따옴표 상관없다.
    ex) bytes memory a = ‘aaaaaaaaaa’;
    a.length ;
    a.push(‘c’) ;
    a.push(“C”) ;
    a.push(“AB”) ; // error. byte[]라서 byte 하나만 push 가능.

문자열 리터럴

작은 따옴표, 큰 따옴표 둘 다 가능.
C랑 다르게 null terminated가 아니다. 보이는 문자 개수만큼만 메모리를 차지함.
\n, \xNN (16진수), \uNNNN (유니코드) 도 지원.

16진수 리터럴

hex"001122FF"
앞에 hex를 지정.

이중배열

uint [][5] : 주의할 점은 행과 열이 다른 언어와 반대임.
이것을 C로 보면 uint [5][] 이 된다.

  • 웃긴건 접근할 때는 C처럼 행, 열 순으로 접근한다.
  • 선언할 때랑 사용할 때랑 다르다니 문화충격이다.
uint[3][2] dArray ;
// row index는 0,1까지 가능. column index는 0,1,2까지 가능.
// C나 java로 치면 uint dArray[2][3] 으로 생각해야 함.
dArray[1][2] = 100 ;  // last element.

dArray[2][2] = 100 ; // error. 
dArray[0][3] = 100 ; // error. 
function f(uint len) public pure {
	uint[] memory a = new uint[](7) ;
	bytes memory b = new bytes(len) ;
	// a.length==7, b.length=len
	a[6]=8 ;
}
function f() public pure {
	g([uint(1), 2, 3]) ;
}
function g(uint[3] _data) pubilc pure {
}

[1,2,3] 은 uint8[3] memory 타입이다. array에 첫 번째 요소에 타입을 명시해 줄 수 있다.

  • 고정 크기 배열을 동적크기 배열에 할당할 수 없다.!
uint8[] memory x = [uint8(1),2,3] ;	// 에러
uint8[3] memory x = [uint8(1),2,3] ;	// 가능.

uint[] dArray ;
dArray.push(2) ;
dArray.push(3) ;
  • 삭제는 delete로 배열을 삭제한다.
  • 일반 변수에 delete를 하면 초기값(0)으로 할당된다.

자료구조

struct 지원

struct Voter {
uint w ;
bool v ;
address dele ;
uint vote ;
}

Enum Types

enum State { Created, Locked, Inactive }

Type Conversion

  • uint를 스트링으로 변환. 하나씩 바이트 단위로 ascii char로 변환한다.
function uintToString(uint v) constant returns (string str) {
        uint maxlength = 100;
        bytes memory reversed = new bytes(maxlength);
        uint i = 0;
        while (v != 0) {
            uint remainder = v % 10;
            v = v / 10;
            reversed[i++] = byte(48 + remainder);
        }
        bytes memory s = new bytes(i + 1);
        for (uint j = 0; j <= i; j++) {
            s[j] = reversed[i - j];
        }
        str = string(s);
}

function uint2str(uint i) internal pure returns (string)
{ 
	if (i == 0) return "0"; 
	uint j = i; 
	uint length; 
	while (j != 0){ length++; j /= 10; } 
	bytes memory bstr = new bytes(length); 
	uint k = length - 1; 
	while (i != 0){ bstr[k--] = byte(48 + i % 10); 
	i /= 10; 
	} 
	return string(bstr); 
}
  • 타입 캐스팅은 타입을 함수처럼 사용하여 파라미터로 받는다.
  • 32비트를 16비트로 타입 캐스팅시 하위 바이트(낮은 자리 값)만 가져온다.
  • 예를 들면. uint32 a= 0x12345678 ; 이것을 uint16 b = uint16(a) ; 이렇게 하면 하위 바이트인 0x5678을 가져온다.

Mapping

contract Mappings {
 struct User {
   string name ;
   string email ;
 }
 mapping(address => User) users ;
 function addUser(string memory _name, string memory _email) public {
   users[msg.sender].name = _name ;
   users[msg.sender].email = _email ;
 }
 function getUser() public returns (string memory, string memory) {
   return (users[msg.sender].name, users[msg.sender].email) ;
 }
}

이더리움 단위

wei ; 가장 작은 단위
1000 배씩 올라간다.
kwei, mwei, gwei, micro, milli, ether
kether, mether, gether, tether
위 단위를 코드에 그대로 사용한다.
즉, 1 이더는 10**18 wei

시간 단위

second, minute, hour, day, week, year

블록 및 거래 속성

  • block.blockhash(uint blockNumber) returns (bytes32) : 지정한 블록의 해시값을 리턴. (최근 256개 블록만 사용 가능)
  • block.coinbase ; address 채굴자 계정 주소
  • block.difficulty ; uint 현재 블록 난이도
  • block.gaslimit ; uint 현재 블록의 가스 제한량
  • block.number ; uint 현재 블록 번호
  • block.timestamp ; uint 현재 블록의 타임스탬프
  • msg.data ; bytes 호출 데이터
  • msg.gas ; 남은 가스양
  • msg.sender ; address 메시지를 보낸사람
  • msg.sig ; bytes4 calldata의 첫 4바이트로 함수 식별자
  • msg.value ; uint 메시지와 같이 보낸 wei
  • now ; block.timestamp와 같다. (현재 시간을 의미하는 값은 아니다. 현재시간과 대략 비슷)
  • tx.gasprice ; uint 거래의 가스가격
  • tx.origin ; 거래 발신자 주소. (sender.address와 같을 수도 다를 수도 있다.)
  • this ; 현재 계약
  • selfdestruct(address) ; 현재 계약을 파기해 지정한 주소로 금액을 보냄
  • suicide(address) ; 상동

예외 처리

  • assert(bool condition) ; 조건이 실패하면 에러를 발생시킨다. (보통 내부에러)
  • require(bool condition) ; 위와 같다. 입력값 체크시 사용. (보통 외부에러)
  • revert() ; 에러가 발생하면 롤백을 시킨다.

기타 연산

  • addmod(uint x, uint y, uint k) returns (uint) : (x+y)%k
  • mulmod(uint x, uint y, uint k) returns (uint) : (x*y)%k
  • keccak256( data ) returns (bytes32) : 이더리움 sha3 (KECCAK256) 해시
  • sha256
  • sha3 ; keccak256과 동일
  • ripecmd160(data) returns (bytes20)
  • ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) return (address) : 타원곡선암호서명에서 공개키와 연결된 주소를 리턴

할당

  • 복수 데이터를 할당 할 수 있다. 리턴도 복수개가 가능
    • (x,y) = f() ;
  • swap
    • (x,y) = (y,x) ;
  • 함수 파라미터를 이름대로 지정할 수 있다.
    • f(3, 2) 대신 f({value:2, key:3}) 이렇게 사용. (파라미터 이름)
    • new로 다른 계약을 만들 수 있다.

Author: crazyj7@gmail.com

'BlockChain' 카테고리의 다른 글

Solidity#2 HelloWorld  (0) 2019.12.06
Solidity 0.4 vs 0.5  (0) 2019.12.06
Windows Ethereum python module install error  (0) 2019.12.04
[ether02] 코인만들기  (0) 2019.11.10
[ether01] solidity 맛보기  (0) 2019.11.10
반응형
solidity02_helloworld

Solidity 02

  • solidity 버전 표시
pragma solidity ^0.4.25;    // 정확히 이 버전만 지원
pragma solidity >=0.4.0 <0.6.0;  // 지원 범위

  • 파일 import
import "filename";
import "filename" as symbolName ;
import "github.com/ethereum/dapp-bin/library/iterable_mapping.sol" as it_mapping;

github에 있는 소스도 사용할 수 있다.

  • 주석은 c 형식 사용. /**/ // 등
  • public 함수나 변수는 외부에 노출
  • 반대는 internal로 표시한다. 내부에서만 호출 가능.
  • 파리미터에 memory는 라이프사이클이 함수내.
  • 파리미터에 storage로 주면 참조 형식으로 값이 변할 수 있다.
  • 함수에 view를 주면 storage 변수에 읽기 접근만 가능하다. 이벤트 발생 안된다.
  • 함수에 pure를 주면 storage 변수에 접근이 안된다.
  • view, pure를 귀찮게 왜 쓰나? gas 비용 절감과 보안측면 이다.

구버전

pragma solidity ^0.4.25 ;
contract HelloWorld {
	string public greeting ;
	function HelloWorld(string _g) public {
		greeting = _g ;
	}
	function setGreeting(string _g) public {
		greeting = _g ;
	}
	function say() public constant returns (string) {
		return greeting ;
	}
}

위는 0.4대 버전, 아래는 0.5대 버전이다. 문법이 약간 달라졌다.
- constructor가 클래스명에서 명시적으로 constructor로 변경.
- 파라미터, 리턴 변수앞에 저장소 지정을 명시적으로. (엄격해짐)
- constant가 없어짐. view로 대체.
  • public/internal 의 위치가 타입 뒤에 가는 것이 특징. (cpp, java와 다르다.)
  • 함수 리턴 타입을 지정하는 부분이 마지막에 들어간다.

신버전

pragma solidity >0.5.0;

contract HelloWorld {
	string public greeting ;
	
	constructor(string memory g) public {
		greeting = g;
	}
	
	function setGreeting(string memory g) public {
		greeting = g;
	}
	function say() public view returns (string memory) {
		return greeting ;
	}
}

image

  • deploy시 remix에서 펼쳐서 이름을 입력해줘야 인코딩에러가 안난다.
  • setGreeting시도에 펼쳐서 값을 넣어줘야 작동되었다.

Author: crazyj7@gmail.com

'BlockChain' 카테고리의 다른 글

Solidity#3 변수와 타입  (0) 2019.12.06
Solidity 0.4 vs 0.5  (0) 2019.12.06
Windows Ethereum python module install error  (0) 2019.12.04
[ether02] 코인만들기  (0) 2019.11.10
[ether01] solidity 맛보기  (0) 2019.11.10
반응형
solidity01_version

Solidity

Truffle

npm install -g truffle

작업 폴더를 만들고, 들어가서 프로젝트 초기화

truffle init

컴파일

solc source.sol --abi --bin (컴파일 변환 결과를 출력)

전체출력을 JSON 형태로 출력 (뒤에 받을 정보를 기록)
solc source.sol --combined-json abi, asm, bin

truffle을 사용한다면 truffle compile
배포는 truffle migrate로 한다.

문법

cpp처럼 ;으로 끝난다.
주석도 cpp처럼 한다. //, /* 등

pragma solidity >= 0.4.22 <0.6.0 ;
지원하는 버전을 표시한다. 0.4.22이상 0.6 미만.
특정 버전을 지칭할 경우는 ^0.4.22 이렇게 한다.

import ‘a.sol’;
다른 파일을 include 한다.
다른 사용 방식은
import * as cs from “filename”;
import “filename” as shortname;

contract 계약명 {
}
cpp 클래스처럼 정의한다.

mapping (address => uint) balances ;

버전 4와 5와 차이

solidity는 4, 5의 버전 차이가 심하다. 그것을 알아야 빌드를 할 수 있다.

  • Low-Level 함수 호출
    • callcode 삭제
    • staticcall 추가
    • 입력 파라미터가 bytes로 통일
    • 리턴값 지원
  • 지역변수 scope
    • C처럼 scope을 사용한다.
  • 배열에 pop 메소드 추가
  • 중요한 변화
  • address payable 타입 추가
    • 기존에 address 타입에 있던 send, transfer 메소드 삭제
    • 주소를 address payable 타입으로 변환해야 사용 가능하다.
    • send, transfer는 같은 기능인데 send는 low-level함수로 예외처리가 가능하다. transfer는 트랜잭션으로 처리.
    • 주소 타입을 payable로 변환하려면,
(0x...).transfer(1 ether); // 주소 상수 뒤에 바로 사용 OK
address to = 0x...;  
address(to).transfer(1 ether); // 에러!  
address(uint160(to)).transfer(1 ether); // 두번 변환은 OK
address payable x = address(uint160(to)); // 저장할 때도 두번 변환해야 OK
- msg.sender는 address payble 타입으로 변함
- msg.value는 payable, internal 함수에서만 접근 가능
- 다른 곳에서 사용하고 싶으면, 
function msgvalue() internal returns (uint256) {  
return msg.value;  
}
  • 변수 선언을 먼저 확실하게 해주어야 함. (C code)
  • 함수의 visibility (external/public/internal) 명시.
    • (v0.4는 default public)
  • 데이터로케이션(storage(상태변수참조)/memory(함수내)/calldata(함수파라미터)) 명시.
    • (v0.4는 default로 함수파라미터는 memory/calldata, 지역변수는 storage로 자동)
  • contract 타입을 address 타입으로 형변환하여 사용.
    • 0.4에서는 contract 타입이 기본적으로 address 타입과 혼용하여 사용가능했지만 transfer, balance 등을 사용하려면 명시적으로 형변환을 해줘야 한다.
  • Contract 타입간 형변환은 상속관계만 가능.
    • 상속관계가 아닌 contract로 변환하려면 형변환을 두 번하면 가능하다. A(address(b))
  • bytesX, uintX는 사이즈가 같은 경우만 형변환이 가능
    • bytes1 c=1 ;
    • bytes2 d = bytes2( c) ; // 0x0100 (오른쪽에 0이 추가)
    • bytes1 e = bytes1(d); // 0x01 (오른쪽을 제거)
    • bytes1 a = bytes1(0x100); // 0.5.0 부터는 error
    • bytes1 b = bytes1(uint8(0x100)); // 결과는 0
    • bytes1 c = bytes1(bytes2(0x100)); // 결과는 1
  • constant 키워드 삭제. 대신 view로 사용해야 함.
  • var 타입 삭제. 명시적 필요
  • suicide 함수 삭제. selfdestruct로 대체
  • sha3 함수 삭제. keccak256로 대체
  • throw 삭제. revert, require, assert 사용
  • contract명과 동일한 이름의 함수 construct 사용 불가. constructor키워드로 대체
  • 16진수표현은 0X는 삭제. 0x만 지원

Author: crazyj7@gmail.com

'BlockChain' 카테고리의 다른 글

Solidity#3 변수와 타입  (0) 2019.12.06
Solidity#2 HelloWorld  (0) 2019.12.06
Windows Ethereum python module install error  (0) 2019.12.04
[ether02] 코인만들기  (0) 2019.11.10
[ether01] solidity 맛보기  (0) 2019.11.10
반응형
windows_ethereum_pkg_error

Windows Ethereum python module install error

ethereum python 패키지를 윈도우에 설치할 때 환경에 따라 ethash에서 alloca.h 에러가 나는데 이것을 해결하기 위한 방법이 있다.

ethash

  • ethereum 패키지를 설치하는 과정에서 pyethash 모듈을 빌드하다가 에러가 발생한다. (alloca.h 에러)
  • ethhash 소스를 받아 코드를 수정하여 설치한다.
    git clone https://github.com/ethereum/ethash
1. src/libethash/mmap_win32.c
아래 코드 추가
#pragma comment(lib, "Shell32.lib")
2. src/python/core.c
#include <alloca.h> 를
#include <malloc.h> 로 바꾼다.

pip install .
으로 설치한다.
이후에 다시 ethereum을 pip로 설치시도하면 ethash를 자꾸 새로 설치하려고 하면서 동일한 에러가 나고 롤백이 된다.

ethereum

  • ethereum 패키지 소스를 받아 의존성 수정하여 설치한다.
    https://github.com/ethereum/pyethereum/releases/tag/v2.3.2
    소스를 받아서 풀고
    requirements.txt 에서 ethash 설치하는 부분을 삭제한다. (이미 패치한것을 위에서 설치했으므로 건너뛰도록 하는 것이다.)
    pip install .
    으로 설치한다.

Author: crazyj7@gmail.com

'BlockChain' 카테고리의 다른 글

Solidity#2 HelloWorld  (0) 2019.12.06
Solidity 0.4 vs 0.5  (0) 2019.12.06
[ether02] 코인만들기  (0) 2019.11.10
[ether01] solidity 맛보기  (0) 2019.11.10
이더리움개발 환경 준비  (1) 2019.11.10
반응형
module_conflict

Python module conflict error

파이썬으로 외부의 여러 패키지들을 깔고 테스트하다 보면 가끔씩 충돌이 발생하여 이전에는 잘 되던 것들이 꼬이게 된다.
막상 경험해 보면 복구하는 것이 쉽지 않고 점점 더 꼬이는 악순환이 발생하여 나중에는 파이썬을 다시 설치하게 된다.
어떻게 복구하는 방법이 없을까?

먼저 가끔씩 현상황을 기록해 두자.

pip freeze > requirements.txt

  • 위와 같이 freeze 옵션을 사용하면 현재 설치된 모든 모듈의 버전들이 기록된다. 보통은 requirements.txt 로 많이 기록된 것을 볼 수 있다.
  • 나중에 저 목록을 한 번에 설치가 가능하다. install -r 옵션을 사용한다.

마지막에 설치/변경된 모듈들을 삭제.

  • 마지막에 설치/변경된 모듈들을 하나씩 삭제해 올라간다.
  • 그런데 마지막순으로 설치된 모듈들이 무엇인지 기억이 나지 않는다.

현재 python 환경(env)의 설치 경로들을 확인.
conda env list
python --version
코드로 라이브러리 위치 확인

import os, inspect
inspect.getfile(os)
'opt/anacoda3/lib/python3.7/os.py'

import web3
inspect.getfile(web3)
'/home/crazyj/myvenv/lib/python3.7/site-packages/web3/__init__.py'
  • 위와 같이 패키지 설치 경로를 확인한 다음 디렉터리로 가서 날짜를 확인한다.

ls -ltr : 마지막에 나온것들이 최근 설치/업데이트된 패키지들. (last modified time 기준으로 역순소팅)
위 마지막 패키지들을 pip uninstall로 하나씩 지워나가면서 테스트 한다.

모든 패키지 삭제하기

이것도 저것도 안된다면, 백업받은 패키지 목록대로 돌리기 위해 전부 삭제하고 다시 설치하자.

pip freeze | xargs pip uninstall -y
또는
pip freeze > requirements.txt
pip uninstall -r requirements.txt -y

패키지 목록 한번에 설치하기

pip install -r requirements.txt

Author: crazyj7@gmail.com

'Python' 카테고리의 다른 글

Docker python venv 패키지 유지  (0) 2020.06.07
딕셔너리에서 키삭제  (0) 2019.12.07
파이썬 개발환경/가상환경구축  (0) 2019.12.01
진법 표현 및 수 스트링 변환  (0) 2019.11.24
크롤링 BeautifulSoup 요약  (1) 2019.11.06
반응형
virtualenv

Python Virtual Env / Conda Env

파이썬 가상환경. 여러가지 버전의 파이썬을 동시에 사용할 수도 있고, 목적에 따라 가상환경을 만들어 따로 운영할 수 있다.
딥러닝용, 그래픽용, 서버 개발용 등등

virtual env 환경 생성

  • 설치된 버전 확인

    • pip --version
    • pip3 --version
    • pip install virtualenv
    • pip3 install virtualenv
  • 현재 폴더 아래 가상환경 생성. 주어진 환경이름으로 폴더가 생성된다.

    • virtualenv 이름 --python=pyton버전
    • virtualenv py37 --python=python3.7
    • 윈도우의 경우 안 된다면 --python=[python.exe fullpath]로 한다. 생략하면 현재 연결된 path의 python 버전으로 자동 인식.

가상환경으로 들어가기

  • source ./py37/bin/activate
  • 위 커맨드를 입력하여 실행하면 잘 되는데, shell script로 만들어 실행하면 작동하지 않는다.
  • 리눅스에서는 로그인 계정의 .bashrc에 alias=‘source …’ 으로 만들어 사용하자.
  • 윈도우는 source 대신 call을 사용하여 배치 파일로 만들면 된다.
    • py37.bat
      call c:\devtools\py37\scripts\activate
  • 작업이 끝나면 deactivate 로 빠져나간다.

가상 환경별로 원하는 패키지 설치

  • 가상환경 사용하다가 freeze로 requirements.txt를 생성해 주자. (나중에 한 번에 필요 모듈 설치시 편리하다.)
pip list
pip freeze > requirements.txt
pip install -r requirements.txt
pip install numpy matplotlib ipykernel jupyter requests

Jupyter Notebook/Lab에 venv 등록

  • pip install ipykernel
  • jupyter에 가상 환경 등록
python -m ipykernel install --user --name py37 
       --display-name py37

(–display-name은 생략해도 된다.)

Jupyter Notebook 실행하여 확인

  • jupyter notebook
    파일 목록 오른쪽 메뉴에 New에 환경이름이 추가되었는지 확인한다. 소스 편집기에서 Kernel에서 Change하여 원하는 커널 환경을 선택한다.
  • 모듈 로딩 경로가 맞는지 최종 확인
    • 설치한 패키지명을 import하여 경로를 확인한다.
    • import web3, inspect
    • inspect.getfile(web3)
	'/storage/crazyj/py37/lib/python3.7/site-packages/web3/__init__.py'
  • Jupyter notebook 기본 브라우저를 크롬으로 변경
설정 파일이 없을 경우 최초 생성
jupyter notebook --generate-config

편집
notepad %userprofile%\.jupyter\jupyter_notebook_config.py

수정 내용
c.NotebookApp.browser = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s'

  • Jupyter notebook 암호 설정
$ jupyter notebook password
암호 입력

Conda (Anaconda) env

virtualenv 말고 conda로도 만들 수 있다.

가상 환경 전환

  • 현재 존재하는 가상 환경 목록
    conda env list

  • 가상환경 활성화
    conda activate [가상환경명]
    또는
    activate [가상환경명]

  • 가상환경 비활성화
    conda deactivate

가상환경 생성

conda create --name [가상환경명] python=3.7.3 tensorflow keras
파이썬 버전을 명시해 주고, 뒤에 추가할 패키지명들을 옵션으로 적어줄 수 있다.

가상환경 삭제

conda remove --name [가상환경명] --all

Author: crazyj7@gmail.com

'Python' 카테고리의 다른 글

딕셔너리에서 키삭제  (0) 2019.12.07
파이썬 충돌해결 module conflict  (0) 2019.12.01
진법 표현 및 수 스트링 변환  (0) 2019.11.24
크롤링 BeautifulSoup 요약  (1) 2019.11.06
크롤링(Crawl) 2편  (2) 2019.10.27
반응형
crazyj_kaggle_first

Kaggle first time

crazyj7@gmail.com

동기

처음에 이 사이트를 보고 단순히 무료로 데이터 파일들을 다운받을 수 있는 사이트 인줄 알았다. 거의 방문을 안하다가 가끔 데이터 파일 쓸모있는게 있나 찾다가 여러가지 다른 기능들이 많은 것을 발견했다.
학습에 도움이 많이 될 거라는 생각에 모니터링 중 Competition이 있는 것을 알게 되고 국내에서 주최한 대회가 있다는 것에 흥미를 느끼고 장난삼아 도전해 보려고 했다.
그간 AI쪽을 제대로 공부한 적은 없지만 나름대로 독을 좀 했. 다만 혼자서 하려니 어디 물어볼 데도 없고, 이해가 안가서 막히는 것들이 많아 진행 속도가 더디었다.

캐글 사용기

커널을 대체 어떻게 사용해야 되는지 어렵다.
느리고, 자꾸 끊기고, 에러나고, 아웃풋을 못찾겠고, 이어서 되는 건지 아닌지 모르겠고. 커밋은 git 처럼 소스 커밋을 말하는 건지…

  • 커널을 여러 개 동시에 돌릴 수 있다고 한다. 최대 5개 던가? 아직 해 보지는 않았다.
    • 3개 4개 돌려보니 잘 된다. 계속 하다 보면 익숙해짐.
  • 커널 이용 최대시간은 9시간 이라고 하는 것 같다. 학습이 이 시간을 넘어가면 짤린다는 것이겠다. 중간 저장이 필수겠다.
  • 가공 생성한 파일들은 대체 어디에 있는 것일까?
    • 현재 디렉터리에 생성된다. /kaggle/working 인 듯. 디렉터리 탐색도 커맨드 실행으로 할 수 있다. 커널버전 보기에서 Output 메뉴에 생성한 파일들 목록이 보여서 다운로드는 할 수 있다.
    • 그런데 이어서 작업할 때는 왜 output 파일이 다 없어지는 것일까? 디렉터리 탐색시 다 사라진다. 작업 디렉터리인 working 디렉터리는 세션 실행시 초기화된다. output이 다 없어진다. 주의! 이전 커밋은 버전을 찾아 들어가면 output을 받을 수 있다.
  • 소스는 여러 개를 올릴 수 있는 것일까?
    • 안되는 것 같다.
    • 한 파일만 되는 듯. ipynb (노트북)와 py(스크립트) 변환을 지원하고 업로드기능이 있으니 잘 활용하면 된다. 스크립트는 올릴필요없이 복붙하면 쉽다.
  • 대체 커밋이 뭐지?
    • 커밋은 소스 전체를 실행하는 것이다. 에러없이 모두 성공해야지만 output 파일이 생성되고, 다운 받을 수 있다. 중간에 실패하면 날라간다. ㅜ.ㅜ
  • 생성한 output을 유지할 수는 없나?
    • 시행착오 끝에 output을 다운 받아서 dataset에 추가하고 커널에서 dataset을 추가해서 불러서 사용하면 된다.
  • 데이터셋 업데이트는?
    • 안된다. 올라간 데이터셋을 삭제하고, 새로운 데이터셋을 동일한 이름으로 올리는 식으로 업데이트 할 수 있다. 불편함. 해당 데이터셋을 참조하는 커널에서는 링크깨진 데이터셋을 삭제하고 다시 만든 것을 추가해 주어야 한다.

캐글 사용 정리

  1. 로컬 환경에서 먼저 자료 분석을 한다.
    데이터 셋을 받은 다음 jupyter notebook이나 lab으로 자료 관찰하고, 데이터 전처리를 하는 것을 만든다.
  2. 데이터 전처리된 파일들을 데이터셋으로 만들어 업로드한다.
  3. 가급적 경로를 로컬환경과 캐글환경을 일치시키면 올릴때 경로 수정이나 환경플래그값을 변경하지 않아도 되어 편하다.
    따라서 …/input/dataset이름/파일명 이나 …/input/dataset이름/압축파일명/내부파일명 으로 접근.
  4. 커널을 만들고 데이터셋을 추가하여 테스트해 본다
  5. 로컬 환경에서 디버그 모드를 만들어 적은 데이터로 빠르게 학습할 수 있도록 준비한다. 잘 되면 릴리즈모드로 만들고 커널에 임포트하여 커밋해 본다.
  6. 기본이 되는 커널을 잘 만든다. 여러가지 테크닉을 집어 넣기 전에 기본이 되는 커널이 잘 작동하고 성능도 좋게 만들 방안을 찾는다.
  7. 데이터가 크면 메모리 부족 에러를 아주 많이 볼 것이다. 이미지의 경우 numpy로 만들어 로딩하여 쓰다 보면 그리고 data type을 float로 변환하면 엄청나게 증가한다. 미리 메모리에 로딩하지 말고 필요한 만큼. 일정 크기만큼 불러서 처리하고 결과 저장하고를 반복하여 메모리 부족을 방지해야 한다. 전처리 후 이미지 크기도 크게 영향을 받는다. 이미지가 너무 작으면 성능이 떨어질 것 같고, 너무 크면 학습도 어렵고 메모리도 부족할 것 같다.
  8. EarlyStopping을 사용하여 멈출 때를 정한다. metric을 평가 방식에 맞게 설정한다. (loss, acc, f1_score 등)
  9. Checkpoint 저장. 중간 중간 best를 계속 저장하도록 한다.
  10. 테크닉?
  • 이미지 전처리를 바꿔본다. 크기, Margin추가, 색상, color scale, … cut-out (이미지 일부를 삭제), normalize, …
  • Image Augument Generator로 학습 데이터를 늘린다. zoom, shift, rotation, shear, flip, brightness, …
  • Pre-Trained Model 변경 : xception, efficientnet, resnet, …
  • Dropout 추가
  • Train/Validation 비율 변경 / 샘플링 기법 변경 : oversampling, straitifiedKFold, …
  • ReduceLROnPlateau 적용
  • Cross Validation : 결국 모든 학습데이터를(validation 포함) 훈련하게 되는 방식으로 학습데이터가 많아서 결과도 더 좋아진다.
  • 앙상블 : 여러 네트웍의 결과를 보고 판단. (5% 정도 올랐음)
  • TTA : 시험시에 시험 이미지에 Augument를 가해서도 측정해 보고 그 결과를 반영해 본다. (0.2% 올랐음)
  1. 몇 개의 폴드로 나눠서 폴드 번호를 지정하고 학습할 수 있는 스크립트를 만들고, 커널에 올려 돌린다. 이 커널을 Fork하여 폴드 번호를 바꿔가면서 계속 커널을 만들어 commit한다. 동시에 4개까지 model을 만들 수 있을 것이다.
  2. model들을 다운 받아 모델 데이터셋을 만든다.
  3. 모델들을 합쳐 앙상블 결과를 내는 스크립트를 만들어 돌린다.
  4. 마지막에 TTA를 추가해 본다.
  5. pseudo labeling 적용 테스트. (효과가 있을지는 모르겠다.)

용어

  • val ; validation. 검증용 데이터. 모델 학습시에는 모델은 검증 데이터를 전혀 본적없는 데이터이다.
  • k fold ; train, val 셋을 분리하는데, k개의 다른 방식으로 데이터를 나눈다. 따라서 fold별로 하나씩 모델을 만들 수 있다.(k개의 모델 생성 가능). 나중에 생성된 모델들을 합친다(? 앙상블한다는 의미인가?)
  • stratifiedkfold ; kfold를 할 때, 원본 데이터의 클래스 비율을 유지하여 분리한다.
  • oversampling / undersampling ; stratified하는 것 대신, 샘플 수를 고르게 맞추는 방식이다. over는 많은 개수 기준. under는 부족한 개수 기준.
  • tta ; 학습시가 아닌 테스트시에 augmentation을 하여 앙상블 결과를 내놓는다.
  • cross validation ; 학습이 다 끝나면 나중에 validation data도 학습한다.
  • 앙상블 ; 여러 다른 모델의 결과를 합친다. (? 합치는 방식이 여러가지 일 듯. average, max count)
  • pseudo label ; 어느정도 성능이 나온 훈련모델로 test셋의 결과를 예측하여 99% 가량 강하게 맞다고 한 데이터의 라벨을 가상으로 붙여 훈련셋에 추가한다. 훈련데이터 개수 확장 효과.
  • cut-out image ; 이미지에서 랜덤하여 자름. 랜덤한 영역의 블록을 잘라버림. (노이즈)
    -했다면 했다고 할 수 있다.

Car model classify

문제는 자동차 모델명을 분류하기.
학습 이미지 데이터와 라벨이 있고 더구나 Bounding box도 있어서 도전해 볼만 했다. 근데 클래스가 상당히 많았다. 정확도가 높게 나오지 않을 것 같은데…라는 생각이 들었다. 그러나 나중에 보니 다른 참가팀들의 정확도에 놀랐을 뿐이다.

Try1 ; 70%

  • mobilenetv2

전에 한 번 구글이미지 검색으로 동물들 데이터셋을 만들어 이미지 분류 테스트를 해봤었는데 단순한 몇 개 클래스 구분하는 것도 만만한 일이 아니란 걸 알았다.
나름대로 CNN을 활용하여 Sequential 모델로 만들어봤지만 쉽사리 정확도가 높아지지 않았다는 기억이 났다.
그 때 데이터량의 부족, 학습이 안되는 현상, 과적합 현상 등 어려움이 많았다.
나중에 이미지 분류에 미리 학습된 모델들을 활용한 전이학습이 있다는 것을 보고 적용해 보니 손쉽게 정확도가 높아지는 것을 보았다.

  • 데이터 전처리
    • 이미지 crop 하고 resize, RGB 3 channel로 보정
  • mobilenetv2 사용
    • 뒤에 Dense1개, Softmax1개 사용

Test 데이터셋으로 accuracy가 70% 정도??

  • 나중에 알고보니 image color를 rescale하지 않았었다. 수정 완료. rescale=1/255로 color값을 [0,1] 범위로 함.

Try2 ; 80%

  • ImageAugumentation 으로 학습 데이터 확장. 좌우반전. 사이즈. 뒤틀림 등.
    mobilenetv2에 Dense 2개, Softmax1개 사용
    정확도 80%로 향상됨.

Try3.v1 ; 80%

training set의 정확도가 99%가 넘는데, validation은 80%였다.

  • Cross Validation?
    훈련 데이터셋 부족으로 데이터셋 재분배하여 test set, validation set으로 나누어 이어서 학습.
    training , validation set 모두 90% 이상 나옴. 그러나 학습이 계속되면 train은 99% val은 79정도로 떨어짐. test set은 80%로 여전함.
  • OOM이 자주 발생해서 고생함. batch_size 줄임. 네트웍 사이즈 줄임. 더 이상 필요없는 변수들 삭제.

Try4.v2 ; 81%

이미지의 일부를 지워서 학습??
Image part Random Remove ; resnet에 있다는 모듈을 적용시도.
ImageAugment ; shift 추가.
성능이 약간 좋아졌으나 별차이 없는 정도. 이론상 좋은 듯 한데.
lb acc 81%

Try5.v3 ; More Deep ; 83%

  • xception

원래는 Resnext50을 사용하고 싶었으나, keras 버전이 오래된 거라서 그런지 지원이 안된다.

  • 학습전이 모델 변경. mobilenetv2에서 xception으로. 파라미터수가 5배는 차이난다. 400만개 vs 2천2백만개.
  • 처음부터 다시 학습. 시간이 오래 걸림.
  • 모델은 처음부터 freezing하지 않고, 어느 정도 학습 한 후에 전이 모델만 freezing한다. 처음부터 freezing하니 정확도가 잘 안올라갔다. freezing을 풀고 학습하니 빠르게 상승하였다. 20~30에폭만에 train 80%, val 70%가 나온다. 어떤 경우는 전이모델의 상단 일부만 freezing하기도 한다.
  • train 93%, val 82% 정도까지 나옴.
  • 위 모델 2개를 만들고 병합하니 lb 83% 정도 나옴.
  • 더 학습 시킬 필요가 있어서 모델3을 생성 중. EarlyStopping 조건을 변경하여 더 오래학습되도록 patience를 증가. delta는 더 작게.

Try6. v3 ; metrics ; 91.5%

EarlyStopping 조건이 중요하다. f1_score를 조건으로 주고, 이어서 학습하되. 전이모델은 weight freezing시켰음.

  • 평균 80에폭정도 학습.
  • train 97%, val 85% 정도 나옴.
  • 데이터셋 구간을 달리하여 (cross validation) 모델 3개를 생성.
  • 개별 최대는 lb 86.8% 로 올라감.
  • 세 모델을 앙상블했더니 무려 5%나 상승하여 LB 91.58%. 드디어 90대 진입.
  • 그런데 개별로도 그 정도 나와야 되지 않나?

Try7.v4 ; 92.7%

개선해야 될 점.

  • 모델 세 개를 하나씩 불러 예측하려니 시간이 많이 소요됨. 웨이트만 저장하여 불러쓰는 것으로 하자. (이렇게 해봤는데 속도 차이가 거의 없음???)
  • weight는 best_only로 checkpoint를 저장하는 방식 사용. (monitor에 val_f1_score, mode는 max로 지정해야 함)
  • 3개를 만들어 앙상블 ; 92% (LB)

Try8. v5 ; 93.5%

  • 5개의 fold로 데이터 구분하여 새로 학습하고 5개를 앙상블해 보자.

More or Stop?

  • 일단, 현재까지 버전 commit.
  • 좀 더 올릴 수 없을까?
  • 이미지 전처리에서 crop할 때 margin을 추가할까?
  • 이미지 일부 제거 기능을 끄는 것이 좋을까?
  • 일괄 처리로 모델 5개 생성해서 다시 시도?
  • 전이학습 모델을 다른 것으로 변경해 볼까?

Try v6

  • 이미지 crop시 마진 20픽셀 추가. 이미지 왜곡시에 덜 잘릴 듯.
  • 이미지 일부 삭제 기능(cut-out)은 off 시키니까 acc 2% 감소.
  • 이미지 일부 삭제 기능이 있는 것이 좋다!

Try v7

  • 이미지 일부 삭제 on ; 반드시 사용해야 겠다.
  • 마진도 사용하는 것이 좋을 것 같다.

Try v8

  • xception과 resnet50 모델을 각각 5개씩 만들고 val_f1_score가 높은 순서대로 5개를 골라서 합의.
  • 합의 방식 ; 기존 : np.sum(a,b, axis=0)
  • 최대,최소를 버리고 중간 판정자 점수 합계??? 테스트 필요.
    • minv = np.min(…), maxv = np.max(…), np.sum() - (minv+maxv)
  • xception이 가장 괜찮은 것 같다. resnet50은 느리고 학습이 잘 안됨. mobilenetv2는 되긴 하지만 성능이 좀 떨어진다. efficientnetb2도 학습이 잘 안됨.
  • xception만으로 구성하는 것이 가장 낫다는 결론.
  • xception 모델 5개를 앙상블하면 개별로는 f1_score가 85,86,87 정도인데, 합치면 92 정도로 올라간다. (5%정도 인상)
  • Pseudo Labeling??? xception 모델에서 성능이 가장 좋은 것을 선정하여 test셋을 예측하였고, 예측시 가장 높은 확률의 클래스의 확률값을 히스토그램으로 보니, 0.99 이상이 반 정도 나왔다. 0.99 이상으로 예측한 라벨을 맞다고 가정하여, test 셋에서 라벨을 할 수 있는 부분들을 추출하여 pseudo set을 만들었다.
  • train set에 pseudo set을 추가하여 학습할 데이터를 뻥튀기하여 학습!
  • xception 모델에서 성능이 가장 좋은 것을 선정하지 않고, 앙상블하여 판단한 결과를 사용하였다. (더 확률이 올라감)
  • 90% 이상 정도는 맞출 것이고, 그 중 상위 50% 정도를 추가 학습데이터로 한 것이-라 어느 정도 일리가 있다.
  • 이렇게 훈련셋을 증가하고 기존 개별 모델들은 연속 학습하니, 개별 모델들의 f1 score가 더 올라갔다. 대략 85,86,87에서 94,95,96 정도로.(10%인상?) 이것을 다시 앙상블 한다면?
  • 결론은… 92. TT
  • 마지막에 1epoch만 all set을 대상으로 학습. 약간의 보정???
    -stratifiedkfold 적용. fold 나눌 때 클래스 비율을 유지해준다고 한다.

Try9

  • 이미지 크기 확장. 왜 224x224로 했지?(처음했던 mobilenetv2 기준). 299x299로 확장.(xception기준). 아무래도 이미지가 커야 더 잘 구분하겠다.
  • xception 베이스 모델 사용. : 기존 유지
  • cut out image (일부 손실. 자름. 검은 박스 노이즈 추가) : 기존 유지
  • 마진 20픽셀 유지하고 resize.
  • straitifiedkfold 적용. fold5으로 모델 3개 생성
  • pseudo label 삭제.
  • 진행. 먼저 single model의 성능부터 파악하자. 앙상블은 나중에.
  • 기존은 개별이 85정도 val f1 score 였다.
  • 메모리 사용량 증가로 batch는 16으로 낮춤. 나중에는 4로 낮춤.
  • Augument parameter!
    • rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, horizontal_flip=True, vertical_flip=False, shear_range=0.5, brightness_range=[0.5, 1.5], fill_mode=‘nearest’, preprocessing_function=get_random_eraser(v_l=0, v_h=255)
    • 현재 진행 중인 것은 rotation은 15. 나머지는 0.1. brightness 추가. 이하 상동.
  • 메모리 부족… OOM. 메모리 부족 관련하여 좀 더 분석해야 할 것 같다.
    • 가공한 이미지를 numpy로 저장하여 불러서 다시 나누어 사용했는데, 이게 메모리 부족을 야기시키는 것 같다. 아예 처음부터 가공된 이미지를 디렉터리별 저장하고 kfold시 index로(파일명)으로 폴드에 맞는 이미지들만 로딩하여 사용하는 것이 좋은 것 같다.
    • 전체를 다 로딩하여 나누지 말고, Generator에서 디렉터리 지정하고, from dataframe으로 필요한 파일명 목록을 주는 방식으로 로딩.
    • 미처 다 못해보고 컴피티션이 종료됨.
    • 개발 환경이 좀 아쉽다. 캐글 커널로 좀 더 컴팩트하게 테스트할 수 있도록 준비가 필요할 것 같다.
    • 랜덤 고정 필요. 계속 변경되면 기준이 없어서 모델의 평가가 어렵다.

After… 94.1%

  • 다른 Pretraining Model 적용 비교
  • 이미지 전처리 결과를 numpy로 하지 않고, 이미지 파일로 저장하여 데이터셋 생성 및 로딩 방식으로 함.
  • flow_from_dataframe을 사용.
  • 이미지 크기를 299에서 250으로 줄였더니 메모리 압박에서 벗어났다.
  • Dropout 추가 : 개별로 최고 90%도 찍는다. (val_f1_score) 대략 89,90정도가 나옴.
  • Fold를 6개로 늘림.
  • 6개 네트웍 앙상블 결과 93.9%대가 나옴.
  • TTA 추가 ; 단순하게 좌우 flip만 하였다. 0.2%상승하여 94.1%대가 나옴. (최종적으로 12개의 결과를 합쳐서 평균으로 판단한 결과)

못해본 것 들…
다른 기본 네트웍 사용.
gray scale image 로 학습하는 것은 어떨까?
contour image 로 학습하는 것은 어떨까?

kaggle command

download kaggle api token (account menu)
copy to ~/.kaggle from ~/downloaddir/kaggle.json
chmod 600 ~/.kaggle/kaggle.json

kaggle competitions list -s titanic
kaggle competitions download titanic
데이터 파일 다운로드

kaggle kernels list --user junheeshin
kaggle kernels pull junheeshin/titanic-analyze
커널 소스 파일 가져옴.

Authors: crazyj7@gmail.com

'AI(DeepLearning)' 카테고리의 다른 글

[ChatGPT] 글쓰기 테스트  (1) 2023.02.09
XGBoost 요약  (0) 2019.12.06
Custom EarlyStopping  (0) 2019.11.11
타이타닉 kaggle 자료 분석  (0) 2019.08.23
Jupyter Lab/ TensorBoard 원격접속/방화벽  (1) 2019.08.09
반응형
derivative_br_71

71. ddxarctan(2x+3)\frac{d}{dx}arctan(2x+3)

ddxarctan(2x+3)=11+(2x+3)2(2x+3)=24x2+12x+10=12x2+6x+5 \begin{aligned} &\frac{d}{dx}arctan(2x+3)\\ &=\frac{1}{1+(2x+3)^2}(2x+3)'\\ &=\frac{2}{4x^2+12x+10}=\frac{1}{2x^2+6x+5} \end{aligned}


72. ddxcot4(2x)\frac{d}{dx}cot^4(2x)

ddxcot4(2x)=4cot3(2x)(cot(2x))=4cot3(2x)(csc2(2x))(2x)=8cot3(2x)csc2(2x) \begin{aligned} &\frac{d}{dx}cot^4(2x)\\ &=4cot^3(2x)(cot(2x))'=4cot^3(2x)(-csc^2(2x))(2x)'\\ &=-8cot^3(2x)csc^2(2x) \end{aligned}


73. ddxx21+1x\frac{d}{dx}\frac{x^2}{1+\frac{1}{x}}

ddxx21+1x=ddxx2x+1x=ddxx3x+1=3x2(x+1)x3(x+1)2=2x3+3x2(x+1)2 \begin{aligned} &\frac{d}{dx} \frac{x^2}{1+\frac{1}{x}}=\frac{d}{dx} \frac{x^2}{\frac{x+1}{x}}=\frac{d}{dx} \frac{x^3}{x+1}\\ &=\frac{3x^2(x+1)-x^3}{(x+1)^2}=\frac{2x^3+3x^2}{(x+1)^2} \end{aligned}


74. ddxex/(1+x2)\frac{d}{dx}e^{x/(1+x^2)}

ddxex1+x2=ex1+x2(x1+x2)=ex1+x2(1+x2)x(2x)(1+x2)2=ex1+x21x2(1+x2)2 \begin{aligned} &\frac{d}{dx}e^{\frac{x}{1+x^2}}=e^{\frac{x}{1+x^2}} (\frac{x}{1+x^2})'\\ &=e^{\frac{x}{1+x^2}} \frac{(1+x^2)-x(2x)}{(1+x^2)^2}\\ &=e^{\frac{x}{1+x^2}} \frac{1-x^2}{(1+x^2)^2}\\ \end{aligned}


75. ddx(arcsinx)3\frac{d}{dx}(arcsinx)^3

ddx(arcsinx)3=3(arcsinx)211x2=3(sin1x)21x2 \begin{aligned} &\frac{d}{dx}(arcsinx)^3=3(arcsinx)^2\frac{1}{\sqrt{1-x^2}}\\ &=\frac{3(sin^{-1}x)^2}{\sqrt{1-x^2}} \end{aligned}


76. ddx12sec2(x)ln(secx)\frac{d}{dx}\frac{1}{2} sec^2(x) – ln(secx)

ddx12sec2(x)ln(secx)=sec(x)sec(x)tan(x)1sec(x)sec(x)tan(x)=sec2(x)tan(x)tan(x)=(sec2x1)tanx=tan3x \begin{aligned} &\frac{d}{dx}\frac{1}{2} sec^2(x) – ln(secx)\\ &=sec(x)sec(x)tan(x)-\frac{1}{sec(x)}sec(x)tan(x)\\ &=sec^2(x)tan(x)-tan(x)=(sec^2x-1)tanx\\ &=tan^3x \end{aligned}


77. ddxln(ln(lnx)))\frac{d}{dx}ln(ln(lnx)))

ddxln(ln(lnx)))=1ln(ln(x))(ln(ln(x)))=1ln(ln(x))1ln(x)(ln(x))=1xln(x)ln(ln(x)) \begin{aligned} &\frac{d}{dx}ln(ln(lnx)))\\ &=\frac{1}{ln(ln(x))}(ln(ln(x)))'=\frac{1}{ln(ln(x))} \frac{1}{ln(x)}(ln(x))'\\ &=\frac{1}{xln(x)ln(ln(x))} \end{aligned}


78. ddxπ3\frac{d}{dx}\pi^3

ddxπ3=0 \begin{aligned} &\frac{d}{dx}\pi^3=0\\ \end{aligned}


79. ddxln[x+1+x2]\frac{d}{dx}ln[x+\sqrt{1+x^2}]

ddxln[x+1+x2]=1x+1+x2(1+2x21+x2)=1x+1+x21+x2+x1+x2=11+x2 \begin{aligned} &\frac{d}{dx}ln[x+\sqrt{1+x^2}]\\ &=\frac{1}{x+\sqrt{1+x^2}}(1+\frac{2x}{2\sqrt{1+x^2}})\\ &=\frac{1}{x+\sqrt{1+x^2}} \frac{\sqrt{1+x^2}+x}{\sqrt{1+x^2}}\\ &=\frac{1}{\sqrt{1+x^2}} \end{aligned}


80. ddxarcsinh(x)\frac{d}{dx}arcsinh(x)

ddxarcsinh(x)=11+x2y=arcsinh(x),x=sinh(y)=eyey22x=eyey2dx=eydy+eydy=dy(ey+ey)dydx=2ey+ey=1coshy(cosh2xsinh2x=1,coshx=1+sinh2x)1coshy=11+sinh2y=11+(eyey2)2=11+(2x2)2=11+x2Alt.dydx=2ey+eyx2=e2y+e2y24=e2y+e2y+241x2+1=(ey+ey2)2dydx=11+x2 \begin{aligned} &\frac{d}{dx}arcsinh(x)\\ &=\frac{1}{\sqrt{1+x^2}}\\ & y=arcsinh(x), x=sinh(y)=\frac{e^y-e^{-y}}{2}\\ & 2x=e^y-e^{-y} \\ & 2dx = e^ydy+e^{-y}dy=dy(e^y+e^{-y})\\ & \frac{dy}{dx}=\frac{2}{e^y+e^{-y}}=\frac{1}{coshy}\\ &(cosh^2x-sinh^2x = 1, coshx=\sqrt{1+sinh^2x})\\ &\frac{1}{coshy}=\frac{1}{\sqrt{1+sinh^2y}}=\frac{1}{\sqrt{1+(\frac{e^y-e^{-y}}{2})^2}}\\ &=\frac{1}{\sqrt{1+(\frac{2x}{2})^2}}=\frac{1}{\sqrt{1+x^2}}\\ &\\ & Alt.\\ & \frac{dy}{dx}=\frac{2}{e^y+e^{-y}}\\ & x^2=\frac{e^{2y}+e^{-2y}-2}{4}=\frac{e^{2y}+e^{-2y}+2}{4}-1\\ & x^2+1 = (\frac{e^y+e^{-y}}{2})^2\\ & \frac{dy}{dx}=\frac{1}{\sqrt{1+x^2}} \end{aligned}



Author: crazyj7@gmail.com

'Math' 카테고리의 다른 글

Derivative100 [91-100]  (0) 2019.12.12
Derivative100 [81-90]  (0) 2019.12.12
derivative100 [61-70]  (0) 2019.11.19
derivatie100 [51-60]  (0) 2019.11.18
D operator  (0) 2019.11.07

+ Recent posts