
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛ рдЬреАрд╡рди рдХреЗ рдЦреЗрд▓ рдХреЛ рдмрд┐рдирд╛ рд╕рд┐рдЦрд╛рдП рдЙрд╕реЗ рдЦреЗрд▓ рдХреЗ рдирд┐рдпрдо рд╕рд┐рдЦрд╛рдирд╛ рд╣реИред
рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП kylewbanks рджреНрд╡рд╛рд░рд╛ "рдХреЙрдирд╡реЗ рдХреЗ рд╕рд╛рде рдЬреАрд╡рди рдХреЗ рдХреЙрдирд╡реЗ рдХреЗ рдЦреЗрд▓ рдХреЛ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛" рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рдпрджрд┐ рдЖрдк рдЬреАрд╡рди рдирд╛рдордХ рдЦреЗрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ ( рдпрд╣ 1970 рдореЗрдВ рдЕрдВрдЧреНрд░реЗрдЬреА рдЧрдгрд┐рддрдЬреНрдЮ рдЬреЙрди рдХреЙрдирд╡реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдХреЛрд╢рд┐рдХреАрдп рдСрдЯреЛрдореЛрдмреЗрдЯрди рд╣реИ ), рдирд┐рдпрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред
рдЦреЗрд▓ рдмреНрд░рд╣реНрдорд╛рдВрдб рдПрдХ рдЕрдирдВрдд, рджреЛ рдЖрдпрд╛рдореА рдЧреНрд░рд┐рдб рд╡рд░реНрдЧ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ: рдЬреАрд╡рд┐рдд рдпрд╛ рдореГрдд (рдпрд╛ рдХреНрд░рдорд╢рдГ рдмрд╕реЗ рд╣реБрдП рдФрд░ рдирд┐рд░реНрдЬрди,)ред рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдЕрдкрдиреЗ рдЖрда рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд╖реИрддрд┐рдЬ, рд▓рдВрдмрд╡рдд рдпрд╛ рддрд┐рд░рдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕рдордп рдХрджрдо рдкрд░, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХреНрд░рдордг рд╣реЛрддреЗ рд╣реИрдВ:
- рджреЛ рдЬреАрд╡рд┐рдд рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛ рдорд░ рдЬрд╛рддреА рд╣реИред
- рджреЛ рдпрд╛ рддреАрди рдЬреАрд╡рд┐рдд рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛ рдЕрдЧрд▓реА рдкреАрдврд╝реА рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣рддреА рд╣реИред
- рддреАрди рд╕реЗ рдЕрдзрд┐рдХ рдЬреАрд╡рд┐рдд рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛ рдорд░ рдЬрд╛рддреА рд╣реИред
- рдареАрдХ рддреАрди рдЬреАрд╡рд┐рдд рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдореГрдд рдХреЛрд╢рд┐рдХрд╛ рдПрдХ рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛ рдмрди рдЬрд╛рддреА рд╣реИред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреАрдврд╝реА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдирд┐рдпрдореЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реА рдкреАрдврд╝реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ, рдЬрдиреНрдо рдФрд░ рдореГрддреНрдпреБ рдПрдХ рд╕рд╛рде рд╕рдордп рдкрд░ рдЕрд╕рддрдд рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреАрдврд╝реА рдкрд┐рдЫрд▓реЗ рдХрд╛ рдПрдХ рд╢реБрджреНрдз рдХрд╛рд░реНрдп рд╣реИред рдирдИ рдкреАрдврд╝реА рдХреЛ рдЕрдЧрд▓реА рдкреАрдврд╝реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд░рд╣рддреЗ рд╣реИрдВред
рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рджреЗрдЦреЗрдВред
рдРрд╕рд╛ рдХреНрдпреЛрдВ? рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП, рдФрд░ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдПред
рдЗрд╕рд▓рд┐рдП ...
рдЦреЗрд▓ рддрд░реНрдХ
рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рд░рд╛рдЬреНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬреИрд╕реЗ: https://jakevdp.imtqy.com/blog/2013/08/07/conways-game-of-life/ ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ 0 рдПрдХ рдореГрдд рд╕реЗрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдФрд░ 1 рдПрдХ рдЬреАрд╡рд┐рдд рд╕реЗрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА рдЖрдХрд╛рд░ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреЗрдо рдХреЗ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред
import numpy as np def life_step(X): live_neighbors = sum(np.roll(np.roll(X, i, 0), j, 1) for i in (-1, 0, 1) for j in (-1, 0, 1) if (i != 0 or j != 0)) return (live_neighbors == 3) | (X & (live_neighbors == 2)).astype(int)
рдЦреЗрд▓ рдХреНрд╖реЗрддреНрд░ рдкреАрдврд╝реА
рдЦреЗрд▓ рддрд░реНрдХ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЧреЗрдо рдлрд╝реАрд▓реНрдб рдХреЛ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдПред
num_frames
рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдФрд░ рдПрдХ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЧреЗрдо рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ num_frames
рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ "рд▓рд╛рдЗрд╡" рд╣реЛрдЧрд╛, рдФрд░ render_frames
рджреЛ рдЧреЗрдо рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдб рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ (рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╕рдлреЗрдж рдФрд░ рдореГрдд рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдХрд╛рд▓реА рд╣реЛрддреА рд╣реИрдВ):
import matplotlib.pyplot as plt def generate_frames(num_frames, board_shape=(100,100), prob_alive=0.15): return np.array([ np.random.choice([False, True], size=board_shape, p=[1-prob_alive, prob_alive]) for _ in range(num_frames) ]).astype(int) def render_frames(frame1, frame2): plt.subplot(1, 2, 1) plt.imshow(frame1.flatten().reshape(board_shape), cmap='gray') plt.subplot(1, 2, 2) plt.imshow(frame2.flatten().reshape(board_shape), cmap='gray')
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпреЗ рдХреНрд╖реЗрддреНрд░ рдХреНрдпрд╛ рджрд┐рдЦрддреЗ рд╣реИрдВ:
board_shape = (20, 20) board_size = board_shape[0] * board_shape[1] probability_alive = 0.15 frames = generate_frames(10, board_shape=board_shape, prob_alive=probability_alive) print(frames.shape)
(10, 20, 20)
print(frames[0])
[[0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1], [1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0]])
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЦреЗрд▓ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдПрдХ рдЫрд╡рд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреА рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐ рдХреЛ рднреА life_step
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд╛рдИрдВ рдУрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
ender_frames(frames[1], life_step(frames[1]))

рднрд╡рди рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ
рдЕрдм рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг, рд╕рддреНрдпрд╛рдкрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
y_train
/ y_val
/ y_test
рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ y_train
/ y_val
/ y_test
рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдЧреЗрдо рдлрд╝реАрд▓реНрдб рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛ред
def reshape_input(X): return X.reshape(X.shape[0], X.shape[1], X.shape[2], 1) def generate_dataset(num_frames, board_shape, prob_alive): X = generate_frames(num_frames, board_shape=board_shape, prob_alive=prob_alive) X = reshape_input(X) y = np.array([ life_step(frame) for frame in X ]) return X, y train_size = 70000 val_size = 10000 test_size = 20000
print("Training Set:") X_train, y_train = generate_dataset(train_size, board_shape, probability_alive) print(X_train.shape) print(y_train.shape)
Training Set: (70000, 20, 20, 1) (70000, 20, 20, 1)
print("Validation Set:") X_val, y_val = generate_dataset(val_size, board_shape, probability_alive) print(X_val.shape) print(y_val.shape)
Validation Set: (10000, 20, 20, 1) (10000, 20, 20, 1)
print("Test Set:") X_test, y_test = generate_dataset(test_size, board_shape, probability_alive) print(X_test.shape) print(y_test.shape)
Test Set: (20000, 20, 20, 1) (20000, 20, 20, 1)
рд╕рдВрд╡реЗрджреА рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдирд┐рд░реНрдорд╛рдг
рдЕрдм рд╣рдо рдХреЗрд░рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдХрд░реНрдиреЗрд▓ рдЖрдХрд╛рд░ (3, 3) рдФрд░ рдЪрд░рдг 1 рд╣реИред рд╡реЗ CNN рдХреЛ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рд╕рд╣рд┐рдд рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╕рдкрд╛рд╕ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ 3x3 рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдХ рдЧреЗрдо рдлрд╝реАрд▓реНрдб рдерд╛, рдФрд░ рд╣рдо рдордзреНрдп рд╕реЗрд▓ x
рдореЗрдВ рдереЗ, рддреЛ рд╡рд╣ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рджреЗрдЦреЗрдЧрд╛ !
рдФрд░ рд╕реЗрд▓
ред рдлрд┐рд░ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд▓ рдХреЗ рд╕рд╛рде рджрд╛рдИрдВ рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдкреВрд░реЗ рд╕реЗрд▓ рдФрд░ рдЙрд╕рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рди рдХрд░ рджреЗред
0 0 0 0 0 0! ! ! 0 0! x ! 0 0! ! ! 0 0 0 0 0 0
рдмрд╛рдХреА рдиреЗрдЯрд╡рд░реНрдХ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЪреАрдЬ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
from keras.models import Sequential from keras.layers import Dense, Dropout, Activation, Conv2D, MaxPool2D
summary
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
model.summary()
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_9 (Conv2D) (None, 20, 20, 50) 500 _________________________________________________________________ dense_17 (Dense) (None, 20, 20, 100) 5100 _________________________________________________________________ dense_18 (Dense) (None, 20, 20, 1) 101 _________________________________________________________________ activation_9 (Activation) (None, 20, 20, 1) 0 ================================================================= Total params: 5,701 Trainable params: 5,701 Non-trainable params: 0 _________________________________________________________________
рдПрдХ рдореЙрдбрд▓ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдмрдЪрдд
CNN рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬреЗрдВ:
def train(model, X_train, y_train, X_val, y_val, batch_size=50, epochs=2, filename_suffix=''): model.fit( X_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(X_val, y_val) ) with open('cgol_cnn{}.json'.format(filename_suffix), 'w') as file: file.write(model.to_json()) model.save_weights('cgol_cnn{}.h5'.format(filename_suffix)) train(model, X_train, y_train, X_val, y_val, filename_suffix='_basic')
Train on 70000 samples, validate on 10000 samples Epoch 1/2 70000/70000 [==============================] - 27s 388us/step - loss: 0.1324 - acc: 0.9651 - val_loss: 0.0833 - val_acc: 0.9815 Epoch 2/2 70000/70000 [==============================] - 27s 383us/step - loss: 0.0819 - acc: 0.9817 - val_loss: 0.0823 - val_acc: 0.9816
рдпрд╣ рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл 98% рд╕реЗ рдЕрдзрд┐рдХ рдХреА рд╕рдЯреАрдХрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдкрд╛рд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдЖрдЗрдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдХрд╣рд╛рдВ рдЧрд▓рддрд┐рдпрд╛рдВ рдХрд░рддреЗ рд╣реИрдВред
рдХреЛрд╢рд┐рд╢
рдЖрдЗрдП рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЦреЗрд▓ рдореИрджрд╛рди рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рджреЗрдЦреЗрдВ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЦреЗрд▓ рдореИрджрд╛рди рдмрдирд╛рдПрдВ рдФрд░ рд╕рд╣реА рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХреЛ рджреЗрдЦреЗрдВ:
X, y = generate_dataset(1, board_shape=board_shape, prob_alive=probability_alive) render_frames(X[0].flatten().reshape(board_shape), y)

рдЕрдЧрд▓рд╛, рдЪрд▓реЛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рддрдиреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЧрд▓рдд рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдЧрдИ рдереА:
pred = model.predict_classes(X) print(np.count_nonzero(pred.flatten() - y.flatten()), "incorrect cells.")
4 incorrect cells.
рдЕрдЧрд▓рд╛, рдЖрдЗрдП рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд┐рдП рдЧрдП рдХрджрдо рдХреЗ рд╕рд╛рде рд╕рд╣реА рдЕрдЧрд▓реЗ рдЪрд░рдг рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:
render_frames(y, pred.flatten().reshape(board_shape))

рдпрд╣ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд╣рд╛рдБ рд╡рд┐рдлрд▓ рд░рд╣реА? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдЧрд▓рдд рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреЛ рдХрд╣рд╛рдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ:
print(pred.flatten().reshape(board_shape) - y.flatten().reshape(board_shape))
[[ 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 -1 -1 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0]]
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╕реНрдерд┐рдд рд╣реИрдВред рдЖрдЗрдП рдкреВрд░реНрдг рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЕрд╡рд▓реЛрдХрди рд╕рддреНрдп рд╣реИред
рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдЧ рджреЗрдЦреЗрдВ
рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдПрдХ рд╣реАрдЯрдореИрдк рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореЙрдбрд▓ рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреВрд░реЗ рдЯреЗрд╕реНрдЯ рд╕реВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ:
def view_prediction_errors(model, X, y): y_pred = model.predict_classes(X) sum_y_pred = np.sum(y_pred, axis=0).flatten().reshape(board_shape) sum_y = np.sum(y, axis=0).flatten().reshape(board_shape) plt.imshow(sum_y_pred - sum_y, cmap='hot', interpolation='nearest') plt.show() view_prediction_errors(model, X_test, y_test)

рдХрд┐рдирд╛рд░реЛрдВ рдФрд░ рдХреЛрдиреЛрдВ рдкрд░ рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВред рдЬреЛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдПрдирдПрди рдЪрд╛рд░реЛрдВ рдУрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди life_step
рдореЗрдВ рдЦреЗрд▓ рдХрд╛ рддрд░реНрдХ life_step
рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдиреАрдЪреЗ рдХрд┐рдирд╛рд░реЗ рд╕реЗрд▓ x
рджреЗрдЦрддреЗ рд╣реБрдП, CNN рдХреЗрд╡рд▓ x
рдФрд░ !
рд╕реЗрд▓:
0 0 0 0 0 ! ! 0 0 0 x ! 0 0 0 ! ! 0 0 0 0 0 0 0 0
рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ life_step
рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рд╕реЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ:
0 0 0 0 0 ! ! 0 0 ! x ! 0 0 ! ! ! 0 0 ! 0 0 0 0 0
рдХреЛрдиреЛрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐:
x ! 0 0 ! ! ! 0 0 ! 0 0 0 0 0 0 0 0 0 0 ! 0 0 0 !
рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Conv2D
рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЦреЗрд▓ рдореИрджрд╛рди рдХреЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ Conv2D рдмрд╕ рдкрд╣рд▓реЗ рдпрд╛ рдЕрдВрддрд┐рдо рдХреЙрд▓рдо рдФрд░ рдкрдВрдХреНрддрд┐ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдо рдХрд░реИрд╕ рдХреА рджрдпрд╛ рдкрд░ рд╣реИрдВ рдФрд░ рдпрд╣ рдЬреЛ рдХрд╛рд░реНрдпрд╢реАрд▓рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рднрд░рдг рд░рд╛рд╢рд┐ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред
рднрд░рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдмрдврд╝рдд рджреЛрд╖реЛрдВ рдХрд╛ рд╕реБрдзрд╛рд░
рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЦреЗрд▓ рдореИрджрд╛рди рдХреЛ рдПрдХ рд╡рд┐рдкрд░реАрдд рдорд╛рди рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ life_step
рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП mode = 'wrap'
рд╕рд╛рде np.pad
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╕рд░рдгреА рдФрд░ рд╕рдВрд╡рд░реНрдзрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
x = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) print(np.pad(x, (1, 1), mode='wrap'))
[[9, 7, 8, 9, 7], [3, 1, 2, 3, 1], [6, 4, 5, 6, 4], [9, 7, 8, 9, 7], [3, 1, 2, 3, 1]]
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд╣рд▓рд╛ рд╕реНрддрдВрдн / рдкрдВрдХреНрддрд┐ рдФрд░ рдЕрдВрддрд┐рдо рд╕реНрддрдВрдн / рдкрдВрдХреНрддрд┐ рдореВрд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд рддрд░рдл рджрд░реНрдкрдг рд╣реИ, рдФрд░ рдордзреНрдп 3x3 рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореВрд▓ x
рдореВрд▓реНрдп рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрд▓ [1] [1] рдХреЛ рд╕реЗрд▓ [рек] [рез] рдореЗрдВ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ [реж] [рез] рдЗрд╕рдореЗрдВ [рей] [рез] рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИред рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреЛрдиреЛрдВ рдореЗрдВ, рд╕рд░рдгреА рдХреЛ рд╕рд╣реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд┐рдкрд░реАрдд рдкрдХреНрд╖ рд╢рд╛рдорд┐рд▓ рд╣реЛред рдЗрд╕рд╕реЗ рд╕реАрдПрдирдПрди рдкреВрд░реЗ рдЦреЗрд▓ рдореИрджрд╛рди рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдФрд░ рдЪрд░рдо рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдЗрдирдкреБрдЯ рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
def pad_input(X): return reshape_input(np.array([ np.pad(x.reshape(board_shape), (1,1), mode='wrap') for x in X ])) X_train_padded = pad_input(X_train) X_val_padded = pad_input(X_val) X_test_padded = pad_input(X_test) print(X_train_padded.shape) print(X_val_padded.shape) print(X_test_padded.shape)
(70000, 22, 22, 1) (10000, 22, 22, 1) (20000, 22, 22, 1)
рд╕рднреА рдбреЗрдЯрд╛рд╕реЗрдЯ рдЕрдм рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╕реНрддрдВрднреЛрдВ / рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рд╣реИрдВ, рдЬреЛ CNN рдХреЛ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рд╡рд┐рдкрд░реАрдд рдкрдХреНрд╖ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ life_step
рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдЦреЗрд▓ рдореИрджрд╛рди рдХрд╛ рдореВрд▓ 20x20 рдХреЗ рдмрдЬрд╛рдп рдЕрдм 22x22 рдХрд╛ рдЖрдХрд╛рд░ рд╣реИред
рдлрд┐рд░, CNN рдХреЛ padding = 'valid'
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ padding = 'valid'
рдХреЛ рддреНрдпрд╛рдЧрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреЛ рдХрд┐ рдХрдиреНрд╡рд░реНрдЬрд╝рди рдХреЛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рддреНрдпрд╛рдЧрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ), рдФрд░ рдирдП input_shape
рд╣реИрдВрдбрд▓ рдХрд░реЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм рд╣рдо 22x22 рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдореИрджрд╛рди рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ, рддрдм рднреА рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ 20x20 рдХрд╛ рдЖрдХрд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рдФрд░ рдЖрдЦрд┐рд░реА рдХреЙрд▓рдо / рдкрдВрдХреНрддрд┐ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдмрд╛рдХреА рд╕рдорд╛рди рд╣реИ:
model_padded = Sequential() model_padded.add(Conv2D( filters, kernel_size, padding='valid', activation='relu', strides=strides, input_shape=(board_shape[0] + 2, board_shape[1] + 2, 1) )) model_padded.add(Dense(hidden_dims)) model_padded.add(Dense(1)) model_padded.add(Activation('sigmoid')) model_padded.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model_padded.summary()
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_10 (Conv2D) (None, 20, 20, 50) 500 _________________________________________________________________ dense_19 (Dense) (None, 20, 20, 100) 5100 _________________________________________________________________ dense_20 (Dense) (None, 20, 20, 1) 101 _________________________________________________________________ activation_10 (Activation) (None, 20, 20, 1) 0 ================================================================= Total params: 5,701 Trainable params: 5,701 Non-trainable params: 0 _________________________________________________________________
рдЕрдм рд╣рдо рд╕рдВрд░реЗрдЦрд┐рдд рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
train( model_padded, X_train_padded, y_train, X_val_padded, y_val, filename_suffix='_padded' )
Train on 70000 samples, validate on 10000 samples Epoch 1/2 70000/70000 [==============================] - 27s 389us/step - loss: 0.0604 - acc: 0.9807 - val_loss: 4.5475e-04 - val_acc: 1.0000 Epoch 2/2 70000/70000 [==============================] - 27s 382us/step - loss: 1.7058e-04 - acc: 1.0000 - val_loss: 5.9932e-05 - val_acc: 1.0000
рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рд╕рдЯреАрдХрддрд╛ 98% рд╕реЗ 100% рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдорд┐рд▓реА рдереАред рдЖрдЗрдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рджреЗрдЦреЗрдВ:
view_prediction_errors(model_padded, X_test_padded, y_test)

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдмреНрд▓реИрдХ рд╣реАрдЯ рдореИрдк рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдордиреЗ рдкреНрд░рддреНрдпреЗрдХ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреА рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рд╣реИред
рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЬрдЯрд┐рд▓ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡реНрдпрд╛рдпрд╛рдо рдерд╛ред GitHub рдкрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ ред