Windows10 + Visual Studio 2017 (VC14.1)로 테스트를 했다.

Python 3.7 + tensorflow 2.2 버전이다.

boost는 1.73.0 버전에 python numpy 포함해서 직접 컴파일 하였다.

 

파이썬에서 C++ 코드를 실행하는 2가지 방법이다.

1. C++에서 Base 클래스를 만들고 이를 파이썬에서 상속받아 클래스를 구현할때 C++에서 코드가 실행되게 하는 방법.

2. C++ 클래스에서 함수들을 만들고 파이썬에서 이를 실행하는 방법.

 

본인은 Windows10에 아나콘다 가상환경을 설정하지 않았다.

그래서 아나콘다 파이썬 기본 경로가 "C:\\ProgramData\\Anaconda3" 이다.

혹시 아나콘다 가상환경을 구성한 경우 각자 상황에 맞게 아나콘다 경로를 변경한다.

 

// Copyright Stefan Seefeld 2005.
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// Boost 기본 예제 boost_1_73_0\libs\python\example\quickstart의 코드.
// 컴파일해서 실행하는 경우 제대로 동작하지 않아 직접수정하여 나중에 쓸려고 올려놓음.

#include <boost/python.hpp>

#include <boost/detail/lightweight_test.hpp>
#include <iostream>

namespace python = boost::python;

// An abstract base class
class Base : public boost::noncopyable
{
public:
  virtual ~Base() {};
  virtual std::string hello() = 0;
};

// C++ derived class
class CppDerived : public Base
{
public:
  virtual ~CppDerived() {}
  virtual std::string hello()
  { 
	  return "Hello from C++!";
  }
};

// Familiar Boost.Python wrapper class for Base
struct BaseWrap : Base, python::wrapper<Base>
{
  virtual std::string hello() 
  {
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
    // workaround for VC++ 6.x or 7.0, see
    // http://boost.org/libs/python/doc/tutorial/doc/html/python/exposing.html#python.class_virtual_functions
    return python::call<std::string>(this->get_override("hello").ptr());
#else
    return this->get_override("hello")();
#endif
  }
};


// Boost 기본 예제 boost_1_73_0\libs\python\example\quickstart의 코드
namespace { // Avoid cluttering the global namespace.

  // A friendly class.
	class hello
	{
	public:
		hello(const std::string& country) { this->country = country; }
		std::string greet() const { return "Hello from " + country; }
	private:
		std::string country;
	};

	// A function taking a hello object as an argument.
	std::string invite(const hello& w) {
		return w.greet() + "! Please come soon!";
	}
}


// Pack the Base class wrapper into a module
BOOST_PYTHON_MODULE(embedded_hello)
{
  python::class_<BaseWrap, boost::noncopyable> base("Base");
}


BOOST_PYTHON_MODULE(extending)
{
	using namespace boost::python;
	class_<hello>("hello", init<std::string>())
		// Add a regular member function.
		.def("greet", &hello::greet)
		// Add invite() as a member of hello!
		.def("invite", invite)
		;

	// Also add invite() as a regular function to the module.
	def("invite", invite);
}



void exec_test1()
{
	// Retrieve the main module
	python::object main = python::import("__main__");

	// Retrieve the main module's namespace
	python::object global(main.attr("__dict__"));

	// Define the derived class in Python.
	python::object result = python::exec(
		"from embedded_hello import *        \n"
		"class PythonDerived(Base):          \n"
		"    def hello(self):                \n"
		"        return 'Hello from Python!' \n",
		global, global);

	python::object PythonDerived = global["PythonDerived"];

	// Creating and using instances of the C++ class is as easy as always.
	CppDerived cpp;
	BOOST_TEST(cpp.hello() == "Hello from C++!");

	std::cout << "testing derived class from C++..." << std::endl;

	// But now creating and using instances of the Python class is almost
	// as easy!
	python::object py_base = PythonDerived();
	Base& py = python::extract<Base&>(py_base) BOOST_EXTRACT_WORKAROUND;

	// Make sure the right 'hello' method is called.
	BOOST_TEST(py.hello() == "Hello from Python!");

	std::cout << "success!" << std::endl;
}


void exec_test2()
{
	// Retrieve the main module
	python::object main = python::import("__main__");

	// Retrieve the main module's namespace
	python::object global(main.attr("__dict__"));

	python::object result = python::exec(
		"from extending import *        \n"
		"hi = hello('California')         \n"
		"hi.greet() \n",
		global, global);

	python::object print = python::import("__main__").attr("__builtins__").attr("print");
	print(result);
}

void exec_test_error()
{
    std::cout << "intentionally causing a python exception..." << std::endl;
    
    // Execute a statement that raises a python exception.
    python::dict global;
    python::object result = python::exec("print unknown \n", global, global);

	python::object print = python::import("__main__").attr("__builtins__").attr("print");
	print(result);
}

int main(int argc, char **argv)
{
	BOOST_TEST(argc == 2);
	std::string script = argv[1];


	// Register the module with the interpreter
	if (PyImport_AppendInittab("embedded_hello", &PyInit_embedded_hello) == -1)
		throw std::runtime_error("Failed to add embedded_hello to the interpreter's "
			"builtin modules");

	if (PyImport_AppendInittab("extending", &PyInit_extending) == -1)
		throw std::runtime_error("Failed to add embedded_hello to the interpreter's "
			"builtin modules");


	// Initialize the interpreter
	Py_SetPythonHome(L"C:\\ProgramData\\Anaconda3");
	Py_Initialize();

	bool error_expected = false;

	if (
		python::handle_exception(exec_test1)
		|| python::handle_exception(exec_test2)
		)
	{
		if (PyErr_Occurred())
		{
			if (!error_expected)
				BOOST_ERROR("Python Error detected");
			PyErr_Print();
		}
		else
		{
			BOOST_ERROR("A C++ exception was thrown  for which "
				"there was no exception translator registered.");
		}
	}

	// Boost.Python doesn't support Py_Finalize yet, so don't call it!
	return boost::report_errors();
}

 

위의 코드를 실행하면 아래와 같은 결과가 나타난다.

출처: https://seanpaulskin.tistory.com/entry/부스트-라이브러리Boost-Library-VC과-MinGW-컴파일Compile-하기 [:: 스킨 테스트 블로그 :: HTML5 / XHTML / HTML / CSS]

 

 

1. 부스트 라이브러리 최신 버전이나 필요한 버전을 다운 받는다.

- 이 글 작성시 부스트 최신 버전 : 1_58_0 

부스트 공식 홈( http://www.boost.org ) 또는 

SourceForge 다운로드  http://sourceforge.net/projects/boost/files/

 

컴파일을 하지 않고 바로 사용 할려면 컴파일된 x32, 또는 x64 파일을 다운
http://sourceforge.net/projects/boost/files/boost-binaries/1.58.0/

Boost_1_58_0-bin-msvc-all-32-64.7z 1.3GB (x32, x64 비주얼 스튜디오 모든 버전 포함)

 

 

 

Visual Studio 2013 크로스 컴파일러를 설치하면  

여러 가지 커맨드 프롬프트 제공 합니다. ( Itanium 버전은 인텔의 개발 중지 발표로 생략)

 

x64 크로스 Tools 명령 프롬프트에서는 x86환경에서 x64 컴파일 가능.

x86, x64 네이티브에서는 각 각  x32 , x64 컴파일 가능.

 

*** 미리 컴파일된 버전을 사용하지 않고 직접 컴파일해서 사용 하고자 한다면 ***

Boost 라이브러리는 두가지 방법으로 컴파일 할 수 있는데,

1. 헤더 파일과 라이브러리를 생성하는 방법
2. 라이브 러리를 생성 하는 방법

처음 설치 한다면 헤더(Header)와 라이브러리(Library)가 필요 하므로 install 옵션을 쓰고 

추가적으로 라이브러리(Library)가 필요하다면 stage를 쓰면 됩니다.

 

 

부스트 라이브러리 루트 폴더에 boostrap.bat 실행해서 b2.exe와 bjam.exe를 생성 합니다.

2개다 같은 일을 하지만 여기서는 b2.exe으로 설명 합니다.

b2 [options] [properties] [install|stage]

VS 2013 기준(msvc-12.0), VS 2012 : msvc-11.0)

 

--stagedir (라이브러리 파일이 있는 stage 폴더내에 복사

--libdir을 지정 해주면 원하는 폴더로 복사( --libdir="C:\Boost\lib" )

--includedir 위 와 마찬가지( --includedir="C:\Boost\include" )

-j n - CPU 멀티 코어 사용 ( n : 코어 갯수 지정 )

 

x32 라이브러리

/MT, /MTd (멀티 스레드 릴리즈, 멀티 스레드 디버그) : 정적 라이브러리 생성( .LIB )

b2  --stagedir=stage32 --toolset=msvc-12.0 -j 4 runtime-link=static

 

/MD, /MDd (멀티 다이나믹, 멀티 다이나믹 디버그  ): 동적 라이브러리 생성( .DLL )

b2  --stagedir=stage32 --toolset=msvc-12.0 -j 4 runtime-link=shared

 

x64 라이브러리

/MT, /MTd (멀티 스레드 릴리즈, 멀티 스레드 디버그) : 정적 라이브러리 생성

b2  --stagedir=stage64 address-model=64 --toolset=msvc-12.0 -j 4 runtime-link=static

 

/MD, /MDd

b2  --stagedir=stage64 address-model=64 --toolset=msvc-12.0 -j 4 runtime-link=shared

 

컴파일 결과파일 이름(Naming) 규칙

- lib 접두사 - Win32에서 Static 라이브러리에 붙음.

- boost - 접두사 모든 파일 앞에 붙음.

- vc120 - 비주얼 스튜디오 버전별로( 2012 : vc110, 2010 : vc100 )

 

- mt - Shared 멀티 스레드용(multi-threading) 릴리즈 버전 

- mt-gd Shared 방식으로 멀티 스레드용(multi-threading) 디버그 버전

- mt-s Static 방식으로 릴리즈

- mt-sgd  Static multi-threading 디버그 버전

- 1_58 - 부스트 버전.

- .lib - 확장자

 


 

컴파일 예제 :

C:\Boost에 Visual Studio 2013버전 x32, x64 디버그, 릴리즈 

싱글, 멀티스레딩(정적, 동적 라이브러리)를 멀티코어 4개로 컴파일

 

b2  --libdir="C:\Boost\lib" --libinclude="C:\Boost\include"

 --toolset=msvc-12.0 variant=debug,release address-model=32,64 

threading=single,multi -j 4 runtime-link=static,shared

컴파일 결과 : C:\Boost\Lib, C:\Boost\Include 생성 lib 폴더내에 .lib, .dll 파일 생성




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에 반드시 프로그램 경로를 입력한다.

아래는 Keras에서 다운받은 데이터를 가지고 테스트 해봤음.

import tensorflow.compat.v1 as tf
import numpy as np
tf.disable_v2_behavior()



csv_data = np.loadtxt('D:\Downloads\winequality-red.csv', delimiter=',', dtype=np.float32)
x_data = csv_data[:1000:, 0:-1]
y_data = csv_data[:1000:, [-1]]

#print(x_data.shape, x_data,len(x_data))
#print(y_data.shape, y_data)
print("x_data = ", x_data.shape[0], x_data.shape[1])
print("y_data = ", y_data.shape[0], y_data.shape[1])

NUM_IN = x_data.shape[1]
NUM_OUT = y_data.shape[1]
NUM_CLASS= 10

X = tf.placeholder(tf.float32, shape=[None, NUM_IN])
Y = tf.placeholder(tf.int32, shape=[None, NUM_OUT])
Y_onehot = tf.one_hot(Y, NUM_CLASS)
Y_onehot = tf.reshape(Y_onehot, [-1, NUM_CLASS])
W = tf.Variable(tf.random_normal(shape=[NUM_IN,NUM_CLASS]), name='weight')
B = tf.Variable(tf.random_normal(shape=[NUM_CLASS]), name='bias')

logit = tf.matmul(X, W)+B
H=tf.nn.softmax(logit)
#cost = tf.reduce_mean(-tf.reduce_sum(Y_onehot*tf.log(H), axis=1))
cost_i = tf.nn.softmax_cross_entropy_with_logits(logits=logit, labels=Y_onehot)
cost = tf.reduce_mean(cost_i)
optimizer= tf.train.GradientDescentOptimizer(learning_rate=0.001)
train=optimizer.minimize(cost)


prediction = tf.argmax(H, 1)
correct_prediction = tf.equal(prediction, tf.argmax(Y_onehot,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


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

for step in range(10000):
    sess.run(train, feed_dict={X:x_data, Y:y_data})

loss,ac = sess.run([cost, accuracy], feed_dict={X:x_data, Y:y_data})
print("loss={:.3f}\t accuracy={:.2%}".format(loss, ac))


pred = sess.run(prediction, feed_dict={X:x_data})
for p, y in zip(pred, y_data.flatten()) :
    print( "[{}] P={} Y={}".format( p==int(y), p, int(y)))

 

 

아래는 "모두를 위한 딥러닝" 강좌의 예제.

http://hunkim.github.io/ml/

import tensorflow.compat.v1 as tf
import numpy as np
tf.disable_v2_behavior()



csv_data = np.loadtxt('D:\Downloads\data-03-diabetes.csv', delimiter=',', dtype=np.float32)
x_data = csv_data[:, 0:-1]
y_data = csv_data[:, [-1]]

#print(x_data.shape, x_data,len(x_data))
#print(y_data.shape, y_data)
print("x_data = ", x_data.shape[0], x_data.shape[1])
print("y_data = ", y_data.shape[0], y_data.shape[1])

NUM_IN = x_data.shape[1]
NUM_OUT = y_data.shape[1]

X = tf.placeholder(tf.float32, shape=[None, NUM_IN])
Y = tf.placeholder(tf.float32, shape=[None, NUM_OUT])
W = tf.Variable(tf.random_normal(shape=[NUM_IN,NUM_OUT]), name='weight')
B = tf.Variable(tf.random_normal(shape=[NUM_OUT]), name='bias')

H=tf.sigmoid(tf.matmul(X, W)+B)
cost = -tf.reduce_mean(Y*tf.log(H) + (1-Y)*tf.log(1-H))
optimizer= tf.train.GradientDescentOptimizer(learning_rate=0.001)
train=optimizer.minimize(cost)

predicted = tf.cast(H > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

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

for step in range(20000):
    out_cost, _ = sess.run([cost, train], feed_dict={X:x_data, Y:y_data})
    if step % 200 == 0 :
        print( "step=", step, " cost=", out_cost)

p, a = sess.run([predicted, accuracy], feed_dict={X:x_data, Y:y_data})
print( "predict=", p, "  accuracy=", a)

초등 사칙 복합 연산 문제.xlsm
0.02MB

초등 고학년 혹은 중학교 1학년 아이를 둔 부모에게 유용한 자료일듯 싶다.

간단한 사칙연산은 하지만 혼합된 사칙연산의 경우 계산 순서에 어려움이 있는 경우 많은 실수를 하게 된다.

이런 경우 사칙연산의 계산 순서를 혼동하지 않도록 연습할 수 있는 엑셀 시트를 준비하였다.

필요한 양만큼 인쇄하여 아이들이 수학계산에 어려움을 극복할 수 있기를 도와주기 바란다.

 

정답은 인쇄 후 오려두거나 뒤로 접어서 보이지 않도록 한다.

 

 

버튼을 누르면 2페이지 분량의 문제를 자동으로 생성한다.

 

본 엑셀시트는 내부에 VBA 매크로를 사용하고 있는데 MS 오피스에서 보안 문제로 경고를 하는경우 이를 무시하고 사용하도록 한다.

매크로를 내부에서 사용하므로 보안 경고를 한다. 이를 무시한다.

 

 

 

민물낚시나 바다낚시를 막론하고 물의 맑기를 나타낼 때는 맑다, 깨끗하다, 흐리다, 탁하다는 표현을 사용하는데 특히 배스낚시에서는 물색이 맑은 경우, 영어표현을 그대로 사용하여 클리어 워터(Clear Water)라고 부르기도 한다.

 

그런데 우리가 맑은 물이라고 알고 있는 클리어 워터(Clear Water)의 정의도 배스낚시에서는 여러 가지로 구분이 되고 흐린 물을 뜻하는 표현도 여러 가지가 있다.

 

그러나 정확하게 어느 정도의 맑기를 가진 것을 어떤 표현으로 부른다고 정해진 것은 없는데 뉘앙스에서 차이가 나기 때문에 미국의 배스낚시 정보를 볼 때는 알아두는 것도 나쁘지는 않을 것 같다.

 

그리고 글의 마지막에서는 미국의 프로 배서들이 물의 맑기를 측정하는 방법과 그에 따라서 배스들의 위치를 판단하는 방법을 소개한다.

 

 클리어 워터(Clear Water)

클리어 워터는 일반적으로 4가지로 구분하여 표현하는데 가장 기본적인 클리어 워터(Clear Water)는 맑은 물 중에서는 가장 등급이 낮은 것을 말한다고 보면 되며 맑은 물의 표현은 아래와 같다.

 

- 진 클리어 워터(Gin Clear Water)

(Gin)은 무색투명한 증류주인데 그만큼 깨끗하다는 뜻을 가지고 있으며 맑은 물을 표현할 때는 최고의 등급에 해당한다.

 

- 울트라 클리어 워터(Ultra Clear Water)

그 다음으로 매우 맑은 물을 나타낼 때는 울트라 클리어 워터(Ultra Clear Water)라는 표현을 쓴다.

 

- 크리스탈 클리어 워터(Crystal Clear Water)

말 그대로 수정같이 맑은 물을 뜻한다.

 

 

 

- 클리어 워터(Clear Water)

일반적으로 사용하는 맑은 물이란 표현인데 위의 4가지 표현들은 정확하게 구분을 할 수는 없으나 대단히 맑다는 것을 강조할 때는 클리어 워터(Clear Water)가 아닌 진 클리어 워터(Gin Clear Water), 울트라 클리어 워터(Ultra Clear Water), 크리스탈 클리어 워터(Crystal Clear Water)란 표현을 쓴다는 것을 알아두자.

 

 흐린 물

물색이 흐리거나 탁할 때에도 영어는 다양한 표현을 사용하는데 배스낚시에서는 어떤 표현들을 쓰는지 알아보자.

 

- 스테인드 워터(Stained Water)

스테인드(stained)란 영어단어는 얼룩이 진, 또는 얼룩투성이인 상태를 말하는데 가장 대표적인 것이 홍차를 우려낼 때 탄닌 성분이 많을수록 검게 변하는 것처럼 근처에 소나무 등의 침엽수가 많으면 탄닌으로 인해 물색이 탁해지는 경우가 바로 스테인드 워터(Stained Water)에 해당한다고 할 수 있다.

 

그러나 이 표현은 물의 맑기를 나타낸다기보다는 물색을 나타내는 것이며 물색이 진하거나 푸르스름하다고 해서 흐린 물이란 것은 아니므로 엄밀하게는 스테인드 워터(Stained Water)란 표현도 클리어 워터(Clear Water)에 해당한다고 할 수 있겠으나 그 경계가 모호한 표현이어서 흐린 물에 포함을 시켰다.

 

 

 

- 머키 워터(Murky Water)

영어사전을 검색하면 흐린 물이라고 나오는 머키 워터(Murky Water)는 배스낚시에서는 시야가 조금 나쁜 정도의 흐린 상태를 말할 때 사용한다.

 

 

 

- 머디 워터(Muddy Water)

우리말로 표현하자면 진흙탕물이라고 할 수 있는 상태를 말한다.

 

 

 

- 더티 워터(Dirty Water)

물이 가장 탁한 상태를 표현하는 것으로 배스낚시에서는 수질이 오염된 물을 뜻하는 것이 아니라 물의 대류현상으로 인한 턴오버(Turnover)나 여름철 태풍이 통과할 때 일시적으로 탁한 상태가 될 때를 주로 가리킨다.

 

 물의 맑기(탁도)를 측정하는 방법

물론 이것은 절대적인 것은 아니다. 그러나 토너먼트에 참가하는 프로들에게는 아주 중요한 사항으로 일반적으로 밝은 색상의 루어를 연결하고 릴을 감아 초릿대 부근에 최대한 가까이 오도록 한 다음, 로드를 물속에 넣어 루어가 보이지 않는 지점을 표시하여 판단하는 방법을 사용한다.

 

 물의 맑기에 따른 배스들의 위치를 판단하는 기준

토너먼트에 참가하는 프로들은 상기의 방법으로 물의 맑기를 측정한 다음 배스들이 있는 위치를 대략적으로 아래의 기준에 따라 판단하고 공략을 한다.

 

- 루어가 수중 15 이상에서 보이지 않는다면 배스는 대략 1.8m 이하에 있다고 판단한다.

- 루어가 수중 15~30에서 보이지 않는다면 배스는 대략 3m 이하에 있다고 판단한다.

- 루어가 수중 30~60에서 보이지 않는다면 배스는 대략 4.5m 이하에 있다고 판단한다.

- 루어가 수중 60~1.8m에서 보이지 않는다면 배스는 대략 10m 이하에 있다고 판단한다.

- 루어가 수중 1.8m 이상에서 보이지 않는다면 배스는 대략 17m 이하에 있다고 판단한다.

 

 

1. 수초가없고 / 바닥이 부드러운 지형
상층 : 작은 저크베이트
중층 : 인 라인 스피너
바닥 : 다운샷

2. 수초가없고 / 바닥이 딱딱한 지형
상층 : 작은 저크베이트
중층 : 컬리테일그럽(그럽웜 종류)
바닥 : 쉐이키 헤드리그

 

3. 풀, 연잎 /바닥이 부드러운 지형
상층 : 소프트 저크베이트
중층 : 스윔베이트
바닥 : 텍사스리그

4. 풀, 연잎 / 바닥이 딱딱한 지형
상층 : 소프트 저크베이트
중층 : 스윔베이트
바닥 : 헤비지그(러버지그, 무거운 지그헤드...)

5. 수초, 갈대 / 바닥이 부드러운 지형
상층 : 버즈베이트
중층 : 스윔지그
바닥 : 다운샷

6.수초, 갈대 / 바닥이 딱딱한 지형
상층 : 웨이크베이트

중층 : 스윔지그
바닥 : 스몰지그(마이크로 러버지그, 가벼운 지그헤드...)

 

 

 

 

 

 

 

 

1. 수초가없고 / 바닥이 부드러운 지형
상층 : 포퍼
중층 : 스피너베이트
바닥 : 텍사스리그(웜:벌레)

2. 수초가없고 / 바닥이 딱딱한 지형
상층 : 포퍼
중층 : 스피너베이트
바닥 : 크랭크베이트

3. 풀, 연잎 /바닥이 부드러운 지형
상층 : (할로우) 프로그
중층 : 스윔지그
바닥 : 텍사스리그(크리쳐:생물)

4. 풀, 연잎 / 바닥이 딱딱한 지형
상층 : (할로우) 프로그
중층 : 스윔지그
바닥 : 텍사스리그(비버)

5. 수초, 갈대 / 바닥이 부드러운 지형
상층 : 스윔베이트(노싱커)
중층 : 스피너베이트
바닥 : 텍사스리그(리자드)

6.수초, 갈대 / 바닥이 딱딱한 지형
상층 : 스윔베이트(노싱커)
중층: 스피너베이트
바닥 : 크랭크베이트

 

 

 

 

 

 

1. 수초가없고 / 바닥이 부드러운 지형
상층 : 처거(탑워터종류)
중층 : 채터베이트
바닥 : 텍사스리그(크리처:생물)

2. 수초가없고 / 바닥이 딱딱한 지형
상층 : 처거(탑워터종류)
중층 : 채터베이트
바닥 : 크랭크베이트

3. 풀, 연잎 /바닥이 부드러운 지형
상층 : 버징(toad: 두꺼비)
중층 : 블레이드 스윔베이트
바닥 : 텍사스리그(크리쳐:생물)

4. 풀, 연잎 / 바닥이 딱딱한 지형
상층 : 버징(toad: 두꺼비)
중층 : 블레이드 스윔베이트
바닥 : 텍사스리그(비버)

5. 수초, 갈대 / 바닥이 부드러운 지형
상층 : 프롭베이트
중층 : 콜로라도 - 블레이드 스피너베이트
바닥 : 센코 노싱커

6.수초, 갈대 / 바닥이 딱딱한 지형
상층 : 프롭베이트
중층: 콜로라도 - 블레이드 스피너베이트
바닥 : 크랭크베이트

 

출처 : https://cafe.naver.com/kbass/101227

도구 > 옵션 > Nuget 패키지 관리자 > 패키지 소스

또는

도구 > Nuget 패키지 관리자 > 패키지 관리자 설정 > 패키지 소스

 

 

1. Nuget V2

   추가 URL : https://www.nuget.org/api/v2/

 

2. Nuget V3

   추가 URL : https://api.nuget.org/v3/index.json



 

 

 

+ Recent posts