import tensorflow.compat.v1 as tf
import numpy as np
import random
import time
import matplotlib.pyplot as plt


tf.disable_v2_behavior()
 

tf.set_random_seed(777)  # for reproducibility

from tensorflow.examples.tutorials.mnist import input_data


# Check out https://www.tensorflow.org/get_started/mnist/beginners for
# more information about the mnist dataset
mnist = input_data.read_data_sets("D:/Downloads/", one_hot=True)

sizeof_x = 784
nb_classes = 10
nb_branch = 256
epoch = 15
batch_size = 100
alg = 4
val_keep_prob = 1.0


num_iterations = int(mnist.train.num_examples / batch_size)



x_data = tf.placeholder(tf.float32, [None, sizeof_x])
y_data = tf.placeholder(tf.float32, [None, nb_classes])
keep_prob = tf.placeholder(tf.float32)



if alg == 0 :
    print("Using single network.. softmax + GradientOptimizer")
    W1 = tf.Variable(tf.random_normal([sizeof_x, nb_classes]), name="weight1")
    B1 = tf.Variable(tf.random_normal([nb_classes]), name="bias1")
    logits = tf.matmul(x_data, W1) + B1
    H = tf.nn.softmax(logits)
     
    cost = tf.reduce_mean(-tf.reduce_sum(y_data * tf.log(H), axis=1))
    train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

if alg == 1 :
    print("Using single network.. softmax + AdamOptimizer1")
    W1 = tf.Variable(tf.random_normal([sizeof_x, nb_classes]), name="weight1")
    B1 = tf.Variable(tf.random_normal([nb_classes]), name="bias1")
    
    logits = tf.matmul(x_data, W1) + B1
    H = tf.nn.softmax(logits)
 
    cost = tf.reduce_mean(-tf.reduce_sum(y_data * tf.log(H), axis=1))
    train = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)

if alg == 2 :
    print("Using single network.. softmax + AdamOptimizer2")
    W1 = tf.Variable(tf.random_normal([sizeof_x, nb_classes]), name="weight1")
    B1 = tf.Variable(tf.random_normal([nb_classes]), name="bias1")

    H = tf.matmul(x_data, W1) + B1
    
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=H, labels=y_data))
    train = tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost)

elif alg == 3:
    print("Using neural network.. relu + AdamOptimizer")
    W1 = tf.Variable(tf.random_normal([sizeof_x, nb_branch]), name="weight1")
    B1 = tf.Variable(tf.random_normal([nb_branch]), name="bias1")
    
    W2 = tf.Variable(tf.random_normal([nb_branch, nb_branch]), name="weight2")
    B2 = tf.Variable(tf.random_normal([nb_branch]), name="bias2")
    
    W3 = tf.Variable(tf.random_normal([nb_branch, nb_classes]), name="weight3")
    B3 = tf.Variable(tf.random_normal([nb_classes]), name="bias3")
    
    L1 = tf.nn.relu(tf.matmul(x_data, W1) + B1)
    L2 = tf.nn.relu(tf.matmul(L1, W2) + B2)
    H = tf.matmul(L2, W3) + B3
    
    # cross entropy
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=H, labels=tf.stop_gradient(y_data)))
    train = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
  

elif alg == 4:
    nb_branch = 512
    val_keep_prob = 0.7
    
    print("Using Deep neural network.. dropout")
    W1 = tf.Variable(tf.random_normal([sizeof_x, nb_branch]), name="weight1")
    B1 = tf.Variable(tf.random_normal([nb_branch]), name="bias1")
    W2 = tf.Variable(tf.random_normal([nb_branch, nb_branch]), name="weight2")
    B2 = tf.Variable(tf.random_normal([nb_branch]), name="bias2")
    W3 = tf.Variable(tf.random_normal([nb_branch, nb_branch]), name="weight3")
    B3 = tf.Variable(tf.random_normal([nb_branch]), name="bias3")
    W4 = tf.Variable(tf.random_normal([nb_branch, nb_branch]), name="weight4")
    B4 = tf.Variable(tf.random_normal([nb_branch]), name="bias4")    
    W5 = tf.Variable(tf.random_normal([nb_branch, nb_classes]), name="weight5")
    B5 = tf.Variable(tf.random_normal([nb_classes]), name="bias5")
    
    L1 = tf.nn.relu(tf.matmul(x_data, W1) + B1)
    L1= tf.nn.dropout(L1, keep_prob=keep_prob)
    L2 = tf.nn.relu(tf.matmul(L1, W2) + B2)
    L2= tf.nn.dropout(L2, keep_prob=keep_prob)
    L3 = tf.nn.relu(tf.matmul(L2, W3) + B3)
    L3= tf.nn.dropout(L3, keep_prob=keep_prob)
    L4 = tf.nn.relu(tf.matmul(L3, W4) + B4)
    L4 = tf.nn.dropout(L4, keep_prob=keep_prob)
    H = tf.matmul(L4, W5) + B5
    
    # cross entropy
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=H, labels=tf.stop_gradient(y_data)))
    train = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)
    

is_correct = tf.equal(tf.argmax(y_data, 1), tf.argmax(H, 1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))


sess = tf.Session()
sess.run(tf.global_variables_initializer())

for e in range(epoch):
    avg_cost = 0
    for it in range(num_iterations):
        x_batch, y_batch = mnist.train.next_batch(batch_size)
        val_cost, acc, _ = sess.run([cost, accuracy, train], feed_dict={x_data:x_batch, y_data:y_batch, keep_prob:val_keep_prob})
        avg_cost = avg_cost + val_cost / num_iterations
        
    print("Epoch: {:04d}, Cost: {:.9f}".format(e + 1, avg_cost))
    
print("training finished")


val_keep_prob = 1.0
print("Accuracy: ", accuracy.eval(session=sess, feed_dict={x_data: mnist.test.images, y_data: mnist.test.labels, keep_prob:val_keep_prob}))

for i in range(1):
    r = random.randint(0, mnist.test.num_examples - 1)
    label= sess.run( tf.argmax( mnist.test.labels[r:r+1], 1 ))
    image= mnist.test.images[r:r+1]
    predict= sess.run(tf.argmax(H, 1), feed_dict={x_data: image, keep_prob:val_keep_prob})
    print("{} {} Label={} Predict={}".format(i, label==predict, label, predict))
    plt.imshow(image.reshape(28, 28),        cmap="Greys",
        interpolation="nearest"
        )
    plt.show()
    time.sleep(3)

나님을 위해 향후 잊어먹을경우를 위해 기억을 저장해 둔다.

WIN10에서 아나콘다로 tensorflow를 설치한 경우이다.

본인과 설치 환경이 다를 수 있으므로 안된다고 묻지 마세요.

 

Tensorflow로 MNIST 테스트 하려고 하는데 다음과 같은 오류로 에러가 발생하면서 안될 때 해결 방법을 설명한다.

 

 

input_data라고 하는 녀석을 찾을 수 없다고 하는데...

아나콘다로 설치하면 tensorflow.examples.tutorials 폴더 내 mnist폴더 조차 없다.

아나콘다 환경 설정에서도 설치할 수 없었다.

그래서 나는 수동 설치 했다.

즉, input_data.py 파일을 직접 수동으로 다운로드 해서 tensorflow의 해당 경로에 설치하도록 한다.

 

 

1. input_data.py 파일이 있는 github 소스 페이지로 이동.

   [input_data.py 파일 위치로 바로 가기]

 

2. Raw 파일 버튼을 눌러서 파일 내용을 열람한다.

3. 파일 내용을 복사하고 메모장을 열어 붙여넣기 한 후 input_data.py라는 파일 이름으로 저장한다.

    저장 후 나중에 찾기 쉽도록 "바탕화면"에 저장한다.

 

 

4. 윈도 탐색기를 실행하고 Tensorflow가 설치된 위치로 이동한다.

위 폴더 위치가 바로 아래 코드의 examples 위치이다.

from tensorflow.examples.tutorials.mnist import input_data

tensorflow가 바로 tensorflow_core 폴더와 같다.

나머지 examples는 examples 폴더와 같다.

그렇다면 나머지 tutuorials와 mnist 폴더를 만들고 그 밑에 input_data.py 파일을 집어넣으면 되겠다.

 

 

5. 폴더 만들고 input_data.py 파일 집어넣기.

 

6. 이제 소스 실행하면 문제 없이 실행된다.

 

 

Happy hacking~!

VPN 자동 트리거 기능 추가하기

 

1.  시작 Menu 버튼 클릭 => PowerShell 입력

2. Windows PowerShell 앱에서 오른 마우스 클릭 후 팝업 메뉴 창에서 관리자 권한으로 실행 클릭

3. PowerShell 창에 다음을 입력:

Add-VpnConnectionTriggerApplication-Name CANITPRO –ApplicationID C:\Windows\Notepad.exe

참고: "CANITPRO"라고 된 내용을 이미 설정된 VPN 연결 이름으로 바꾸셔야 합니다. 그리고 앞으로 호출할 ApplicationID에 프로그램 경로도 적어줘야 합니다.

 

4. VPN 자동 트리거 기능을 활성화 하는데 뭐 물어보면 Y 를 입력합니다.  

5. 다음 명령어를 입력함으로 터널링 분리 기능을 활성화 한다.

Set-VpnConnection -Name CANITPRO -SplitTunneling $True

참고: 터널링 분리는 윈도우가 자동 트리거된 VPN을 통해 모든 네트워크 트래픽이 라우팅되는것을 강제로 못하도록 한다. 다만 VPN을 자동 트리거하는 응용프로그램의 데이터만 가능하도록 한다.
 

6. 또한 다음 명령을 입력하여 IDLE(유휴) 연결 해제 시간을 설정하는 것이 좋다.

Set-VpnConnection –Name CANITPRO –IdleDisconnectSeconds 10

참고: 응용 프로그램을 닫은 후 10 초 후에 VPN 연결이 자동으로 끊어진다. 필요에 따라 시간 값을 변경한다.
 

7. 완료되면 다음 명령을 입력하여 자동 트리거가 활성화되었는지 확인한다.

Get-VpnConnection -Name CANITPRO

 

 

 

 

자동 트리거 VPN기능 제거하기
 
다음 명령을 입력하면 초기 설정 응용 프로그램에서 VPN 자동 트리거를 제거 할 수 있다.

Remove-VpnConnectionTriggerApplication -Name CANITPRO –ApplicationID C:\Windows\Notepad.exe

제거 확인을 위해 묻는 창에서 "Y"를 입력하도록 한다.

참고: CANITPRO 라는 글자를 기존에 설정한 VPN 연결 이름으로 꼭 바꿔야 한다. 그리고 호촐할 ApplicationID에 반드시 프로그램 경로를 입력한다.

+ Recent posts