기본 입자는 표준 모형으로 일목 요연하게 정리된다. 이 이론의 놀라운 점은 지독하게 수학적이라는 점이다(대부분의 물리 이론이 수학적이다). 표준 모형을 통해 물리학자는 우주가 얼마나 수학적인지 다시 한번 깨닫는다. ... 하늘과 바람과 별과 인간 중에서
1. 시작하면서
머신러닝을 공부하게 되면서 행렬과 미분이 알고리즘으로 사용된다는 것을 느끼면서, 전산의 역활이 과연 무엇일까 좌절 아닌 좌절을 하고 있을 때, 나름 위안을 삼았던 문구이다..
회귀분석에 사용되는 선형 방정식도, overfitting를 방지하기 위한 L2, L1 규제, 많은 데이타를 압축하기 위한 주성분 분석 등도 선형대수학에 나오는 개념들이다. 선형 대수학이 응용되는 사례는 그림1을 보자..
그림1. 선형대수학의 응용분야
혼자 공부하는 머신러닝/딥러닝을 공부하다가 나오다 마주치게 된 주성분 분석.... 목적은 차원 축소인데... 잘 이해가 안된다... 지금 보니 이해가 안되는 것이 당연하다.. 선형대수학의 마지막(??)에 나오는 이야기가 SVD 이다.. SVD를 이해하기 위해서는 소거법, 아이젠 벡터를 이해하고, 그것들이 단점을 이해해햐 하니....
그림 2는 선형대수학의 학습 순서이고, 이들의 제약사항이 기술 되어 있다. 우리의 데이타는 n*n도 아니고, 역치가 존재하지 않고, 대각행렬도 아닌 일반적인 데이타이니, SVD를 사용하게 된다... (...중간에 포기하지 마시라)
그림 2. 딥러닝을 위한 선형대수학
2. SVD의 응용 사례
3,024* 4,032Pixe의 데이타가 아래 그림과 같이 있다고 하자..
sigular vector를 1,2,4,8,16,32,64개 추가하였을때의 변화는 아래 그림과 같다.
PCA의 활용은 차원 축소라 이야기한다.. 행렬의 직관적인 의미는 음... 숫자 하나가 소인수 분해가 되어.. 인수를 찾듯이.. 행렬도 인수분해한다.. 행렬의 성격에 따라, eigen value, sigluar value라는 값으로 인수분해한다... 인수 분해 해서.. 인수를 활용한다 정도의 의미를 부여하면 되지 않을까...
(eigen ,, 독일어로 성질의 뜻.. sigular 영어의 성질의 뜻 내포..)
수학은 참으로 일반적이고 어려운 학문이다.. 나처럼 목적이 뚜렷한 사람에게 그 용도를 한정시키면 수학이 필요하구나 느끼고 재미 또한 느끼게 된다. 또한...이 어려운 것을 처음으로 활용한 선구자를 존경까지 하게 된다..
os마다 디렉토리 설정이 헷갈린다. 설치되어 있는 폰트위치를 확인하고 한글 폰트를 지정하는 법을 확인한다.
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits import mplot3d
import matplotlib.font_manager as mfm
# 설치된 폰트 및 디렉토리 확인
font_list = mfm.findSystemFonts(fontpaths=None, fontext='ttf')
font_list[:10]
# 구글 colab 환경일 경우 그래프에 한글 폰트 사용을 위한 설정
# path = 'noviceml/font/NanumBarunGothic.ttf'
# fontprop = mfm.FontProperties(fname=path, size=18)
# 로컬 환경일 경우 그래프에 한글 폰트 사용을 위한 설정
# https://financedata.github.io/posts/matplotlib-hangul-for-ubuntu-linux.html
# 아래 코드의 주석 제거 후 경로를 유저 컴퓨터의 폰트 파일 경로로 수정하세요.
# path = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
# fontprop = mfm.FontProperties(fname=path, size=18)
path = 'C:\\Windows\\Fonts\\NanumBarunGothic.ttf'
fontprop = mfm.FontProperties(fname=path, size=18)
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
#font.family에 설정
plt.rcParams['font.family'] ='Malgun Gothic'
나에게 설치된 font.family는 어떤것이 있는지 확인하는 코드
import matplotlib.font_manager
from IPython.core.display import HTML
def make_html(fontname):
return "<p>{font}: <span style='font-family:{font}; font-size: 24px;'>{font}</p>".format(font=fontname)
code = "\n".join([make_html(font) for font in sorted(set([f.name for f in matplotlib.font_manager.fontManager.ttflist]))])
HTML("<div style='column-count: 2;'>{}</div>".format(code))
3.폰트 캐쉬 삭제
폰트가 안보이면...캐쉬를 삭제해 보자..
import shutil
import matplotlib as mpl
print(f'캐시 디렉토리: {mpl.get_cachedir()}')
shutil.rmtree(matplotlib.get_cachedir())
시간은 빨리가도 월급날은 더디온다.. 혼공머신을 공부한 6주는 월급날 보다 더 긴 느낌이다. TT
책장속에 책을 볼 때다. 책을 주문할 때의 열정은 어디 갔는지.. 봐야지 봐야지 생각은 있는데... 내일 봐야지 내일 봐야지... 미루 둔 것이 어언 2년이 흘렀다. 작년 23년 6월에 본 혼공학습단 모집... 선정이 되었지만... 안했다...아니 못했다..
OO님, 혼공학습단 10기에 선정되신 것을 축하드립니다! 안내 사항을 확인해 주세요.
연말에 다시 모집 메일을 보면서..... 미안하면서도 이 번에 꼭 끝내리라 ... 1번의 공수표는 있어도 2번은 없다.. 맘 속 다짐을 한다.
[한빛미디어] OO님, 혼공학습단 11기에 오신 것을 환영합니다!
2. 시작하기전 내 맘속의 다짐.
다음 2가지를 꼭 실천하리라 다짐을 하고 시작을 하였다..
토요일 까지 학습한 것을 Posting 한다...이를 위해서는 금요일 부터 시작해야 한다.
쉴 때 못 쉬고,, 운동할 것 못하고,.. 시간을 내는 만큼 집중해서 보자..
지금까지 일 하듯..큰 뼈대를 먼저 잡은 후에 세부적인 내용은 천천히 이해하는 방식으로 진행을 하였다..
3. 공부 하면서 얻은 것
6번 금요일 또는 토요일 올리고.. 지각을 안했다!!!와우!!.... 아..나도 한다면 한다!!
미션을 하기 위해서 책을 열심히 봤다. 잘 이해안되는 것은 인터넷을 활용하여 어느 정도 이해가 될 수 있었다.
모델의 주요 개념, 모델의 속성을 이해했다.
책에 나온 소스의 주요 방법론을 이해했다.
Scikit-learn, numpy등의 라이브러리를 이해했다. numpy의 행렬변환이 어려웠었는데 많이 편해 졌다.
이해를 위해 책을 활용하여, 나름 확장하여 이것 저것 시험을 해봤다... Decision Tree의 Gini 계수 결정을 안 잊어버릴 것 같다..족장(리더)님의 열정에 자극 받아...아.... 해결했을 때의 쾌감!!!!
정리 글은 항상 책을 다 보고 머리에 정리해서 큰 클을 만들고, 필요 부분은 책을 보면서 정리를 해 나갔다..(나름 뿌듯!!)
4. 혼공 학습단에 참가하면서 얻은 것
족장님의 응원, 열정, 관심을 보면서 6주간을 학습한 것 같다
그 많은 혼공족의 게시글을 읽은 후에 답변을 다는 것을 보고 오!! 그대야 말로 정말 프로페셔널이군요... 그렇담 나도 열심히 해야 겠군... 생각하며 진행했던 것 같다.
4주차 Decision Tree를 학습하면서 올린 질문은 나름 같이 공부하는 혼공족과 고민을 하고 싶어서 올렸는데...족장님이 그렇게 애는 모습을 보면서... 포기하지 말고 찾아보고... 해결을 한 것이... 책을 보며 학습한 것보다 이번 혼공 학습단에 참가하면서 느끼고 배운 것이 컸군요... (당신이 갖고 있는 누군가의 관심이 큰 영향이 갈 수 있습니다.)
단순한 실수를 해결할 수 있었네요... softmax 함수를 정의하면서 혼자 왜 안되지 고민한 것을 discord에 문의하였더니 혼공족님의 도움으로 해결하였어요... 한참 고민했었는데.... ㅎㅎ.. 그러고 보니 해결해준 혼공족님에게 고마움의 표시를 못했네요..아... 칭찬의 방에 올려야 겠군요 ^^
다른 사람이 헷갈리면 나도 헷갈린다.
우연찬게 본 족장님의 게시글 pandas의 axis가 헷갈려요....나도 한때는 공부 했었는데...... 이렇게 보니... 저렇게 하면 되겠구나 했는데.... 곰곰히 보니 나도 헷갈린다... 아마도 사용할 때마다 블러그를 보고 그 때 그때 해결했던것 같군요..... 인터넷 뒤져서.. 나름 규칙을 만들고 정리했다...다음 차 공부할때 np에서 axis가 나왔다.. 역쉬 pandas나 np나 동일한 개념이였다...
처음 정리할 땐 나와 관련 없는 것인데 정리를 해 두니... 나도 잘 써 먹었다..
족장님이 쪽집게 처럼 모두가 어려워 할 문제를 이슈 제기를 잘 한 것 같다.. 이것도 고맙다..
생각을 정리하는 것이 어렵다.
머리속에 이해된 것을 글로 쓴다는 것이 어려움을 다시 느낀다..번역서를 읽으면 왜 이리 이해 안되게 어렵게 투덜 거렸는데... 나 역시 정리를 하면서 어려움을 느낀다...생각 정리를 블로그로 해야 하나? 고민중...
블로그/페북의 기능을 알아가다
그림 복사하기가 가능한 것을 알게 됨!!
블로그에 그림을 삽입할 때 항상 로컬PC에 저장한 다음에 올렸는데.... ... 요 기능 알고 나서는 유래카!!! 외침
서식쓰기 가능이 있다는 것을 알고 적용해서 사용해 봄.. 와우!!
페북 채팅이 별도 프로그램 설치 없이 가능하다는 것을 알게됨 (족장님은 DM이라고 하던데... )
5. 앞으로 계획
. 6주 학습기간에는 머신러닝은 이런거야를 배웠다면.. 맘에 품은 질문은 왜 이럴까? 어떻게 가능할까? 를 계속 진행할 예정입니다.
그래서 또 다른 머신러닝책은 구매 했고 읽을 공부할 예정이고,,, 수학은 아래 책을 볼까 생각중인데... 혹시 추천 책이 있을까요?? (아 이놈의 질문병..)
핸즈온 머신러닝 들어가기 전에,,, 수학적 기초 온라인으로 듣고 있습니다. 혼공머신이 마중물이 되어서 ML, 딥러닝, LLM을 더 많이 이해 하고 싶네요
0. 감사의 글
책상속에 묻힐 책을 꺼내어 학습 할 환경을 마련해 주셔서 감사합니다... 책을 통해서 알아가고 , 부족한 것을 느끼고, 또 찾아가려는 나를 흐믓하게 바라볼 수 있는 좋은 기회였습니다.
직장인이 기술 서적을 혼자 읽기에는 많은 한계가 있는데.. 학습단을 통해 한계를 극복 할 수 있었습니다.
경제적 지원을 해주시 출판사와 리딩 해 주신 족장님께 감사드립니다. 독자로서 이런 사회적 가치를 실천하는 출판사를 응원하게 됩니다.
딥러닝을 이해하기 위해 지금까지 머신러닝을 공부하였구나 생각이 드네요..문제종류(회귀, 이진,다항분류..), 손실함수, 하이퍼파라미터 등..
1. 기본 개념도. 2.TensorFlow 기본 사용법.3 책의 예제로 입력/출력층으로 구성된 모델 살펴보기. 4. 다중 레이어로 구성된 모델 살펴보기로 정리를 해봤어요..
(아... cheatSheet 중간에 있음)
정리를 하다 보니 앞 부분에서 대충 넘어간 부분들을 다시 살펴볼 필요가 있네요... 그래도... 다시 봐야 하고 중점적으로 봐야 할지 느끼네... 아직 안개속에 있지만 안개가 희미하게 거치는 느낌!!!ㅎ
책을 살때의 매직.... 읽고 안 읽고는 나중 문제다.. 읽고 난 후의 모습을 상상하며 책을 산다....필독!!!
1. 주요 딥러닝 개념도
인간의 뇌를 본뜬 Perceptrons.. .
중간층은 입력값과 적절한 웨이트를 조절하여 새로운 의미의 속성을 표현한다고 개념적으로 생각하자.
만약 데이타가 세로, 가로라면 사람은 크기를 유추할 수 있다.
만약 데이타가 집의 크기, 침대 수, 우편번호, 거주자의 연봉이 있다면... 우편번호와 연봉으로 학교의 등급을 표현할 수 있다...
노드의 결과가 다른 노드로 전달할때 얼마의 값 으로 전달해야 할까? 활성화 함수..
이 노드의 결과는 다른 노드에 반영하지 말아야 해...아니야... 0.3만 반영해... 그렇지 않아... 음수로 반영해.....
결과 값을 찾았는데... 찾은 값이 오류가 있다고 판단을 하면,, 찾은 값을 증가 시켜야 할까?? 감소 시켜야 할까??
순전파 : 주어진 데이타로 결과를 찾는 방향...순방향
역전파: 결과를 찾았으면, 오류를 수정하기 위해....가중치를 수정한다..... 역방향..
Hyperparameters
은닉층의 수, 노드의 수, 활성화 함수, batch_size는 상황에 따라 지정해야 할 하이퍼 파라미터
다만, 결과층의 활성화 함수는 문제에 따라 정해져 있다!!
옵티마이저 역시 하이퍼파라미터임!!
RMS,SGD등
860~1,000 억개의 신경세포와 100조개의 신호를 주고 받는 시냅스
노드 또는 뉴런을 원으로 표기
예를 들어, 0.2와 0.9 두 개의 입력 값으로 0.5라는 예측값을 도출하는 인공신경망 모델을 학습시키는 과정을 생각해보겠습니다. 아래 그림과 같이 입력층에는 2개의 노드가 할당되며 출력 층에는 1개의 노드가 할당됩니다. 그리고 은닉층은 1개이며, 은닉노드는 3개로 임의로 설정합니다. 여기서 은닉층과 은닉노드의 개수는 다수의 반복실험을 통해 사용자가 적절하게 설정해야 하는 값입니다
활성화 함수
문제에 따라 사용되는 활성화 함수와 손실 함수
2. Tensorflow 기초 사용법
모델 생성이 기존 머신러닝보다 복잡합니다. 레이어를 생성해야 하고, 활성화 함수를 지정해야 하고, loss 함수등을 지정해야 하는군요... 파란색으로 표기된 모델 생성과 학습부분을 세부 공부를 해야 겠군요.
import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense
#데이타 생성 data = np.random.random((1000,100)) labels = np.random.randint(2,size=(1000,1))
#전처리
#모델 생성 및 학습 model = Sequential() model.add(Dense(32, activation='relu', input_dim=100)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(data,labels,epochs=10,batch_size=32)
#예측 predictions = model.predict(data)
#평가
from sklearn import neighbors, datasets, preprocessing from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score
#데이터 생성 iris = datasets.load_iris() X, y = iris.data[:, :2], iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33)
#모델 생성 및 학습 knn = neighbors.KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train)
#예측 y_pred = knn.predict(X_test)
# 평가 accuracy_score(y_test, y_pred)
3. MNIST 패선 다중 클래스 분류
10종류의 60,000개의 그림을 분류 하는 예제. 하나의 그림은 28*28 크기의 2차원 데이타를 1차원으로 변환하여 사용함. 즉 그림 하나는 784 = 28*28 크기임
입력은 784, 히든 층 없이 결과층을 node=10로 만듭니다.
다중 클라스 분류이므로 sparse+categorical_crossentropy를 사용하고 출력층의 활성화 함수는 softmax를 사용합니다.
import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import *
# 실행마다 동일한 결과를 얻기 위해 케라스에 랜덤 시드를 사용하고 텐서플로 연산을 결정적으로 만듭니다.
tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()
#데이타 갖고 오기
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
#전처리...
#1. scaling
train_scaled = train_input / 255.0
#2. 데이타를 1차원으로 변경하기
train_scaled = train_scaled.reshape(-1, 28*28)
#데이타 사이즈 확인
print(f'데이타 크기 {train_scaled.shape}, 정답 크기{train_target.shape}')
# 학습/평가데이타 분류
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)
# 모델 생성
dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))
model = keras.Sequential(dense)
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
# 모델 요약 정보 조회
model.summary()
plot_model(model, show_layer_names=False, show_shapes=True)
#모델 학습
history= model.fit(train_scaled, train_target, epochs=5)
#모델 평가
model.evaluate(val_scaled, val_target)
입력에 대한 갯수가 없어 100개 입력을 했는지 확인해 보겠습니다. 출력을 보니 맞군요..
사용된 코드는 아래와 같습니다.
# 모델 생성
dense = keras.layers.Dense(10, activation='softmax', input_shape=(100,))
model = keras.Sequential(dense)
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')
# 모델 요약 정보 조회
model.summary()
# 모델 그림 그리기
plot_model(model, show_layer_names=False, show_shapes=True)
4. MNIST 패선 다중 클래스 분류 (다중 레이어)
하이퍼 파라미터인 은닉층 및 옵티마이저 추가하기
데이타가 28* 28 크기의 2차원 데이타를 Flatten Layer를 사용하여 2차원 데이타를 사용하기
3장에서는 np를 사용
import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import *
# 실행마다 동일한 결과를 얻기 위해 케라스에 랜덤 시드를 사용하고 텐서플로 연산을 결정적으로 만듭니다.
tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()
#데이타 갖고 오기
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()
#전처리...
#1. scaling
train_scaled = train_input / 255.0
#데이타 사이즈 확인
print(f'데이타 크기 {train_scaled.shape}, 정답 크기{train_target.shape}')
# 학습/평가데이타 분류
train_scaled, val_scaled, train_target, val_target = train_test_split(
train_scaled, train_target, test_size=0.2, random_state=42)
# 모델 생성
model = keras.Sequential()
##데이타를 1차원으로 변경하기
## train_scaled.reshape(-1, 28*28) 대신 Flatten()를 사용한다.
model.add(keras.layers.Flatten(input_shape=(28, 28)))
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))
## Optimizer를 사용한다.
sgd = keras.optimizers.SGD()
model.compile(optimizer=sgd, loss='sparse_categorical_crossentropy', metrics='accuracy')
# 모델 요약 정보 조회
model.summary()
plot_model(model, show_layer_names=False, show_shapes=True)
#모델 학습
history= model.fit(train_scaled, train_target, epochs=5)
#모델 평가
model.evaluate(val_scaled, val_target)