Tensorflow에서 차단

개요



기계 학습 모델을 게임에 통합하면 결과를 그래픽으로 볼 수 있어 즐겁다. 그래서 Tensorflow에서 모델을 만들어 게임에 통합한다. 구체적으로는 Tensorflow에서 사람의 손에 의한 플레이 데이터를 이용하여 모델을 작성하여 블록 붕괴를 시킨다.
세련된 모델 등에 구애받지 않고, 딱딱한 것을 딱딱하게 만든다.
Tensorflow의 기본 모델링은 다음 기사에서
적당히 Tensorflow를 이해하고 모델을 만들어 보자 (Tensorflow 입문)
사용하는 블록 붕괴는 다음 링크 대상
블록 붕괴

동기



기계 학습 모델에 여러가지 플레이시키는 기사는 잘 보지만, 실제로 시간을 들이지 않고 적당히 시험해보고 싶다.
정밀도와 아름다움을 신경쓰지 않고 움직이는 실감을 얻을 수 있도록 움직이는 것이 목적.

전제



이번에 사용하는 블록 붕괴의 개요는 다음과 같다.
* 패들을 움직여 공을 연주
* 마우스의 x 좌표로 패들 좌표를 결정

즉, 공의 y 좌표와 패들의 y 좌표가 일치할 때, 각각의 x 좌표가 일치해도 공을 연주하는 것이 가능해진다.
그런 의미에서 오토블록 붕괴의 작성은 상당히 상냥하다.

데이터 작성



실제 플레이에서 데이터를 만듭니다. 이번에는 제대로 진행하는 것이 목적이므로 설명 변수와 피설명 변수 세트를 세세하게는 생각하지 않는다.
우선은, 실제로 플레이를 할 때에, 화면의 갱신 타이밍에 맞추어 패들의 좌표와 볼의 좌표를 내보내, 각 프레임에 둘 수 있는 볼의 x 좌표, y 좌표를 설명 변수, 패들의 위치를 ​​피설명 변수와 할 데이터를 만듭니다.
이것은 Ball 클래스의 move 함수, Paddle 클래스의 update 함수 내에 각각의 좌표를 내보내는(저장하는) 처리를 써 두면 된다.

모델 만들기



model.py
# ライブラリインポート
import tensorflow as tf
import pandas as pd

# データ読み込み
data_x = pd.read_csv('/somewhere/ball_movement_x.csv', header=None)
data_y = pd.read_csv('/somewhere/ball_movement_y.csv', header=None)
movement = pd.read_csv('/somewhere/mouse_movement.csv', header=None)

data = pd.DataFrame({'x_data': data_x.ix[:, 0],
                     'y_data': data_y.ix[:, 0]
                     })
teacher = pd.DataFrame({'teacher':movement.ix[:, 0]})

# モデル作成
# プレースホルダー設定
X = tf.placeholder(tf.float32, shape = [None, 2])
Y = tf.placeholder(tf.float32, shape = [None, 1])

# 変数設定
W = tf.Variable(tf.zeros([2,1]))

B = tf.Variable(tf.zeros([1]))

y_hypo = tf.matmul(X, W) + B

# 損失関数
cost = tf.reduce_mean(tf.square(y_hypo - Y))

# 勾配降下
train_step = tf.train.GradientDescentOptimizer(0.000001).minimize(cost)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(1000):
        sess.run(train_step, feed_dict={X:data, Y:teacher})
    parameter_W = sess.run(W)
    parameter_B = sess.run(B)

순서대로 살펴

model.py
# モデル作成
# プレースホルダー設定
X = tf.placeholder(tf.float32, shape = [None, 2])
Y = tf.placeholder(tf.float32, shape = [None, 1])

# 変数設定
W = tf.Variable(tf.zeros([2,1]))
B = tf.Variable(tf.zeros([1]))

y_hypo = tf.matmul(X, W) + B

자리 표시자는 학습 단계에서 실제 데이터가 할당되고 변수가 학습으로 학습됩니다.
y_hypo는 데이터와 파라미터에 의해 패들의 좌표를 예측하기 위한 모델이 된다.

optimize.py
# 損失関数
cost = tf.reduce_mean(tf.square(y_hypo - Y))

# 勾配降下
train_step = tf.train.GradientDescentOptimizer(0.000001).minimize(cost)


with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(1000):
        sess.run(train_step, feed_dict={X:data, Y:teacher})
    parameter_W = sess.run(W)
    parameter_B = sess.run(B)

실제로 학습을 실시해, 파라미터를 탐색시킨다.
parameter_W와 parameter_B가 구한 파라미터가 되어, X를 입력 데이터(볼의 x좌표와 y좌표)로 하고, tf.matmul(X, parameter_W) + parameter_B의 값이 패들의 예측 좌표가 된다.

실행



main 함수의 while 내에서 공의 좌표를 얻고 위의 모델에 넣고 그 예측값을 패들 좌표로 만듭니다.
정보의 갱신이 행해질 때마다 예측이 행해지고 있으므로 매우 무겁지만, 우선 이하와 같이 동작.



감상



이번의 목적은 제대로 게임에 모델을 짜넣어 동작시키는 것이었지만, 그것은 잘 되었다.
실제로는, 어떠한 데이터를 사용하는지, 어떻게 보다 세련된 움직임을 시키는지 등을 신경쓰면서 진행하게 된다.
예를 들어, 이번 블록 붕괴의 경우는, 일정한 곳까지 블록이 없어지면, 패들과 볼의 움직임이 정해져 버려, 블록이 없는 공간을 계속 오가게 되었다. 또한 프레임을 업데이트 할 때마다 예측을 수행하는 것은 비효율적이었고 볼의 움직임도 매우 느려졌습니다.

좋은 웹페이지 즐겨찾기