MNIST 필기체 숫자 인식을 Single Layer Neural Network으로 구현해 봅니다.
- 필요한 package들을 import합니다.
- random seed를 설정합니다.
- 필기체 숫자 data를 얻어오는 함수를 정의합니다.
- 필기체 숫자 image를 그림으로 그려주는 함수를 정의합니다.
- 필기체 숫자 data를 읽어옵니다.
- 필기체 숫자 data의 내용을 살펴봅니다.
- x_data 필기체 숫자 image의 shape를 출력해 봅니다.
- x_data 필기체 숫자 image의 index 70~74를 출력해 봅니다.
- y_data 필기체 숫자 종류의 shape를 출력해 봅니다.
- y_data 필기체 숫자 종류의 index 70~74를 출력해 봅니다.
- x_data 필기체 숫자 image의 index 70~74를 그림으로 그려 봅니다.
정답
- 필기체 숫자 image, 필기체 숫자 종류를 넣어줄 placeholder를 x_input, y_input에 저장합니다.
$ x\_input= \begin{pmatrix} x_1^{(1)} & x_2^{(1)} & \cdots & x_{784}^{(1)} \\ x_1^{(2)} & x_2^{(2)} & \cdots & x_{784}^{(2)} \\ \vdots & \vdots & \ddots & \vdots \\ x_1^{(m)} & x_2^{(m)} & \cdots & x_{784}^{(m)} \end{pmatrix} $ $ y\_input= \begin{pmatrix} y_{(0)}^{(1)} & y_{(1)}^{(1)} & \cdots & y_{(9)}^{(1)} \\ y_{(0)}^{(2)} & y_{(1)}^{(2)} & \cdots & y_{(9)}^{(2)} \\ \vdots & \vdots & \ddots & \vdots \\ y_{(0)}^{(m)} & y_{(1)}^{(m)} & \cdots & y_{(9)}^{(m)} \\ \end{pmatrix} $
- 계산도중에 사용할 variable을 만들어서 weight_var, bias_var에 저장합니다.
$ weight\_var= \begin{pmatrix} w_{(0)1} & w_{(1)1} & \cdots & w_{(9)1} \\ w_{(0)2} & w_{(1)2} & \cdots & w_{(9)2} \\ \vdots & \vdots & \ddots & \vdots \\ w_{(0)784} & w_{(1)784} & \cdots & w_{(9)784} \\ \end{pmatrix} $ $ bias\_var= \begin{pmatrix} b_{(0)} & b_{(1)} & \cdots & b_{(9)} \end{pmatrix} $
- 필기체 숫자 종류를 추정하는 계산과정을 정의합니다.
tf.nn.softmax 설명$ \begin{aligned} logit&= \begin{pmatrix} b_{(0)} & b_{(1)} & \cdots & b_{(9)} \\ b_{(0)} & b_{(1)} & \cdots & b_{(9)} \\ \vdots & \vdots & \ddots & \vdots \\ b_{(0)} & b_{(1)} & \cdots & b_{(9)} \\ \end{pmatrix} + \begin{pmatrix} x_1^{(1)} & x_2^{(1)} & \cdots & x_{784}^{(1)} \\ x_1^{(2)} & x_2^{(2)} & \cdots & x_{784}^{(2)} \\ \vdots & \vdots & \ddots & \vdots \\ x_1^{(m)} & x_2^{(m)} & \cdots & x_{784}^{(m)} \end{pmatrix} \begin{pmatrix} w_{(0)1} & w_{(1)1} & \cdots & w_{(9)1} \\ w_{(0)2} & w_{(1)2} & \cdots & w_{(9)2} \\ \vdots & \vdots & \ddots & \vdots \\ w_{(0)784} & w_{(1)784} & \cdots & w_{(9)784} \\ \end{pmatrix} \\ &= \begin{pmatrix} b_{(0)}+\sum_{i=1}^{784}w_{(0)i} x^{(1)}_i & b_{(1)}+\sum_{i=1}^{784}w_{(1)i} x^{(1)}_i & \cdots & b_{(10)}+\sum_{i=1}^{784}w_{(10)i} x^{(1)}_i \\ b_{(0)}+\sum_{i=1}^{784}w_{(0)i} x^{(2)}_i & b_{(1)}+\sum_{i=1}^{784}w_{(1)i} x^{(2)}_i & \cdots & b_{(10)}+\sum_{i=1}^{784}w_{(10)i} x^{(2)}_i \\ \vdots & \vdots & \ddots & \vdots \\ b_{(0)}+\sum_{i=1}^{784}w_{(0)i} x^{(m)}_i & b_{(1)}+\sum_{i=1}^{784}w_{(1)i} x^{(m)}_i & \cdots & b_{(10)}+\sum_{i=1}^{784}w_{(10)i} x^{(m)}_i \\ \end{pmatrix} \end{aligned} $
- cost의 계산과정을 정의합니다.
tf.nn.softmax_cross_entropy_with_logits_v2 설명
- cost를 최소화시키는 operation을 AdamOptimizer으로 정의하여 train_step에 저장합니다.
- x_input, y_input, weight_var, bias_var, logit, y_output, cross_entropy, cost_output, train_step을 print로 출력해 봅니다. 모두 값이 보이지 않는 알아보기 힘든 결과가 출력됩니다.
- Tensorflow Session을 open합니다.
- step, cost, mini_batch, max_epoch를 초기화합니다.
- Gradient Descent를 사용하여 cost가 가장 작아지는 weight, bias들을 찾습니다.
- x_test_data 필기체 숫자 test data를 사용하여 추정한 필기체 숫자의 종류를 y_pred에 저장합니다.
- 필기체 숫자의 분류 정확도를 출력합니다.
- 잘못 분류된 필기체 숫자에 대한 정보를 y_wrong_class에 저장합니다.
- 잘못 분류된 필기체 숫자를 10개 그려봅니다.
정답
- 잘못 분류된 필기체 숫자 3개에서, 10가지 숫자 각각의 확률을 출력합니다.
- Tensorflow Session을 close합니다.
토론이 없습니다