Added the ability to generate training data.
This commit is contained in:
1 file changed
+355
-58
+355
-58
@@ -525,8 +525,8 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"8.75 ms ± 34.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
|
||||
"905 ms ± 28.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||
"9.79 ms ± 225 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n",
|
||||
"983 ms ± 59.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -750,9 +750,9 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"197 µs ± 1.28 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
|
||||
"32.6 µs ± 267 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n",
|
||||
"35.8 µs ± 141 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
|
||||
"190 µs ± 3.89 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n",
|
||||
"35.4 µs ± 237 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n",
|
||||
"36.9 µs ± 796 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -842,7 +842,7 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"97 ms ± 3.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
|
||||
"108 ms ± 2.36 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1139,13 +1139,13 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"1.02 s ± 11.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
|
||||
"1.04 s ± 5.07 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||
"1.2 s ± 41.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n",
|
||||
"1.08 s ± 60.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1200x600 with 8 Axes>"
|
||||
]
|
||||
@@ -1206,7 +1206,7 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 1200x4800 with 61 Axes>"
|
||||
]
|
||||
@@ -1305,7 +1305,7 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"9.83 s ± 240 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||
"10.4 s ± 267 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -1425,7 +1425,7 @@
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "490d626986f04f2ab5c7149b3199081d",
|
||||
"model_id": "c5f272d3d97d4277b752ac8df4ab512a",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
@@ -1575,7 +1575,7 @@
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "ac8ca8dc22b5490fba9241640ed87287",
|
||||
"model_id": "5dccb2662b68447fb677365253c6b9cd",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
@@ -1640,7 +1640,7 @@
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "da049b98f9ad40c2a22e00968b63f7cc",
|
||||
"model_id": "1e34f7bc0fea4ae28bc1394cc50393f8",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
@@ -1693,7 +1693,7 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAj0AAAGzCAYAAADEw6Y0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABK/klEQVR4nO3de1gUZf8/8PcC7i4eABVhBVFISfKRxFAXiNRyv5JSRo8WUokaSgfPaI9gCmgHDLMoNckO6vdbBmJmpoQSHbyeJE2EDFPSElFxUSNYpQRh798f/hgdWZDVFGXer+uaS/eez9xzzw2yb2dnBpUQQoCIiIiolbNp6QEQERER3QwMPURERKQIDD1ERESkCAw9REREpAgMPURERKQIDD1ERESkCAw9REREpAgMPURERKQIDD1ERESkCAw9dFvy9PTEhAkTWnoY1AKKi4uhUqnw+uuvt/RQbmv187hmzRqpLTExESqV6qbsf+jQoRg6dKj0+ttvv4VKpcKGDRtuyv4nTJgAT0/Pm7IvunUw9FCLW7NmDVQqFfbs2WNx/dChQ9G3b9/r3k9mZiYSExOvux+6Ofj1uj2UlpYiMTERBQUFLT2UBm7lsVHLYOih21JRURHee+89q7bJzMzEwoULb9CI6J/Gr9fNN3/+fPz9999WbVNaWoqFCxdaHSy2b9+O7du3W7WNtZoa23vvvYeioqIbun+69TD00G1Jo9GgTZs2LT0Mq1RVVbX0EG45f/31V0sP4ZZWW1uLmpqam7Y/Ozs7aLXaG7qP+q+5Wq2GWq2+oftqSps2baDRaFps/9QyGHrotnTlNT0XLlzAwoUL4e3tDa1Wi86dOyM4OBjZ2dkALn5+v2LFCgCASqWSlnpVVVWYPXs2PDw8oNFo0Lt3b7z++usQQsj2+/fff2P69OlwdnZGhw4dMGrUKJw4cQIqlUr2UUz9tRG//PILnnjiCXTs2BHBwcEAgH379mHChAm44447oNVqodPp8PTTT+OPP/6Q7au+j19//RVPPfUUHB0d0aVLFyxYsABCCBw7dgyPPPIIHBwcoNPpsHTp0mbNXW1tLV566SX07NkTGo0Gnp6emDdvHqqrq6Wahx56CHfccYfF7QMDAzFgwABZ20cffQR/f3/Y29ujU6dOGDt2LI4dOyarqf+YMi8vD4MHD0bbtm0xb948i/u42ter3qpVq6TjGDhwIH788ccGNQcPHsSYMWPQqVMnaLVaDBgwAJs3b256kv6/tLQ0+Pv7o0OHDnBwcICvry/eeustWU1FRQVmzZoFT09PaDQadOvWDZGRkThz5oxUc+rUKURFRcHV1RVarRb9+vXD2rVrZf1cfq1SSkqKdFy//PLLdR9HRUUFJkyYAEdHRzg5OWH8+PGoqKhoUGfpmp7s7GwEBwfDyckJ7du3R+/evaWv27fffouBAwcCACZOnCh9neqvE2rqa37lNT316urqMG/ePOh0OrRr1w6jRo1q8L3U2DV9l/d5tbFZuqanuT8HVCoVpk6dik2bNqFv377QaDT417/+haysrAZjoluLXUsPgKheZWWl7I2i3oULF666bWJiIpKSkjBp0iQMGjQIJpMJe/bswd69e/E///M/eOaZZ1BaWors7Gz83//9n2xbIQRGjRqFb775BlFRUfDz88O2bdvwwgsv4MSJE3jzzTel2gkTJmD9+vUYN24cAgIC8N133yE0NLTRcT322GPw9vbGq6++Kv3gzM7Oxu+//46JEydCp9Nh//79WLVqFfbv348ffvihwZtOeHg47rrrLixevBhbt27Fyy+/jE6dOuHdd9/FAw88gNdeew0ff/wx5syZg4EDB2Lw4MFNztWkSZOwdu1ajBkzBrNnz8auXbuQlJSEAwcO4LPPPpP2GRkZiR9//FF64wCAo0eP4ocffsCSJUuktldeeQULFizA448/jkmTJuH06dNYtmwZBg8ejPz8fDg5OUm1f/zxB0aMGIGxY8fiqaeegqurq8UxNvX1qrdu3TqcPXsWzzzzDFQqFZKTk/Hvf/8bv//+u3QWcP/+/bj33nvh7u6O2NhYtGvXDuvXr0dYWBg+/fRTPProo43OU3Z2NiIiIjBs2DC89tprAIADBw7g+++/x4wZMwAA586dw3333YcDBw7g6aefxj333IMzZ85g8+bNOH78OJydnfH3339j6NChOHz4MKZOnQovLy9kZGRgwoQJqKiokPqqt3r1apw/fx7R0dHQaDTo1KnTdR2HEAKPPPII/vvf/+LZZ5/FXXfdhc8++wzjx49vdJt6+/fvx0MPPYS7774bixYtgkajweHDh/H9998DAO666y4sWrQI8fHxiI6Oxn333QcACAoKkvpo7te83iuvvAKVSoW5c+fi1KlTSElJgcFgQEFBAezt7a86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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 640x480 with 1 Axes>"
|
||||
]
|
||||
@@ -1945,7 +1945,9 @@
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 40,
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"BATCH_SIZE = 1000\n",
|
||||
@@ -1954,8 +1956,8 @@
|
||||
"class DQLNet(nn.Module):\n",
|
||||
" def __init__(self):\n",
|
||||
" super().__init__()\n",
|
||||
" self.fc1 = nn.Linear(BATCH_SIZE, 8 * 8 * 2)\n",
|
||||
" self.fc2 = nn.Linear(BATCH_SIZE, 1)\n",
|
||||
" self.fc1 = nn.Linear(8 * 8 * 2, 128)\n",
|
||||
" self.fc2 = nn.Linear(128, 1)\n",
|
||||
"\n",
|
||||
" def forward(self, x):\n",
|
||||
" if isinstance(x, np.ndarray):\n",
|
||||
@@ -1966,8 +1968,6 @@
|
||||
" # x = self.dropout1(x)\n",
|
||||
" x = self.fc2(x)\n",
|
||||
" x = F.relu(x)\n",
|
||||
" # x = self.dropout2(x)\n",
|
||||
" x = torch.reshape(x, (BATCH_SIZE, 8, 8))\n",
|
||||
" return x"
|
||||
]
|
||||
},
|
||||
@@ -1986,31 +1986,65 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 42,
|
||||
"metadata": {},
|
||||
"execution_count": 71,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"(8, 8)\n"
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(2, 8, 8)"
|
||||
]
|
||||
},
|
||||
"execution_count": 71,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def action_to_q_learning_format(board_history, action_history):\n",
|
||||
" q_learning_format = np.zeros((SIMULATE_TURNS, board_history.shape[1], 2, 8, 8), dtype=float)\n",
|
||||
" q_learning_format[:, :, 1, :, :] = -1\n",
|
||||
" q_learning_format[:, :, 1, action_history[:, :, 0], action_history[:, :, 0]] = 1\n",
|
||||
" return q_learning_format\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"action_to_q_learning_format(simulated_boards, simulated_actions)[-1,0].shape"
|
||||
]
|
||||
},
|
||||
{
|
||||
"ename": "TypeError",
|
||||
"evalue": "cannot unpack non-iterable int object",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
|
||||
"\u001B[1;31mTypeError\u001B[0m Traceback (most recent call last)",
|
||||
"Cell \u001B[1;32mIn[42], line 51\u001B[0m\n\u001B[0;32m 40\u001B[0m \u001B[38;5;28;01mpass\u001B[39;00m\n\u001B[0;32m 43\u001B[0m ql_policy \u001B[38;5;241m=\u001B[39m QLPoicy(\n\u001B[0;32m 44\u001B[0m \u001B[38;5;241m0.95\u001B[39m,\n\u001B[0;32m 45\u001B[0m neural_netwerk\u001B[38;5;241m=\u001B[39mDQLNet(),\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 49\u001B[0m final_score_fraction\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m0\u001B[39m,\n\u001B[0;32m 50\u001B[0m )\n\u001B[1;32m---> 51\u001B[0m \u001B[43mql_policy\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mtrain_epoch\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;241;43m100\u001B[39;49m\u001B[43m)\u001B[49m\n",
|
||||
"Cell \u001B[1;32mIn[42], line 36\u001B[0m, in \u001B[0;36mQLPoicy.train_epoch\u001B[1;34m(self, generate_data_size)\u001B[0m\n\u001B[0;32m 34\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21mtrain_epoch\u001B[39m(\u001B[38;5;28mself\u001B[39m, generate_data_size: \u001B[38;5;28mint\u001B[39m):\n\u001B[0;32m 35\u001B[0m \u001B[38;5;66;03m# generate trainings data\u001B[39;00m\n\u001B[1;32m---> 36\u001B[0m train_boards, train_actions \u001B[38;5;241m=\u001B[39m \u001B[43msimulate_game\u001B[49m\u001B[43m(\u001B[49m\u001B[43mgenerate_data_size\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43m[\u001B[49m\u001B[38;5;28;43mself\u001B[39;49m\u001B[43m]\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43m \u001B[49m\u001B[38;5;241;43m2\u001B[39;49m\u001B[43m)\u001B[49m\n",
|
||||
"Cell \u001B[1;32mIn[22], line 25\u001B[0m, in \u001B[0;36msimulate_game\u001B[1;34m(nr_of_games, policies, tqdm_on)\u001B[0m\n\u001B[0;32m 23\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m policy_index \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[0;32m 24\u001B[0m current_boards \u001B[38;5;241m=\u001B[39m current_boards \u001B[38;5;241m*\u001B[39m \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m1\u001B[39m\n\u001B[1;32m---> 25\u001B[0m current_boards, action_taken \u001B[38;5;241m=\u001B[39m \u001B[43msingle_turn\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcurrent_boards\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mpolicy\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 26\u001B[0m action_history_stack[turn_index, :] \u001B[38;5;241m=\u001B[39m action_taken\n\u001B[0;32m 28\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m policy_index \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m0\u001B[39m:\n",
|
||||
"Cell \u001B[1;32mIn[21], line 15\u001B[0m, in \u001B[0;36msingle_turn\u001B[1;34m(current_boards, policy)\u001B[0m\n\u001B[0;32m 1\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21msingle_turn\u001B[39m(\n\u001B[0;32m 2\u001B[0m current_boards: np, policy: GamePolicy\n\u001B[0;32m 3\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28mtuple\u001B[39m[np\u001B[38;5;241m.\u001B[39mndarray, np\u001B[38;5;241m.\u001B[39mndarray]:\n\u001B[0;32m 4\u001B[0m \u001B[38;5;250m \u001B[39m\u001B[38;5;124;03m\"\"\"Execute a single turn on a board.\u001B[39;00m\n\u001B[0;32m 5\u001B[0m \n\u001B[0;32m 6\u001B[0m \u001B[38;5;124;03m Places a new stone on the board. Turns captured enemy stones.\u001B[39;00m\n\u001B[1;32m (...)\u001B[0m\n\u001B[0;32m 13\u001B[0m \u001B[38;5;124;03m The new game board and the policy vector containing the index of the action used.\u001B[39;00m\n\u001B[0;32m 14\u001B[0m \u001B[38;5;124;03m \"\"\"\u001B[39;00m\n\u001B[1;32m---> 15\u001B[0m policy_results \u001B[38;5;241m=\u001B[39m \u001B[43mpolicy\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mget_policy\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcurrent_boards\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 17\u001B[0m \u001B[38;5;66;03m# if the constant VERIFY_POLICY is set to true the policy is verified. Should be good though.\u001B[39;00m\n\u001B[0;32m 18\u001B[0m \u001B[38;5;66;03m# todo deactivate the policy verification after some testing.\u001B[39;00m\n\u001B[0;32m 19\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m VERIFY_POLICY:\n",
|
||||
"Cell \u001B[1;32mIn[18], line 56\u001B[0m, in \u001B[0;36mGamePolicy.get_policy\u001B[1;34m(self, boards)\u001B[0m\n\u001B[0;32m 54\u001B[0m policies \u001B[38;5;241m=\u001B[39m np\u001B[38;5;241m.\u001B[39mrandom\u001B[38;5;241m.\u001B[39mrand(\u001B[38;5;241m*\u001B[39mboards\u001B[38;5;241m.\u001B[39mshape)\n\u001B[0;32m 55\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m---> 56\u001B[0m policies \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_internal_policy\u001B[49m\u001B[43m(\u001B[49m\u001B[43mboards\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 57\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mepsilon \u001B[38;5;241m<\u001B[39m \u001B[38;5;241m1\u001B[39m:\n\u001B[0;32m 58\u001B[0m policies \u001B[38;5;241m=\u001B[39m policies \u001B[38;5;241m*\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mepsilon \u001B[38;5;241m+\u001B[39m np\u001B[38;5;241m.\u001B[39mrandom\u001B[38;5;241m.\u001B[39mrand(\u001B[38;5;241m*\u001B[39mboards\u001B[38;5;241m.\u001B[39mshape) \u001B[38;5;241m*\u001B[39m (\n\u001B[0;32m 59\u001B[0m \u001B[38;5;241m1\u001B[39m \u001B[38;5;241m-\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mepsilon\n\u001B[0;32m 60\u001B[0m )\n",
|
||||
"Cell \u001B[1;32mIn[42], line 31\u001B[0m, in \u001B[0;36mQLPoicy._internal_policy\u001B[1;34m(self, boards)\u001B[0m\n\u001B[0;32m 29\u001B[0m \u001B[38;5;28mprint\u001B[39m(turn_possible\u001B[38;5;241m.\u001B[39mshape)\n\u001B[0;32m 30\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m action_x, action_y \u001B[38;5;129;01min\u001B[39;00m itertools\u001B[38;5;241m.\u001B[39mproduct(\u001B[38;5;28mrange\u001B[39m(\u001B[38;5;241m8\u001B[39m), \u001B[38;5;28mrange\u001B[39m(\u001B[38;5;241m8\u001B[39m)):\n\u001B[1;32m---> 31\u001B[0m boards, action \u001B[38;5;241m=\u001B[39m \u001B[38;5;241m0\u001B[39m\n\u001B[0;32m 32\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mneural_network\u001B[38;5;241m.\u001B[39mforword(boards)\n",
|
||||
"\u001B[1;31mTypeError\u001B[0m: cannot unpack non-iterable int object"
|
||||
"cell_type": "code",
|
||||
"execution_count": 84,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def build_symetry_action(board_history, action_history):\n",
|
||||
" simulated_boards2[::2] *= -1\n",
|
||||
" q_learning_format = np.zeros((2,2,2, SIMULATE_TURNS, board_history.shape[1], 2, 8, 8))\n",
|
||||
" q_learning_format[0, 0, 0, :, :, :, :, :] = action_to_q_learning_format(board_history, action_history)\n",
|
||||
" q_learning_format[1, 0, 0, :, :, :, :, :] = np.transpose(q_learning_format[0, 0, 0, :, :, :, :, :], [0, 1, 2, 4, 3])\n",
|
||||
" q_learning_format[:, 1, 0, :, :, :, :, :] = q_learning_format[:, 0, 0, :, :, :, ::-1, :]\n",
|
||||
" q_learning_format[:, :, 1, :, :, :, :, :] = q_learning_format[:, :, 0, :, :, :, :, ::-1]\n",
|
||||
" return q_learning_format"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 140,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"5600"
|
||||
]
|
||||
},
|
||||
"execution_count": 140,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
@@ -2026,30 +2060,64 @@
|
||||
" ):\n",
|
||||
" super().__init__(epsilon)\n",
|
||||
" assert 0 <= gamma <= 1\n",
|
||||
" self.gamma = gamma\n",
|
||||
" self.symmetry_mode = symmetry_mode\n",
|
||||
" self.neural_network = neural_netwerk\n",
|
||||
" self.who_won_fraction = who_won_fraction\n",
|
||||
" self.final_score_fraction = final_score_fraction\n",
|
||||
" self.gamma: str = gamma\n",
|
||||
" self.symmetry_mode: SymmetryMode = symmetry_mode\n",
|
||||
" self.neural_network: DQLNet = neural_netwerk\n",
|
||||
" self.who_won_fraction: final = who_won_fraction\n",
|
||||
" self.final_score_fraction: final = final_score_fraction\n",
|
||||
"\n",
|
||||
" @property\n",
|
||||
" def policy_name(self) -> str:\n",
|
||||
" return \"greedy_policy\"\n",
|
||||
" # name=\"QL-M-G08-WW00-FSF00\n",
|
||||
" symmetry_name = {SymmetryMode.MULTIPLY: \"M\", SymmetryMode.BREAK_SEQUENCE: \"B\"}\n",
|
||||
" g = f\"{self.gamma:.1f}\".replace(\".\", \"\")\n",
|
||||
" ww = f\"{self.who_won_fraction:.1f}\".replace(\".\", \"\")\n",
|
||||
" fsf = f\"{self.final_score_fraction:.1f}\".replace(\".\", \"\")\n",
|
||||
" return f\"QL-{symmetry_name[self.symmetry_mode]}-G{g}-WW{ww}-FSF{fsf}\"\n",
|
||||
"\n",
|
||||
" def _internal_policy(self, boards: np.ndarray) -> np.ndarray:\n",
|
||||
" q_learning_board = np.zeros((boards.shape[0], 2, 8, 8))\n",
|
||||
" q_learning_board[:, 0, :, :] = boards\n",
|
||||
" results = np.ones_like(boards, dtype=float)\n",
|
||||
" results *= -1\n",
|
||||
" results = torch.from_numpy(results).float()\n",
|
||||
" q_learning_boards = np.zeros((boards.shape[0], 2, 8, 8))\n",
|
||||
" q_learning_boards[:, 0, :, :] = boards\n",
|
||||
" poss_turns = boards == 0 # checks where fields are empty.\n",
|
||||
" poss_turns &= binary_dilation(boards == -1, SURROUNDING)\n",
|
||||
" turn_possible = np.any(poss_turns, axis=0)\n",
|
||||
" print(turn_possible.shape)\n",
|
||||
" for action_x, action_y in itertools.product(range(8), range(8)):\n",
|
||||
" boards, action = 0\n",
|
||||
" return self.neural_network.forword(boards)\n",
|
||||
" if not turn_possible[action_x, action_y]:\n",
|
||||
" continue\n",
|
||||
" _q_learning_board = q_learning_boards[\n",
|
||||
" poss_turns[:, action_x, action_y]\n",
|
||||
" ].copy()\n",
|
||||
" _q_learning_board[:, 1, action_x, action_y] = 1\n",
|
||||
" ql_result = self.neural_network.forward(_q_learning_board)\n",
|
||||
" results[\n",
|
||||
" poss_turns[:, action_x, action_y], action_x, action_y\n",
|
||||
" ] = ql_result.reshape(-1)\n",
|
||||
" return results.cpu().detach().numpy()\n",
|
||||
"\n",
|
||||
" def train_epoch(self, generate_data_size: int):\n",
|
||||
" # generate trainings data\n",
|
||||
" train_boards, train_actions = simulate_game(generate_data_size, [self] * 2)\n",
|
||||
" q_leaning_formated_action = build_symetry_action(train_boards, train_actions)\n",
|
||||
" q_rewords = calculate_q_reword(\n",
|
||||
" board_history=train_boards,\n",
|
||||
" who_won_fraction=self.who_won_fraction,\n",
|
||||
" final_score_fraction=self.final_score_fraction,\n",
|
||||
" )\n",
|
||||
" if self.symmetry_mode == SymmetryMode.MULTIPLY:\n",
|
||||
" q_rewords = np.array([q_rewords] * 8)\n",
|
||||
" elif self.symmetry_mode == SymmetryMode.BREAK_SEQUENCE:\n",
|
||||
" axis1 = np.random.randint(0, high=2, size=SIMULATE_TURNS, dtype=int)\n",
|
||||
" axis2 = np.random.randint(0, high=2, size=SIMULATE_TURNS, dtype=int)\n",
|
||||
" axis3 = np.random.randint(0, high=2, size=SIMULATE_TURNS, dtype=int)\n",
|
||||
" q_leaning_formated_action = q_leaning_formated_action[\n",
|
||||
" axis1, axis2, axis3, range(SIMULATE_TURNS)\n",
|
||||
" ]\n",
|
||||
" a1 = q_leaning_formated_action.reshape(-1, 2, BOARD_SIZE, BOARD_SIZE)\n",
|
||||
" a2 = q_rewords.reshape(-1)\n",
|
||||
" return a1, a2\n",
|
||||
"\n",
|
||||
" def evaluate_model(compare_models: list[GamePolicy]):\n",
|
||||
" for i in range(compare_models):\n",
|
||||
@@ -2064,7 +2132,223 @@
|
||||
" who_won_fraction=0,\n",
|
||||
" final_score_fraction=0,\n",
|
||||
")\n",
|
||||
"ql_policy.train_epoch(100)"
|
||||
"a1, a2 = ql_policy.train_epoch(10)\n",
|
||||
"a1.shape[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 141,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(5600,)"
|
||||
]
|
||||
},
|
||||
"execution_count": 141,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"a2.shape"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 142,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"(5600, 2, 8, 8)"
|
||||
]
|
||||
},
|
||||
"execution_count": 142,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"a1.shape"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 143,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"700"
|
||||
]
|
||||
},
|
||||
"execution_count": 143,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ql_policy = QLPoicy(\n",
|
||||
" 0.95,\n",
|
||||
" neural_netwerk=DQLNet(),\n",
|
||||
" symmetry_mode=SymmetryMode.BREAK_SEQUENCE,\n",
|
||||
" gamma=0.8,\n",
|
||||
" who_won_fraction=0,\n",
|
||||
" final_score_fraction=0,\n",
|
||||
")\n",
|
||||
"ql_policy.train_epoch(10)[0].shape[0]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 44,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "NotImplementedError",
|
||||
"evalue": "",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
|
||||
"\u001B[1;31mNotImplementedError\u001B[0m Traceback (most recent call last)",
|
||||
"Cell \u001B[1;32mIn[44], line 1\u001B[0m\n\u001B[1;32m----> 1\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mNotImplementedError\u001B[39;00m()\n",
|
||||
"\u001B[1;31mNotImplementedError\u001B[0m: "
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"raise NotImplementedError()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Train a model"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 46,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"simulated_boards, simulated_actions = simulate_game(100, [RandomPolicy(0)] * 2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 49,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"array([[[ 1, 1, 1, ..., 1, 1, 1],\n",
|
||||
" [ 1, -1, -1, ..., 1, 1, 1],\n",
|
||||
" [ 1, -1, -1, ..., 1, 1, 1],\n",
|
||||
" ...,\n",
|
||||
" [ 1, -1, 1, ..., 1, -1, 1],\n",
|
||||
" [ 1, -1, 1, ..., -1, 1, 1],\n",
|
||||
" [-1, 1, 1, ..., 1, 1, 1]],\n",
|
||||
"\n",
|
||||
" [[ 1, 1, 1, ..., 1, 1, -1],\n",
|
||||
" [-1, -1, -1, ..., -1, -1, -1],\n",
|
||||
" [-1, -1, 1, ..., 1, 1, -1],\n",
|
||||
" ...,\n",
|
||||
" [-1, -1, -1, ..., -1, 1, 1],\n",
|
||||
" [-1, -1, -1, ..., 1, 1, 1],\n",
|
||||
" [-1, -1, -1, ..., 1, 1, 1]],\n",
|
||||
"\n",
|
||||
" [[-1, -1, -1, ..., -1, -1, 1],\n",
|
||||
" [-1, 1, 1, ..., -1, 1, 1],\n",
|
||||
" [-1, 1, 1, ..., 1, 1, 1],\n",
|
||||
" ...,\n",
|
||||
" [ 1, 1, 1, ..., 1, 1, 1],\n",
|
||||
" [ 1, 1, 1, ..., 1, 1, 1],\n",
|
||||
" [-1, -1, -1, ..., 1, 1, 1]],\n",
|
||||
"\n",
|
||||
" ...,\n",
|
||||
"\n",
|
||||
" [[-1, -1, -1, ..., 1, 1, 1],\n",
|
||||
" [ 1, 1, 1, ..., 1, 1, 1],\n",
|
||||
" [ 1, -1, -1, ..., 1, 1, 1],\n",
|
||||
" ...,\n",
|
||||
" [-1, -1, 1, ..., -1, -1, -1],\n",
|
||||
" [-1, -1, 1, ..., -1, -1, -1],\n",
|
||||
" [-1, -1, 1, ..., -1, -1, -1]],\n",
|
||||
"\n",
|
||||
" [[ 1, 1, 1, ..., 1, 1, 1],\n",
|
||||
" [ 1, 1, 1, ..., 1, 1, -1],\n",
|
||||
" [ 1, -1, -1, ..., 1, -1, -1],\n",
|
||||
" ...,\n",
|
||||
" [ 1, 1, -1, ..., 1, -1, -1],\n",
|
||||
" [ 1, 1, 1, ..., -1, -1, -1],\n",
|
||||
" [-1, -1, -1, ..., -1, -1, -1]],\n",
|
||||
"\n",
|
||||
" [[ 1, 1, 1, ..., 1, 1, -1],\n",
|
||||
" [ 1, 1, 1, ..., 1, 1, -1],\n",
|
||||
" [ 1, 1, -1, ..., -1, 1, 1],\n",
|
||||
" ...,\n",
|
||||
" [-1, -1, -1, ..., -1, 1, 1],\n",
|
||||
" [-1, -1, -1, ..., -1, -1, 1],\n",
|
||||
" [-1, -1, -1, ..., -1, -1, -1]]], dtype=int8)"
|
||||
]
|
||||
},
|
||||
"execution_count": 49,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"simulated_boards[-1]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# ql_policy._internal_policy(get_new_games(3))\n",
|
||||
"%timeit ql_policy.train_epoch(100)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"ql_policy.__dict__[\"neural_network\"].forward("
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"tags": []
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"new_games(1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -2085,13 +2369,6 @@
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
@@ -2187,6 +2464,26 @@
|
||||
"* Image for 8 directions [https://www.researchgate.net/journal/EURASIP-Journal-on-Image-and-Video-Processing-1687-5281](https://www.researchgate.net/journal/EURASIP-Journal-on-Image-and-Video-Processing-1687-5281)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import sys\n",
|
||||
"def sizeof_fmt(num, suffix='B'):\n",
|
||||
" ''' by Fred Cirera, https://stackoverflow.com/a/1094933/1870254, modified'''\n",
|
||||
" for unit in ['','Ki','Mi','Gi','Ti','Pi','Ei','Zi']:\n",
|
||||
" if abs(num) < 1024.0:\n",
|
||||
" return \"%3.1f %s%s\" % (num, unit, suffix)\n",
|
||||
" num /= 1024.0\n",
|
||||
" return \"%.1f %s%s\" % (num, 'Yi', suffix)\n",
|
||||
"\n",
|
||||
"for name, size in sorted(((name, sys.getsizeof(value)) for name, value in list(\n",
|
||||
" locals().items())), key= lambda x: -x[1])[:10]:\n",
|
||||
" print(\"{:>30}: {:>8}\".format(name, sizeof_fmt(size)))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
|
||||
Reference in new issue
Block a user