반응형
CustomEarlyStop

Custom EarlyStopping

EarlyStop 클래스는 학습을 조기 종료시킬 때 사용한다. 학습을 무조건 많이 시킨다고 성능이 좋아지는 것은 아니다. 오히려 과적합이 발생하여 실제 테스트 데이터에 적용시 성능이 떨어질 수 있다.
따라서 어느정도가 적합한지를 자동으로 측정하는 역할을 한다.

EarlyStopping

keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, 
verbose=0, mode='auto', baseline=None, restore_best_weights=False)

Arguments

  • monitor : 모니터링 대상. loss, val_loss, score, val_score, val_f1_score 등 메트릭 정보를 입력한다.
  • min_delta : 최소 감지 변화량을 의미한다. 이 값보다 적은 변화는 변화(개선)가 없다고 인식한다.
  • patience : 인내할 횟수. monitor 값의 변화 감지가 개선되는 쪽으로 patience 횟수만큼 연속으로 없을 경우, 학습을 Stop하게 된다. 예를 들어 loss가 1.0이었는데, 10번 연속으로 1.0 이하로 떨어지지 않으면 학습을 중지한다. (patience=10일때) 성능은 매 epoch마다 항상 좋아지지 않고 약간 들쭉날쭉하면서 좋아지는 경향들이 있다. 이 값이 너무 커지면 학습을 너무 오래할 수 있고, 너무 작으면 너무 일찍 학습이 종료될 수 있다.
    따라서 Checkpoint와 함께 사용하여 best 상태를 항상 기록하도록 설정하는 것이 좋다.
  • baseline : monitor 값이 도달할 기본값. baseline을 넘어 개선이 이루어 지지 않으면 학습을 중지한다. (이 파라미터는 잘 안쓴다.)
  • restore_best_weights: monitor 값의 최상치일때의 weights들로 복원한다.

Custom EarlyStopping

위 EarlyStopping을 좀 수정하여 처음 100 에폭은 무조건 학습하고, 100에폭이 넘으면 그 때부터 EarlyStopping을 사용하고 싶을 때 아래와 같이 만들 수 있다.
(StackOverflow 참고)

class CustomStopper(keras.callbacks.EarlyStopping):
    def __init__(self, monitor='val_loss',
                 min_delta=0, patience=0, verbose=0, 
                 mode='auto', start_epoch = 100): # add argument for starting epoch
                super(CustomStopper, self).__init__()
                self.start_epoch = start_epoch
                
    def on_epoch_end(self, epoch, logs=None):
            if epoch > self.start_epoch:
                    super().on_epoch_end(epoch, logs)

Author: crazyj7@gmail.com

반응형
hotkey_eclipse

HotKey Eclipse

  • 이클립스 단축키는 변경가능하여 가장 좋은 것은 설정에서 단축키를 찾는 것이 가장 정확하다.
    OS별로 다를 수 있음에 유의한다. Window , Mac , Linux 등.
    windows-preferences에서 Key로 검색
    Keys 화면내에서 검색하여 찾기
    예를 들면)
    comment : 주석관련
    find : 검색관련 , 다음 검색 등
    assist : 코드Assist (많이 찾는 Content Assist) 구조체 필드 확인, 메소드 목록 확인 등.
    import : 자동 import관련

빠르게 단축키를 보려면 ^+Shift+L 한 번 더 누르면 단축키 설정창을 띄운다. 다른 것 다 필요없고 이것만 기억해도 된다.

생각안나면 Ctrl+Shift+L 이것만 기억하자!!

+이클립스
-동일한 파일을 2개 창으로 보기
ctrl+{ ; 좌우로 보기 (ctrl+shift+{)
ctrl+_ ; 상하로 보기

-파일2개를 창2개로 보기
추가로 열 파일을 탭에서 드래그하여 원하는 윈도우 박스 위치에 놓는다.

컨쉽+O ; auto import
컨쉽+T ; 클래스 찾기
컨쉽+위/아래 ; 메소드 이동(위, 아래)
컨쉽+스페이스 ; 파라미터 보기
컨쉽+F ; 자동 코드 들여쓰기 정리. form feed.
컨+O ; 현재소스내에서 메소드나 필드로 이동 ; method
컨+T ; class tree보기/이동 상속관계 ; tree
컨+K ; 찾는 문자열 블록선택후, 연속으로 찾기. 반대방향은 쉽 추가.
컨+D ; delete line
컨+I ; auto indent (one line)

  • 가장 필요한 단축키.
    Code Assit
    추적
    돌아가기
    실행
    이전 커서위치로 이동.
    소스를 추적하여 쫒아가다가 다시 돌아갈 때 필요!!!

+요약
@+방향키 ; 이전 커서 위치로 이동!!! 소스추적하다가 되돌아갈때 필수!
^+Space ; 코드 파라미터 보기 (sysout 자동풀기) 리눅스에서는 @+/
^H ; 전체 검색
^K ; 다음 찾기. 이전찾기 ^+SHIFT+K
F3 or ^클릭 ; 추적 go to definition
^+F11 ; 실행
^F6 ; 이전 에디터창(소스).
^Q ; 소스 마지막 수정위치로 이동
^+SHIFT+/ ; 블록 주석처리
^+ / ; 주석처리
^+SHIFT+F ; 코드 정리

+이클립스(MAC)
(@대신Com)+방향키 ; 이전 커서 위치로 이동
(Com추가)+^+Space ; 코드 파라미터 보기
F3 or ^+클릭 ; 추적
(FN추가)+^+F11 ; 실행
^F6 ; 이전 에디터창(소스).
^Q ; 소스 마지막 수정위치로 이동
^H ; 전체 검색
^K ; 다음 찾기. 이전찾기 ^+SHIFT+K

단축키가 안먹는다면 다른 프로그램 단축키와 충돌이 났거나 다를 수 있어서 다른 단축키로 바꿔보자.
언제든 설정에서 원하는 단축키를 지정할 수 있고, 현재 단축키 설정도 확인 가능하니 처음에는 꼭 확인하는 것을 권장한다.

Author: crazyj7@gmail.com

'Develop > Java' 카테고리의 다른 글

gradle2 API server  (0) 2021.11.13
gradle1 기초  (0) 2021.11.13
Short URL(단축URL) API  (1) 2019.11.07
[JavaScript] 스탑와치 밀리초/StopWatch milliseconds  (0) 2019.08.27
Java RSA 간단한 비대칭키 암호 서명 검증 테스트  (0) 2019.08.14
반응형
Ether02coin

이더리움 개발 관련된 사항

알아야 될 것.

  • view 값을 가져오는 것은 가스 소모가 되지 않는다.
  • 코인 발행은 계약을 만든 사람만이 가능하다.
  • 코인 전송시에는 ID/PWD가 필요없다. 단지 이더리움 키쌍이 필요하다.

코인 만들기

image

pragma solidity ^0.5.0;

contract Coin {
    // The keyword "public" makes those variables
    // easily readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react to
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    constructor() public {
        minter = msg.sender;
    }

    function mint(address receiver, uint amount) public {
        require(msg.sender == minter);
        require(amount < 1e60);
        balances[receiver] += amount;
    }

    function send(address receiver, uint amount) public {
        require(amount <= balances[msg.sender], "Insufficient balance.");
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
}

가상 화폐(코인) 계약은 위와 같다. 정말 간단하다. 저렇게 간단한데, 코인 발행와 송금, 조회가 가능하다.

위 코드를 한 줄씩 읽어나가면 이렇게 된다.

코드 요약

  • 코인 발행자는 minter 라는 주소. (위 계약을 deploy할때 선택한 계정이 발행자가 된다. 중요하다.)
  • 주소마다 매핑된 balances가 있다. 즉, 주소로 코인 잔고 조회가 가능하다.
  • Sent는 이벤트로 송금이 완료되면 발생시키려고 만든 것이다. send 함수 마지막에 보면 호출한다.
  • 생성자(constructor)에서는 최초에 deploy시 사용자를 minter 발행자로 지정한다.
  • mint는 코인을 receiver로 amount 만큼 발행해 준다. (코인을 찍어서 준다.)
  • mint 조건을 보면 발행자만 mint를 사용할 수 있다. 금액 제한은 걸려있다. 수신자의 balances에 금액을 추가한다.
  • send는 코인 송금이다. 수신자 주소와 금액을 넣게 되어 있다.
  • send의 조건은 요청자(msg.sender)의 잔고 금액이 amount(송금금액)보다 커야 한다.
  • send에서는 송신자의 잔고에서 금액을 빼서 수신자의 잔고에 추가한다. 마지막에 송금완료 이벤트(Sent)를 발생시킨다.

저렇게 간단한 코드로 이 기능이 다 되는건가? 실제 테스트를 해 볼 수 있다.

테스트

  • deploy 계정 : 0xCA… (주소는 길기 때문에 여기서는 생략함)
  • balances에 위 계정을 입력하여 확인. 코인 잔고는 0으로 나옴.
    image
  • 나부터 코인을 찍어보자. 1000개.
    발행자만 가능하니 account는 0xCA… 로 설정하고,
    mint로 수신자 0xCA…, amount는 1000으로 해서 tranact 발생! 이후 다시 balances로 확인. 1000 코인이 발행되어 잘 들어왔다.
    image
  • 이제 다른 계정으로 발행해 보자. 계정을 0x147…로 바꿔서 mint를 해보니, 발행자 권한이 아니라 거부된다. 현재 잔고는 0으로 조회된다.
    image
    -원래 계정 0xCA에서 100원만 0x147한테 주자. 전송할때는 계정을 0xCA로 바꾼다음, send에 receiver와 amount를 입력하고 transact를 한다. balances조회하면 100 코인이 정상적으로 수신되었다. 0xCA로 balances를 조회하면 100코인이 줄어 900코인이 된 것을 확인할 수 있다.
    imageimage

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
[ether01] solidity 맛보기  (0) 2019.11.10
이더리움개발 환경 준비  (1) 2019.11.10

+ Recent posts