Kers의 모형으로 추론할 수 있는 frugaly-deep을 사용해 보세요.

개시하다


나는 C++가 헤더만 있는 라이브러리를 매우 좋아하기 때문에 종종 다양한 취미로 라이브러리를 검색하지만, flagily-deep이라는 라이브러리를 찾았기 때문에 시험해 보았다.

flagily-deep 소개


https://github.com/Dobiasd/frugally-deep
  • 현대 순수 C++로 작성된 작은 제목만 사용하는 프로그램 라이브러리
  • 간편한 통합 사용
  • Functional Plus, Eigen, json에만 의존하고 이것도 헤더
  • 에 의존한다.
  • 순서모델뿐만 아니라 함수 API로 만들어진 더 복잡한 토폴로지 계산도에 대한 추론(모델.predict)
  • 도 지원한다.
  • TensorFolow의 (소형) 서브집합을 다시 실현하였으며, 예측에 필요한 조작
  • 을 지원하였다.
  • 링크된 TensorFolow보다 훨씬 작은 바이너리 크기
  • 32비트로 컴파일된 실행 파일도 동작
  • 시스템에서 가장 강력한 GPU는 무시하고 예측당 하나의 CPU 코어만 사용합니다. -)🤔
  • TensorFolow에 비해 한 개의 CPU 핵도 상당히 빨라서 여러 개의 예측을 병행할 수 있다.CPU를 최대한 활용하면 애플리케이션/파이프의 전반적인 예측 처리량을 높일 수 있습니다.
  • 이렇게 다소 자학적인 창고가 있다.이전에 글을 쓴 Genann은 ANSIC에서 사용할 수 있는 프로그램 라이브러리이지만,fragily-deep은 C++입니다.
    https://zenn.dev/mattn/articles/b43444214e06f3

    활용단어참조


    Frugally-deep의 장점 중 하나는 Kers 모형을 사용할 수 있다는 것이다.실제로 커스가 만든 HDF5 출력 파일을 JSON으로 변환해 JSON을 활용하는 방법이다.피즈버즈 모형을 만들어 보세요.
    import numpy as np
    
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Activation
    from tensorflow.lite.python import lite
    
    
    def fizzbuzz(i):
        if i % 15 == 0:
            return np.array([0, 0, 0, 1]).astype(np.float32)
        elif i % 5 == 0:
            return np.array([0, 0, 1, 0]).astype(np.float32)
        elif i % 3 == 0:
            return np.array([0, 1, 0, 0]).astype(np.float32)
        else:
            return np.array([1, 0, 0, 0]).astype(np.float32)
    
    
    def bin(i, num_digits):
        return np.array([i >> d & 1 for d in range(num_digits)]).astype(np.float32)
    
    
    trX = np.array([bin(i, 7) for i in range(1, 101)])
    trY = np.array([fizzbuzz(i) for i in range(1, 101)])
    model = Sequential()
    model.add(Dense(64, input_dim=7))
    model.add(Activation('tanh'))
    model.add(Dense(4, input_dim=64))
    model.add(Activation('softmax'))
    model.compile(
        loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    model.fit(trX, trY, epochs=3600, batch_size=64)
    model.save('fizzbuzz_model.h5')
    
    7개 요소인 원핫의 입력과 출력 4개 요소의 모델을 학습한다.실행 후 생성fizzbuzz_model.h5됩니다.flaglly-deep 창고의 keras_export/convert_model_py를 사용하여 다음과 같이 변환합니다.
    $ python keras_export/convert_model.py fizzbuzz_model.h5 fizzbuzz_model.json
    
    안에 있는 걸 살짝 봤는데 무게 부분이 BASE64 바이너리로 바뀐 것 같아.

    이용하다


    Kers에서 생성한 모델에서 변환된 JSON 파일을 사용하려면 다음 코드를 준비하십시오.
    #include <vector>
    #include <iterator>
    #include <algorithm>
    #include <fdeep/fdeep.hpp>
    
    static std::vector<float>
    bin(int n, size_t digits) {
      std::vector<float> ret;
      for (auto i = 0; i < digits; i++) ret.push_back((float)((n >> i) & 1));
      return ret;
    }
    
    static int
    dec(const std::vector<float> d) {
      auto it = std::max_element(d.begin(), d.end());
      return std::distance(d.begin(), it);
    }
    
    int
    main() {
      const auto model = fdeep::load_model("fizzbuzz_model.json");
      for (auto i = 1; i <= 100; i++) {
        const auto result = model.predict(
            {fdeep::tensor(fdeep::tensor_shape(static_cast<std::size_t>(7)),
            bin(i, 7))});
        switch (dec(result[0].to_vector())) {
          case 0: std::cout << i << std::endl; break;
          case 1: std::cout << "Fizz" << std::endl; break;
          case 2: std::cout << "Buzz" << std::endl; break;
          case 3: std::cout << "FizzBuzz" << std::endl; break;
        }
      }
    }
    
    위에서 말한 바와 같이fraglly-deep는FunctionNalPlus와 nlohmanne/json에 의존하기 때문에 구축 과정에서 아래의Makefile을 준비하는 것이 좋다.
    SRCS = \
    	fizzbuzz.cxx
    
    OBJS = $(subst .cxx,.o,$(SRCS))
    
    CXX = clang++
    CXXFLAGS = -std=c++20 \
    	-I c:/dev/frugally-deep/include \
    	-I c:/dev/FunctionalPlus/include \
    	-I c:/dev/nlohmann_json/include \
    	-I c:/msys64/mingw64/include/eigen3
    LIBS = 
    TARGET = fizzbuzz
    ifeq ($(OS),Windows_NT)
    TARGET := $(TARGET).exe
    endif
    
    .SUFFIXES: .cxx .o
    
    all : $(TARGET)
    
    $(TARGET) : $(OBJS)
    	$(CXX) -o $@ $(OBJS) $(LIBS)
    
    .cxx.o :
    	$(CXX) -c $(CXXFLAGS) -I. $< -o $@
    
    clean :
    	rm -f *.o $(TARGET)
    
    머리만 있고 구축할 때 일정한 시간과 기계 출력이 필요하다.실행하면 익숙해진 결과가 표시됩니다.
    1
    2
    Fizz
    4
    Buzz
    Fizz
    7
    8
    Fizz
    Buzz
    11
    Fizz
    13
    14
    FizzBuzz
    16
    
    케어스에서 HDF5 모형을 뱉어내면 쉽게 이용할 수 있어서 편한 것 같아요.

    총결산


    Kers의 모형을 사용할 수 있는 C++의 머리만 있는 머신러닝 라이브러리, frugaly-deep을 소개했다.이번에는 피자버즈처럼 간단한 예지만 성능도 좋고 이미지 데이터만큼 큰 입력 데이터를 처리하는 것도 어렵지 않다.관심 있는 사람이 도전해보는 게 어때요?

    좋은 웹페이지 즐겨찾기