Edited at

TensorFlow機械学習クックブック第6章(というか三目並べのところ)で個人的につまったところとか

三目並べの学習


Recipe 41

そもそも何をどう学習するの?? :angel:

学習器を定義しているのは <方法> 9(モデルの変数と演算を...) ~ 11(損失関数を...) らへん。

<方法> の 4(座標変換を使って...) ~ 8(トレーニングセットから1つの...) は下準備で、トレーニングセットを作ってる

(準備がやたら長いしややこしくない??)

github にある base_tic_tac_toe_moves.csv は対称的な局面は省略されてるてことか

まとめると学習器自体はふつうで、

入力 x: 局面情報(要素数9の一次元リスト)

layer1 = sigmoid(A1*x+b1)

layer2 = A2*layer1+b2

教師ラベル y: 最善手(整数0~9のどれか)(あれ最善手ってどう定義してるんだろう(未検証))

loss: layer2 と y のhogeエントロピー

実際にはいくつかのデータをセットで学習器につっこむ(それはそう感)

マル

<方法>

4.

board[::-1]

リストを逆順に並べ替える。 参考1 :baby:

list(zip(*[board[6:9], board[3:6], board[0:3]]))

ナニコレ長い。あと「*」って可変長引数に使うやつじゃないの?? :construction_worker:

で参考2~4

なにやら *a みたいにアスタリスク「*」をつけると a が展開されるらしい

いろいろ試してみた(うp主はこれで理解できたつもり)

てことで list(zip(*[board[6:9], board[3:6], board[0:3]])) を順を追って見てみる

見やすいように (・・・☆)

def print_board(board): # 引数は一次元のリスト

print(' ' + str(board[0]) + ' | ' + str(board[1]) + ' | ' + str(board[2]))
#print('__________')
print(' ' + str(board[3]) + ' | ' + str(board[4]) + ' | ' + str(board[5]))
#print('__________')
print(' ' + str(board[6]) + ' | ' + str(board[7]) + ' | ' + str(board[8]))
print('\n')

def make_board(board_2d): # 二次元のリストを一次元に変換する
return [value for item in board_2d for value in item]
'''
board_1d = []
for item in board_2d:
for value in item:
board_1d.append(value)
return board_1d
'''

return [value for item in board_2d for value in item]

上の☆参照 :man_with_turban:

for文で書き換えれる(長くなるけど)


参考


  1. [python] スライスでリバース!!

  2. Pythonでunzipってどうやるの?

  3. アスタリスクによるシーケンスの展開

  4. Pythonのイテレータとジェネレータ