2023년 8월 23일 수요일

밑바닥부터 시작하는 딥러닝 4장 simpleNet 클래스와 numerical_gradient 함수 분석

아래 소스에서 빨간색 사각형 부분을 보면



























람다 함수 f는 인수로 w를 받는데 실제로 사용을 하지않는다.
그리고 이 f 함수를 numerical_gradient 함수에 인수로 넘긴다.

그리고 numerical_gradient 함수를 보면























위와 같이 f(x) 를 호출하는데 f는 위에서 언급한 인수를 사용하지않는 람다 함수이므로
f(x) 를 호출해도 x 값은 사용되지않는다.

그러면 실제 numerical_gradient 함수는 어떻게 해서 편미분값 grad 를 구하는가를 따라가보면





























f 호출 -> simpleNet.loss 호출 -> simpleNet.predict 호출로 진행되는데
predict 함수에서 입력변수 x([0.6, 0.9])와 가중값 self.W 를 행렬곱을 한다.
여기서 self.W 는 numerical_gradient 함수에 인수로 넘긴 값인데 위에 위에 그림에서
numerical_gradient 함수의 인수 x에 해당한다.
파이썬에서 넘파이 배열은 call by reference 이므로 
x[idx] = float(tmp_val) + h
x[idx] = tmp_val - h 
와 같이 x[idx] 에 값을 대입하면 simpleNet 클래스의 인스턴스(net)의 멤버변수 W가 변경된다.

결국 

x[idx] = float(tmp_val) + h => W[idx] = float(tmp_val) + h
x[idx] = tmp_val - h => W[idx] = tmp_val - h

이므로 W에 h가 적용된 변환값이 들어가서 정상적으로 계산할 수 있다.


2023년 6월 16일 금요일

openssl 빌드

strawberry perl 설치

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=issell&logNo=220366548586 


openssl 빌드

윈도우 - https://cinrueom.tistory.com/8

리눅스 - https://www.lesstif.com/system-admin/openssl-compile-build-6291508.html


openssl 인증서 발급

https://www.lesstif.com/system-admin/openssl-root-ca-ssl-6979614.html


perl Configure VC-WIN64A shared --prefix=d:\MyProjects\OpenSSL\build\x64 --openssldir=d:\MyProjects\OpenSSL\build\x64\ssl


perl Configure VC-WIN32 shared --prefix=d:\MyProjects\OpenSSL\build\x86 --openssldir=d:\MyProjects\OpenSSL\build\x86\ssl

2023년 3월 14일 화요일

C# UI 쓰레드 새로 생성해서 폼 띄우기/닫기

 UI 쓰레드를 새로 생성해서 폼을 Show 하고 Close 하는 소스코드


   public partial class MainForm : Form  
   {  
     private static KeyboardForm keyboardForm = null;      
   
     private static void ThreadKeyboard()  
     {  
       keyboardForm = new KeyboardForm();  
   
       Application.Run(keyboardForm);  
       keyboardForm = null;  
     }  
   
     public static void OpenKeyboard()  
     {  
       if (keyboardForm != null) return;  
   
       Thread newThread = new Thread(new ThreadStart(ThreadKeyboard));  
       newThread.SetApartmentState(ApartmentState.STA);  
       newThread.Start();  
     }  
   
     public static void CloseKeyboard()   
     {  
       if (keyboardForm != null)  
       {  
         keyboardForm.BeginInvoke(new Action(() => { keyboardForm.Close(); }));  
       }  
     }  

2023년 3월 13일 월요일

automatic quick format command

입력 프롬프트 없이 한번에 퀵포맷하는 cmd 명령

format <드라이브명>: /FS:NTFS /Y /V:<볼륨이름> /Q

예) format d: /FS:NTFS /Y /V:Storage1 /Q

2023년 2월 23일 목요일

버추얼박스 느려졌을때 설정 변경

관리자 권한으로 cmd 실행 후 아래 실행 후 재부팅 

bcdedit /set hypervisorlaunchtype off 


원복하려면 아래 실행 후 재부팅

bcdedit /set hypervisorlaunchtype auto


hyper-v on 상태에서도 버추얼박스 정상동작 하려면 아래 설정




2023년 1월 25일 수요일

VC++ Unicode 와 MBSC 겸용으로 빌드시 MultiByteToWideChar/WideCharToMultiByte 함수 처리(리눅스 포함)

 VC++에서 Unicode/MBCS(Multi-Byte Character Set) 겸용으로 빌드시에 MultiByteToWideChar/WideCharToMultiByte 함수를 아래와 같이 처리하면 문제없이 빌드가 가능하다. 윈도우가 아닌 경우(리눅스 등)에도 빌드 처리가 된다.


#ifdef WIN32
#include <tchar.h>
#endif

#ifdef WIN32
#define STRNCPY _tcsncpy
#define STRLEN _tcslen
#ifdef UNICODE
#define MULTIBYTETOWIDECHAR MultiByteToWideChar
#define WIDECHARTOMULTIBYTE WideCharToMultiByte
#define SNPRINTF swprintf
#define SSCANF swscanf
#else
#define MULTIBYTETOWIDECHAR(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar) \
_snprintf(lpWideCharStr, cchWideChar, "%s", lpMultiByteStr)

#define WIDECHARTOMULTIBYTE(CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar) \
_snprintf(lpMultiByteStr, cbMultiByte, "%s", lpWideCharStr)

#define SNPRINTF _snprintf
#define SSCANF sscanf
#endif
#else
#define MULTIBYTETOWIDECHAR(CodePage, dwFlags, lpMultiByteStr, cbMultiByte, lpWideCharStr, cchWideChar) \
snprintf(lpWideCharStr, cchWideChar, "%s", lpMultiByteStr)

#define WIDECHARTOMULTIBYTE(CodePage, dwFlags, lpWideCharStr, cchWideChar, lpMultiByteStr, cbMultiByte, lpDefaultChar, lpUsedDefaultChar) \
snprintf(lpMultiByteStr, cbMultiByte, "%s", lpWideCharStr)

#define STRNCPY strncpy
#define STRLEN strlen
#define SNPRINTF snprintf
#define SSCANF sscanf

#define TCHAR char
#define TEXT(quote) quote
#define _T(quote) quote
#define __T(quote) quote
#endif

< 사용예 >
TCHAR filepathPrefix[260] = { 0 };
TCHAR fileExtension[260] = { 0 };

MULTIBYTETOWIDECHAR(CP_ACP, 0, m_szFilePathPrefix, sizeof(m_szFilePathPrefix), filepathPrefix, sizeof(filepathPrefix));

MULTIBYTETOWIDECHAR(CP_ACP, 0, m_szFileExtension, sizeof(m_szFileExtension), fileExtension, sizeof(fileExtension));

char filepathChar[256];
WIDECHARTOMULTIBYTE(CP_UTF8, 0, filepath, sizeof(filepath), filepathChar, sizeof(filepathChar), NULL, NULL);


2023년 1월 13일 금요일

vc++ 메모리 릭 감지

프로그램 시작 부분에 아래 코드 넣고 실행 후 정상종료하면 메모리릭 발생시 출력창에 메모리릭 출력 


#ifdef _DEBUG
#include <crtdbg.h>
#endif

int main()
{
#ifdef _DEBUG
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
#endif