Go together

If you want to go fast, go alone. If you want to go far, go together.

전체 글 59

JAVA 제네릭 정리

어떤 자료 구조(클레스)를 만들어 배포할 때 지원하는 type(String, Integer 등)이 많아질 수록 구현해야하는 코드가 많아진다. 이를 Generic(제네릭)을 이용해 외부에서 사용자가 지정할 수 있도록 한다. Generic의 장점 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다. 클래스 외부에서 타입을 지정하기 때문에 타입을 체크하고 변환할 필요가 없다. 즉, 관리하기 편하다. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다. 타입을 다른 글자로 써도 아무런 문제는 없지만 용도를 표시하기 위해 암묵적으로 아래와 같이 쓴다. 타입 설명 Type Element Key Value Number 클래스 및 인터페이스 선언 public class ClassN..

JAVA 2022.03.13

하버드 MBA 출신들은 어떻게 일하는가?

투자 - (종결) 투자는 일정 금액 매달 하는 것이 좋다. 그리고 장기간 보유하는 것이 좋다. S&P 500같은 지수 펀드가 투자하기 좋은 곳이다. 협상 쟁점을 명확히 해라. tip은 아래와 같다. 유사 사례 찾기 지인·본인에게 묻고 경청해 듣기 BATNA는 최선의 대안이라는 뜻이다. BARNA를 이끌어내는 방법은 아래와 같다. 상대를 분석한다. 경쟁을 유발한다.(경쟁자를 만든다.) 합의 X시, 상대를 위협할 수 있는 사람·기관을 끌어들인다. 리프레이밍을 통해 나에게 불리한 상황의 관점을 달리해서 상황을 반전시키자. (담배-기도, 선거 사진- 스튜디오) 경청을 상대가 느낄 수 있을 정도로 하자. 구체적인 방법은 아래와 같다. 진심으로 경청하고 상대방이 이야기하는 동안 반박하지 않는다. 내가 이해한 것이 ..

백엔드 개발

의존성 주입은 한 클래스가 의존하는 다른 클래스를 주입하는 것이다. 생성자나 setter를 만들고, 인자로 객체를 전달한다. 유닛 테스트(클레스의 메서드 등의 동작 테스트)를 위해 Mock 클래스(테스트를 위한 기능만 가진)를 만들어 사용할 수 있다는 장점도 있다. 의존성 주입의 구현은 간단하지만, 주입할 클래스가 많아지면 객체를 생성할 때 코드가 복잡해질 수 있다. 이를 해결하기 위해 의존성 주입 컨테이너(Dependency Inject Container)를 사용할 수 있고, 컨테이너 중 하나가 바로 스프링 프레임워크이다. 스프링 프레임워크를 사용하면 어노테이션, XML, Java 코드를 이용해 오브젝트(bean이라고 부름) 간의 의존성을 명시할 수 있다. 그렇게 하면 앱 시작 시 스프링 프레임워크의 ..

ToDoList APP을 개발하기 전

프론트엔드 클라이언트를 반환하는 서버가 있다. 이 서버는 React.js 애플리케이션을 반환한다. 스프링 부트를 통해 백엔드 애플리케이션인 REST API를 구현한다. 이 API는 프론트엔드 애플리케이션이 사용한다. 프론트엔드와 백엔드를 분리하는 이유는 모바일 앱으로 만들 때 별도의 백엔드 개발 없이 이 REST API를 사용할 수 있다. 즉, 마이크로서비스 아키텍처로 서비스를 확장하는 데 용이하다. HTTP: 클라이언트-서버 간의 통신 방법 HTTP request로 브라우저에 URL을 입력하면, URL에 해당하는 서버로 HTTP GET 요청을 전송한다. 그 결과인 HTTP response를 브라우저에 렌더링(화면에 디스플레이)한다. HTTP request 요청에는 GET, POST, PUT, DELET..

19장 대규모 텐서플로 모델 훈련과 배포

텐서플로 모델과 나머지 시스템을 분리할 수 있습니다. 텐서플로 서빙 사용하기 tf.keras 모델을 TF 서빙으로 배포할 때 먼저 해야할 일은 모델을 SavedModel 포맷으로 내보내는 것입니다. model_version = '0001' model_name = 'my_mnist_model' model_path = os.path.join(model_name, model_version) # tf.saved_model.save() tf.saved_model.save(model, model_path) tf.saved_model.save() 함수에 모델, 경로를 전달하면 그 경로에 모델의 계산 그래프와 가중치를 저장합니다. model.save(model_path)를 사용할 수도 있습니다. CAUTION_ 더보기..

18장 강화 학습

이 장에서는 심층 강화 학습(deep reinforcement learning)에서 가장 중요한 기술인 정책 그래디언트(policy gradient)와 심층 Q-네트워크(deep-Q-networks, DQN)를 마르코프 결정 과정(Markov decision process, MDP)과 함께 소개합니다. 그 다음 최신 알고리즘을 매우 간단하게 구축할 수 있는 TF-Agents 라이브러리를 알아봅니다. 이 라이브러리를 사용해 유명한 아타리 게임인 브레이크아웃(Breakout)을 플레이하는 에이전트를 훈련합니다. 보상을 최적화하기 위한 학습 강화 학습에서 에이전트(agent)는 관측(observation)을 하고 주어진 환경(environment)에서 행동(action)을 합니다. 그 결과로 보상(reward..

이진 오토인코더를 이용한 해싱

인코더의 출력층을 sigmoid 함수로 해놓고 출력층 바로 뒤에 가우시안 잡음 층을 놓으면, 가우시안 잡음 층 바로 뒤에 있는 층의 출력이 커집니다. 잡음에 입력이 묻히지 않도록 하기 위해서 모델이 그렇게 학습합니다. 아마 이렇게 하면 이미지의 특성을 명확하게 표현하려고 하려나? 인코더의 출력층을 16개의 뉴런으로 하고, 출력값을 0과 1로 반올림하면 16비트의 '시맨틱 해시'를 얻습니다. 모든 것이 잘 수행되면 비슷한 이미지는 같은 해시를 가지게 됩니다. 이는 검색 엔진에 매우 유용합니다. 이미지의 시맨틱 해시에 따라 서버에 이미지를 저장하면 같은 서버에는 모두 비슷한 이미지가 저장될 것이고, 사용자가 탐색할 이미지를 전달하면 검색 엔진이 인코더를 사용해서, 전달된 이미지의 해시를 계산하고 이 해시에 ..

17장 오토인코더와 GAN을 사용한 표현 학습과 생성적 학습

autoencoder는 레이블되지 않은 훈련 데이터에서 잠재 표현(latent representation)을 학습할 수 있습니다. 일반적으로 잠재 표현은 입력보다 훨씬 낮은 차원을 가지므로 차원 축소, 특히 시각화에 유용하게 사용됩니다. 오토인코더는 DNN의 비지도 사전훈련에 사용될 수 있고, 일부 오토인코더는 훈련 데이터와 비슷한 새로운 데이터를 생성할 수 있습니다. 이를 생성 모델(generative model)이라고 합니다. 생성적 적대 신경망(generative adversarial networks, GAN)은 정말 리얼한 사람 얼굴을 생성합니다. (https://thispersondoesnotexist.com/) 침실을 생성한 이미지를 볼 수도 있습니다. (https://thisrentaldoe..

16장 RNN과 어텐션을 사용한 자연어 처리

우선 문장에서 다음 글자를 예측하도록 훈련하는 문자 단위 RNN(character RNN)부터 시작합니다. 새로운 텍스트를 생성하고 그 과정에서 매우 긴 시퀀스를 가진 텐서플로 데이터셋을 만드는 방법을 알아봅니다. 먼저, 상태가 없는 RNN(stateless RNN)을 사용하고 다음에 상태가 있는 RNN(stateful RNN)을 구축하겠습니다. 상태가 없는 RNN은 각 반복에서 무작위로 선택한 텍스트의 일부분으로 학습하고, 상태가 있는 RNN은 훈련 반복 사이에 은닉 상태를 유지하고 중지된 곳에서 이어서 상태를 반영합니다. 그래서 더 긴 패턴을 학습할 수 있습니다. 어텐션 메커니즘은 각 타임 스텝에서 모델이 집중해야 할 입력 부분을 선택하도록 학습하는 신경망 구성 요소입니다. 어텐션만 사용해 매우 좋은..