Giter VIP home page Giter VIP logo

wicwiu's Introduction

WICWIU(What I can Create, What I Understand)

  • WICWIU는 국내 대학 최초로 공개하는 딥러닝 오픈소스 프레임워크입니다.

  • WICWIU("What I Create, What I Understand.")라는 이름은 Richard Feynman의 "What I cannot create, I do not understand."에서 영감을 받아 지었습니다. "우리가 직접 만들며 이해한 딥러닝 프레임워크"라는 뜻입니다.

  • WICWIU는 모든 API가 C++로 제공되어 메모리 및 성능 최적화에 유리합니다. 또한, 응용시스템의 개발 외에도 프레임워크 자체를 특수한 환경에 맞도록 수정 및 확장이 가능합니다.

  • Custom Operator, 또는 Module 개발을 위한 API documentation은 추후 올리겠습니다.

  • WICWIU는 Apache2.0 라이선스를 적용해 연구 목적 및 상용 목적으로 제약 없이 활용 가능합니다.

WICWIU는 다음과 같은 내용을 지향하고 있습니다.

  • 다양한 신경망 계층 예시

  • 일반적인 그래프 형태의 네트워크 구조

  • 가독성 높은 저수준 연산의 CPU 코드

  • 높은 성능의 GPU 병렬 연산 (cuDNN)

  • 학습을 위한 한국어 문서 (준비중; 현재 한국어 주석 포함)

  • MNIST, CIFAR10, ImageNet tutorial 지원

WICWIU는 다음과 같은 환경을 지원하고 있습니다.

System
Linux CPU
Linux GPU
Windows CPU

WICWIU는 다음과 같은 요소들로 구성되어 있습니다.

Tensor & Shape Tensor 클래스는 최대 5차원의 Tensor Data를 저장, 관리하며 모든 신경망 연산은 Tensor에 대해 수행합니다. Tensor의 내부에는 모든 데이터를 1차원 배열의 형태로 저장하지만, Shape 클래스를 이용하여 외부로는 최대 5차원까지의 인터페이스를 제공하고 있습니다.
Operator Operator 클래스는 순전파와 역전파를 수행하는 저수준 연산을 포함하며, 각 연산의 결과 값을 각 객체의 멤버 변수로 저장하고 있는 클래스입니다. 저장된 결과는 연결된 다른 Operator나 Loss Function의 피연산자로 사용 가능합니다. 또한, 사용자는 Operator 클래스를 상속받아 새로운 연산자를 정의할 수 있습니다.
Module Module 클래스는 복잡한 신경망 모델을 Operator 클래스만을 이용하여 구현하는 것이 불편하여 만들어진 고수준 연산 클래스입니다. 복수의 Operator들을 그래프 구조로 조합하여 정의하며, Operator와 다른 Module와 재귀적 구조로 구성 가능합니다.
Loss Function & Optimizer Loss Function 클래스는 손실 함수를 표현하고, Optimizer 클래스는 경사도 벡터를 이용하여 파라미터를 최적화 하는 알고리즘을 표현하는 클래스입니다. WICWIU에서는 다양한 Loss Function과 Optimizer를 제공하고 있으며, 사용자가 직접 새로운 알고리즘을 정의 가능합니다.
Neural Network Neural Network 클래스는 신경망 모델을 표현하기 위한 클래스입니다. Operator와 Module를 조합하여 신경망 모델을 구성하고 모델 학습의 전반적인 기능을 제공하고 있습니다.

WICWIU를 사용하기 위해서는 다음 패키지들이 설치되어 있어야 합니다.

  • NVIDIA driver
  • cuda toolkit (tested on v.9.0)
  • cuDNN (tested on v7.0.5)

WICWIU는 다음과 같은 방법으로 설치하실 수 있습니다.

$ git clone https://github.com/WICWIU/WICWIU
$ cd WICWIU/tutorials/MNIST
$ make
$ ./main

CPU 동작을 원하시면 다음과 같은 방법으로 실행할 수 있습니다. (처음 받으시면 GPU로 환경설정이 되어 있습니다.)

$ cd WICWIU/
* makefile에서 ENABLE_CUDNN = -D__CUDNN__ 주석 처리
$ make
$ cd tutorials/MNIST
$ make
$ ./main

자세한 사용방법은 예제파일을 참고하여 주시고, 추후 자료를 보강하도록 하겠습니다.

WICWIU를 만들어가는 사람들을 소개합니다.

WICWIU는 한동대학교 학부생 주도로 개발되었습니다.

  • 한동대학교 전산전자공학부 김인중 교수님.
  • 1기: 박천명(팀장), 김지웅, 기윤호, 김지현
  • 2기: 최은서(팀장), 윤성결, 김승주, 오준석
  • 3기: 권예성(팀장), 윤동휘, 김경협, 전혜원
  • 4기: 신치호(팀장), 박참진, 오상진, 서진명, 오준석
  • 5기: 선한결(팀장), 한찬솔, 강예빈, 최하영
  • 6기: 오준석(팀장), 이찬효, 우옥균, 이세현
  • 7기: 선한결(팀장), 이현규, 안현재, 유수민, 이규석, 이요한

저희팀과 연락하고 싶으신 분들은?

프레임워크에 대해 궁금한 점이 있다면 [email protected] 로 연락하시길 바랍니다.

wicwiu's People

Contributors

callee2006 avatar ccss17 avatar chanhyolee avatar choieunseo avatar donghweeyoon avatar gy741 avatar hackryptic avatar handongmobile avatar hayeong0 avatar hgudeeplearning avatar joyfulbean avatar junseokoh1 avatar kikoo321 avatar kwonyeseong avatar ohcompany avatar rudguq439 avatar yoonseonggyeol avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wicwiu's Issues

Question about AnalyzeGraph in Module class

  1. preOp->Pop(out)
    preOp 포인터를 사용해서 m_apOutput이 가리키는 배열과 같은 것을 가리키도 있는 것으로 이해했습니다. (배열의 복사가 아닌 주소값을 가져오는 것으로 이해했습니다.) 그렇게 된다면 preOp->Pop(out)을 하면 preOp 가리키고있는 m_apOutput배열에서 out에 해당하는 Operator와의 연결을 끊는 것으로 해석이 됩니다. 이렇게 그래프의 구조를 바뀌는 것이 맞나요?...
  2. this->AnalyzeGraph(out)
    my_CNN에 있는 ConvolutionLayer2D class와 Linear class에서 각각 Alloc에서 this->AnalyzeGraph(out)을 호출하는 것으로 확인 했습니다.
    근데 my_CNN에서 맨 마지막에 AnalyzeGraph(out)을 호출합니다. 제가 이해한것은 각각의 class에서 analyzeGraph를 호출한 것은 큰 의미가 없고 my_CNN class에서 맨 마지막에 AnalyzeGraph(out)만 의미가 있으면 이때 정해지는 m_aaExcutableOperator와 m_apParameter 배열을 사용해서 학습하는게 맞나요???

GAN module debug list

GAN tutorials

  1. Add modules to make directories where generated images are saved
  2. Modifying image generating codes
  3. Debug the module works in CPU mode

Question about implementing RNN

RNN 구현관련 질문을 남깁니다.
먼저 my_CNN과 ConvolutionLayer2D을 비교하면서 RNN을 생각해보았습니다.

class my_CNN : public NeuralNetwork<float>{

my_CNN은 NeuralNetwork를 상속하고 있으며
template<typename DTYPE> class ConvolutionLayer2D : public Module<DTYPE>{

ConvolutionLayer2D는 Module을 상속하고 있습니다.

이와 마찬가지로 NeuralNetwork를 상속하는 my_RNN과 Module을 상속하는 RNNLayer를 만들 생각입니다.

근데 RNN 계산을 해주는 Operator가 필요한지에 대한 의견이 모이지 않아 이렇게 남깁니다.

  1. Without RNN operator
    사실 RNN 구현에 필요한 operator인 tanh와 MatMul이 이미 있기때문에 RNNLayer에서

    Tensorholder<DTYPE> *pWeight = new Tensorholder<DTYPE>(Tensor<DTYPE>::Random_normal(1, pNumOutputChannel, pNumInputChannel, pNumKernelRow, pNumKernelCol, 0.0, stddev), "Convolution2D_Weight_" + pName);

    위와 같이 Tensorholder를 만들어서 필요한 연산만 하면 됩니다. 이렇게 구현이 가능하다는 의견입니다.

  2. With RNN Operator
    MatMul과 tanh를 다 모아서 RNN 연산을 한번에 해주는 Operator를 만들자는 의견입니다.
    이 의견이 나온 가장 큰 이유는 cudnn입니다. cudnn 코드를 추가하기 위해서는 Operator에 있는 forward와 backward 함수가 필요하기 때문입니다.

2번째 안건입니다.
NeuralNetwork 단위를 1번으로 할지 2번으로 할지 문의 드립니다.

KakaoTalk_20190814_213622326

comment 남겨주시면 감사하겠습니다

Add va_end function in Operator.cpp

Hello.

I think, The following line 40/204 of Operator.cpp need va_end().

Because the va_end (ap) code outside the for is not executed by the return statement.

what do you think?

Thanks.

if (temp) {
this->AddEdgebetweenOperators(temp);
} else {
for (int j = i - 1; j > -1; j--) {
delete (*m_apInput)[j];
}
delete m_apInput;
m_apInput = NULL;
printf("Receive NULL pointer of Operator<DTYPE> class in %s (%s %d)\n", __FUNCTION__, __FILE__, __LINE__);
return FALSE;
}
}
va_end(ap);
return TRUE;

this->AddEdgebetweenOperators(temp);
} else {
for (int j = i - 1; j > -1; j--) {
delete (*m_apInput)[j];
}
delete m_apInput;
m_apInput = NULL;
printf("Receive NULL pointer of Operator<DTYPE> class in %s (%s %d)\n", __FUNCTION__, __FILE__, __LINE__);
return FALSE;
}
}
va_end(ap);

LossFunction debugging by cgdb

1

Why can't I access the 'Trian' function by 's'?

cgdb로 segmentation fault 잡으려고 하는데, 정확히 에러 나는 부분이 어디인지 확인하고 싶은데 s눌러도 함수 안으로 못 들어가네요.. 혹시 아시는 분 계신가요?

Please consider logger for printing log message

WICWIU massively uses stdout to print log when executing programs.
However, this method usually considered inefficient way.
So, please consider the logger library to write a log in the future.

`BatchNormalize.h`에서 파라미터를 모두 저장하지 않는 문제

if (m_isChannelwise) {
m_batchSummaryCapacity = m_numChannel;
// m_aTenTotalMean = Tensor<DTYPE>::Zeros(1, 1, m_numChannel, 1, 1);
// m_aTenTotalVariance = Tensor<DTYPE>::Zeros(1, 1, m_numChannel, 1, 1);
m_pTenBias = Tensor<DTYPE>::Zeros(1, 1, m_numChannel, 1, 1);
m_pTenScale = Tensor<DTYPE>::Constants(1, 1, m_numChannel, 1, 1, 1);
m_aTenCachedMean = Tensor<DTYPE>::Zeros(1, 1, m_numChannel, 1, 1);
m_aTenCachedInvVariance = Tensor<DTYPE>::Zeros(1, 1, m_numChannel, 1, 1);
} else {
m_batchSummaryCapacity = m_numInputColumn;
m_pTenBias = Tensor<DTYPE>::Zeros(1, 1, 1, 1, m_numInputColumn);
m_pTenScale = Tensor<DTYPE>::Constants(1, 1, 1, 1, m_numInputColumn, 1);
m_aTenCachedMean = Tensor<DTYPE>::Zeros(1, 1, 1, 1, m_numInputColumn);
m_aTenCachedInvVariance = Tensor<DTYPE>::Zeros(1, 1, 1, 1, m_numInputColumn);

위에서 정의되는 m_pTenBiasm_pTenScale은 Save() 함수를 불렀을 때 저장되고, Load() 함수를 불렀을 때 복구되어야 합니다.

현재 코드는 이를 지원하지 않고 있으며, 아마 Save 함수를 따로 상속받아야 할 것으로 생각됩니다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.