yazodi commited on
Commit
5d68932
·
verified ·
1 Parent(s): 7530921

Upload 8 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ joystick_move_model.keras filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,20 +1,83 @@
1
- ---
2
- title: Street Fighter Move Recognizer
3
- emoji: 🚀
4
- colorFrom: red
5
- colorTo: red
6
- sdk: docker
7
- app_port: 8501
8
- tags:
9
- - streamlit
10
- pinned: false
11
- short_description: Streamlit template space
12
- license: mit
13
- ---
14
-
15
- # Welcome to Streamlit!
16
-
17
- Edit `/src/streamlit_app.py` to customize this app to your heart's desire. :heart:
18
-
19
- If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community
20
- forums](https://discuss.streamlit.io).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ tags:
3
+ - deep-learning
4
+ - lstm
5
+ - game-ai
6
+ - sequence-classification
7
+ - streamlit-app
8
+ ---
9
+
10
+ # 🎮 Street Fighter Move Recognizer
11
+
12
+ Bu proje, joystick kombinasyonlarını analiz ederek oyuncunun hangi **özel hareketi** yapmak istediğini tahmin eden bir makine öğrenimi modelini içermektedir. Veri simüle edilmiştir ve Street Fighter benzeri dövüş oyunlarından esinlenilmiştir.
13
+
14
+ ## 🧠 Proje Hedefi
15
+
16
+ Joystick sekanslarından (`["DOWN", "RIGHT", "PUNCH"]` gibi) yola çıkarak hangi **move (hareket)** yapıldığını sınıflandıran bir sekans model geliştirmek. Bu, oyun AI sistemlerinin temel yapı taşlarından biridir.
17
+
18
+ ---
19
+
20
+ ## 📊 Kullanılan Veri
21
+
22
+ Veri seti manuel olarak oluşturulmuştur ve aşağıdaki gibi örnek joystick girişlerinden ve etiketli hareket isimlerinden oluşur:
23
+
24
+ | Joystick Sequence | Move |
25
+ |-----------------------------|----------------|
26
+ | DOWN,RIGHT,PUNCH | Hadouken |
27
+ | RIGHT,DOWN,RIGHT,KICK | Shoryuken |
28
+ | LEFT,LEFT,PUNCH | Dash Punch |
29
+ | DOWN,KICK | Low Kick |
30
+ | LEFT,DOWN,RIGHT,PUNCH | Combo Strike |
31
+ | ... | ... |
32
+
33
+ ---
34
+
35
+ ## 🔧 Kullanılan Teknolojiler
36
+
37
+ - **TensorFlow / Keras** – LSTM model ile sekans sınıflandırma
38
+ - **scikit-learn** – LabelEncoder
39
+ - **Streamlit** – Web arayüzü
40
+ - **Pickle** – Model nesnelerinin kaydedilmesi
41
+ - **Hugging Face Hub** – Model paylaşımı
42
+ - **GitHub** – Kod ve dokümantasyon paylaşımı
43
+
44
+ ---
45
+
46
+ ## 🏗️ Model Mimarisi
47
+
48
+ - `Tokenizer` ile joystick girişleri tokenize edildi
49
+ - `pad_sequences` ile sabit uzunlukta girişe dönüştürüldü
50
+ - `LSTM` tabanlı sekans modeli eğitildi
51
+ - `LabelEncoder` ile sınıf etiketleri dönüştürüldü
52
+ - Model `.keras`, `tokenizer.pkl`, `label_encoder.pkl` olarak kaydedildi
53
+
54
+ ---
55
+
56
+ ## 🚀 Streamlit Uygulaması
57
+
58
+ Kullanıcıdan joystick kombinasyonu alınır ve model ile eşleşen hareket tahmin edilir.
59
+
60
+ ### Uygulamayı Başlatmak İçin:
61
+ ```bash
62
+ streamlit run app.py
63
+
64
+
65
+ 🔬 Örnek Tahmin
66
+ DOWN,RIGHT,PUNCH
67
+ Çıktı:
68
+ Tahmin Edilen Hareket: Hadouken
69
+
70
+
71
+
72
+ 💡 Gelecekte Ne Yapılabilir?
73
+ Gerçek zamanlı joystick verisi entegrasyonu
74
+
75
+ Sesli komut tanıma ile komboları tetikleme
76
+
77
+ Mobil uyumlu arayüz
78
+
79
+ Daha fazla kombo ile veri setinin genişletilmesi
80
+
81
+
82
+ 📚 Eğitim Amaçlıdır
83
+ Bu proje, oyun zekası ve sekans modellemeyi birleştiren bir örnek olarak eğitim amaçlı geliştirilmiştir.
Street Fighter Move Recognizer.ipynb ADDED
@@ -0,0 +1,480 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "a38a8be9-9f57-4d4e-b101-704e636db4fe",
7
+ "metadata": {},
8
+ "outputs": [
9
+ {
10
+ "name": "stdout",
11
+ "output_type": "stream",
12
+ "text": [
13
+ "Requirement already satisfied: tensorflow in c:\\programdata\\anaconda3\\lib\\site-packages (2.19.0)\n",
14
+ "Requirement already satisfied: scikit-learn in c:\\programdata\\anaconda3\\lib\\site-packages (1.6.1)\n",
15
+ "Requirement already satisfied: pandas in c:\\programdata\\anaconda3\\lib\\site-packages (2.2.3)\n",
16
+ "Requirement already satisfied: absl-py>=1.0.0 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorflow) (2.1.0)\n",
17
+ "Requirement already satisfied: astunparse>=1.6.0 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorflow) (1.6.3)\n",
18
+ "Requirement already satisfied: flatbuffers>=24.3.25 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorflow) (25.2.10)\n",
19
+ "Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorflow) (0.6.0)\n",
20
+ "Requirement already satisfied: google-pasta>=0.1.1 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorflow) (0.2.0)\n",
21
+ "Requirement already satisfied: libclang>=13.0.0 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorflow) (18.1.1)\n",
22
+ "Requirement already satisfied: opt-einsum>=2.3.2 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorflow) (3.4.0)\n",
23
+ "Requirement already satisfied: packaging in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (24.2)\n",
24
+ "Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<6.0.0dev,>=3.20.3 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (5.29.3)\n",
25
+ "Requirement already satisfied: requests<3,>=2.21.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (2.32.3)\n",
26
+ "Requirement already satisfied: setuptools in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (72.1.0)\n",
27
+ "Requirement already satisfied: six>=1.12.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (1.17.0)\n",
28
+ "Requirement already satisfied: termcolor>=1.1.0 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorflow) (2.5.0)\n",
29
+ "Requirement already satisfied: typing-extensions>=3.6.6 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorflow) (4.12.2)\n",
30
+ "Requirement already satisfied: wrapt>=1.11.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (1.17.0)\n",
31
+ "Requirement already satisfied: grpcio<2.0,>=1.24.3 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (1.71.0)\n",
32
+ "Requirement already satisfied: tensorboard~=2.19.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (2.19.0)\n",
33
+ "Requirement already satisfied: keras>=3.5.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (3.10.0)\n",
34
+ "Requirement already satisfied: numpy<2.2.0,>=1.26.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (1.26.4)\n",
35
+ "Requirement already satisfied: h5py>=3.11.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (3.12.1)\n",
36
+ "Requirement already satisfied: ml-dtypes<1.0.0,>=0.5.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorflow) (0.5.1)\n",
37
+ "Requirement already satisfied: scipy>=1.6.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn) (1.13.1)\n",
38
+ "Requirement already satisfied: joblib>=1.2.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn) (1.4.2)\n",
39
+ "Requirement already satisfied: threadpoolctl>=3.1.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from scikit-learn) (3.5.0)\n",
40
+ "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas) (2.9.0.post0)\n",
41
+ "Requirement already satisfied: pytz>=2020.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas) (2024.1)\n",
42
+ "Requirement already satisfied: tzdata>=2022.7 in c:\\programdata\\anaconda3\\lib\\site-packages (from pandas) (2023.3)\n",
43
+ "Requirement already satisfied: wheel<1.0,>=0.23.0 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from astunparse>=1.6.0->tensorflow) (0.45.1)\n",
44
+ "Requirement already satisfied: rich in c:\\programdata\\anaconda3\\lib\\site-packages (from keras>=3.5.0->tensorflow) (13.9.4)\n",
45
+ "Requirement already satisfied: namex in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from keras>=3.5.0->tensorflow) (0.0.8)\n",
46
+ "Requirement already satisfied: optree in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from keras>=3.5.0->tensorflow) (0.14.0)\n",
47
+ "Requirement already satisfied: charset-normalizer<4,>=2 in c:\\programdata\\anaconda3\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow) (3.3.2)\n",
48
+ "Requirement already satisfied: idna<4,>=2.5 in c:\\programdata\\anaconda3\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow) (3.7)\n",
49
+ "Requirement already satisfied: urllib3<3,>=1.21.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow) (2.3.0)\n",
50
+ "Requirement already satisfied: certifi>=2017.4.17 in c:\\programdata\\anaconda3\\lib\\site-packages (from requests<3,>=2.21.0->tensorflow) (2025.1.31)\n",
51
+ "Requirement already satisfied: markdown>=2.6.8 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorboard~=2.19.0->tensorflow) (3.4.1)\n",
52
+ "Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in c:\\users\\lgr\\appdata\\roaming\\python\\python312\\site-packages (from tensorboard~=2.19.0->tensorflow) (0.7.2)\n",
53
+ "Requirement already satisfied: werkzeug>=1.0.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from tensorboard~=2.19.0->tensorflow) (3.1.3)\n",
54
+ "Requirement already satisfied: MarkupSafe>=2.1.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from werkzeug>=1.0.1->tensorboard~=2.19.0->tensorflow) (3.0.2)\n",
55
+ "Requirement already satisfied: markdown-it-py>=2.2.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from rich->keras>=3.5.0->tensorflow) (2.2.0)\n",
56
+ "Requirement already satisfied: pygments<3.0.0,>=2.13.0 in c:\\programdata\\anaconda3\\lib\\site-packages (from rich->keras>=3.5.0->tensorflow) (2.15.1)\n",
57
+ "Requirement already satisfied: mdurl~=0.1 in c:\\programdata\\anaconda3\\lib\\site-packages (from markdown-it-py>=2.2.0->rich->keras>=3.5.0->tensorflow) (0.1.0)\n",
58
+ "Note: you may need to restart the kernel to use updated packages.\n"
59
+ ]
60
+ }
61
+ ],
62
+ "source": [
63
+ "pip install tensorflow scikit-learn pandas\n"
64
+ ]
65
+ },
66
+ {
67
+ "cell_type": "code",
68
+ "execution_count": 2,
69
+ "id": "0b044499-8bd6-4e40-84b9-2d7f22c180b1",
70
+ "metadata": {},
71
+ "outputs": [],
72
+ "source": [
73
+ "import pandas as pd\n",
74
+ "\n",
75
+ "data = {\n",
76
+ " \"sequence\": [\n",
77
+ " \"DOWN,RIGHT,PUNCH\",\n",
78
+ " \"RIGHT,DOWN,RIGHT,KICK\",\n",
79
+ " \"LEFT,LEFT,PUNCH\",\n",
80
+ " \"DOWN,KICK\",\n",
81
+ " \"UP,PUNCH\",\n",
82
+ " \"RIGHT,RIGHT,KICK\",\n",
83
+ " \"DOWN,DOWN,RIGHT,PUNCH\",\n",
84
+ " \"LEFT,DOWN,RIGHT,PUNCH\"\n",
85
+ " ],\n",
86
+ " \"move\": [\n",
87
+ " \"Hadouken\",\n",
88
+ " \"Shoryuken\",\n",
89
+ " \"Dash Punch\",\n",
90
+ " \"Low Kick\",\n",
91
+ " \"Jump Punch\",\n",
92
+ " \"Double Kick\",\n",
93
+ " \"Super Hadouken\",\n",
94
+ " \"Combo Strike\"\n",
95
+ " ]\n",
96
+ "}\n",
97
+ "\n",
98
+ "df = pd.DataFrame(data)\n"
99
+ ]
100
+ },
101
+ {
102
+ "cell_type": "code",
103
+ "execution_count": 3,
104
+ "id": "606f2fd1-42b8-49f0-87b7-cc2f5c450662",
105
+ "metadata": {},
106
+ "outputs": [],
107
+ "source": [
108
+ "# Tokenizer ve Label Encoding\n",
109
+ "\n",
110
+ "from sklearn.preprocessing import LabelEncoder\n",
111
+ "from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
112
+ "from tensorflow.keras.preprocessing.text import Tokenizer\n",
113
+ "\n",
114
+ "# Joystick hareketlerini tokenize et\n",
115
+ "tokenizer = Tokenizer(filters='', lower=False, split=',')\n",
116
+ "tokenizer.fit_on_texts(df['sequence'])\n",
117
+ "\n",
118
+ "X_seq = tokenizer.texts_to_sequences(df['sequence'])\n",
119
+ "X_pad = pad_sequences(X_seq, padding='post') # sekansları eşitle\n",
120
+ "\n",
121
+ "# Etiketleri sayısallaştır\n",
122
+ "le = LabelEncoder()\n",
123
+ "y_encoded = le.fit_transform(df['move'])\n",
124
+ "\n",
125
+ "# Bilgiler\n",
126
+ "vocab_size = len(tokenizer.word_index) + 1\n",
127
+ "num_classes = len(le.classes_)\n"
128
+ ]
129
+ },
130
+ {
131
+ "cell_type": "code",
132
+ "execution_count": 4,
133
+ "id": "e654d9b3-faea-4888-a4a3-e3cc6b762940",
134
+ "metadata": {},
135
+ "outputs": [
136
+ {
137
+ "name": "stdout",
138
+ "output_type": "stream",
139
+ "text": [
140
+ "Epoch 1/100\n"
141
+ ]
142
+ },
143
+ {
144
+ "name": "stderr",
145
+ "output_type": "stream",
146
+ "text": [
147
+ "C:\\ProgramData\\anaconda3\\Lib\\site-packages\\keras\\src\\layers\\core\\embedding.py:97: UserWarning: Argument `input_length` is deprecated. Just remove it.\n",
148
+ " warnings.warn(\n"
149
+ ]
150
+ },
151
+ {
152
+ "name": "stdout",
153
+ "output_type": "stream",
154
+ "text": [
155
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 2s/step - accuracy: 0.2500 - loss: 2.0767\n",
156
+ "Epoch 2/100\n",
157
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 51ms/step - accuracy: 0.2500 - loss: 2.0758\n",
158
+ "Epoch 3/100\n",
159
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step - accuracy: 0.3750 - loss: 2.0749\n",
160
+ "Epoch 4/100\n",
161
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 53ms/step - accuracy: 0.5000 - loss: 2.0739\n",
162
+ "Epoch 5/100\n",
163
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 54ms/step - accuracy: 0.6250 - loss: 2.0730\n",
164
+ "Epoch 6/100\n",
165
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 0.5000 - loss: 2.0720\n",
166
+ "Epoch 7/100\n",
167
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.6250 - loss: 2.0710\n",
168
+ "Epoch 8/100\n",
169
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step - accuracy: 0.5000 - loss: 2.0699\n",
170
+ "Epoch 9/100\n",
171
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 0.5000 - loss: 2.0689\n",
172
+ "Epoch 10/100\n",
173
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 56ms/step - accuracy: 0.5000 - loss: 2.0677\n",
174
+ "Epoch 11/100\n",
175
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 78ms/step - accuracy: 0.5000 - loss: 2.0665\n",
176
+ "Epoch 12/100\n",
177
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 56ms/step - accuracy: 0.5000 - loss: 2.0653\n",
178
+ "Epoch 13/100\n",
179
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.6250 - loss: 2.0640\n",
180
+ "Epoch 14/100\n",
181
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 46ms/step - accuracy: 0.6250 - loss: 2.0626\n",
182
+ "Epoch 15/100\n",
183
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 45ms/step - accuracy: 0.6250 - loss: 2.0612\n",
184
+ "Epoch 16/100\n",
185
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 46ms/step - accuracy: 0.6250 - loss: 2.0597\n",
186
+ "Epoch 17/100\n",
187
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 0.6250 - loss: 2.0581\n",
188
+ "Epoch 18/100\n",
189
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 0.6250 - loss: 2.0564\n",
190
+ "Epoch 19/100\n",
191
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 0.6250 - loss: 2.0546\n",
192
+ "Epoch 20/100\n",
193
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 45ms/step - accuracy: 0.6250 - loss: 2.0527\n",
194
+ "Epoch 21/100\n",
195
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 44ms/step - accuracy: 0.6250 - loss: 2.0508\n",
196
+ "Epoch 22/100\n",
197
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 46ms/step - accuracy: 0.6250 - loss: 2.0487\n",
198
+ "Epoch 23/100\n",
199
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 56ms/step - accuracy: 0.6250 - loss: 2.0464\n",
200
+ "Epoch 24/100\n",
201
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 55ms/step - accuracy: 0.6250 - loss: 2.0441\n",
202
+ "Epoch 25/100\n",
203
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 46ms/step - accuracy: 0.6250 - loss: 2.0415\n",
204
+ "Epoch 26/100\n",
205
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step - accuracy: 0.6250 - loss: 2.0389\n",
206
+ "Epoch 27/100\n",
207
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 45ms/step - accuracy: 0.6250 - loss: 2.0361\n",
208
+ "Epoch 28/100\n",
209
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 45ms/step - accuracy: 0.6250 - loss: 2.0331\n",
210
+ "Epoch 29/100\n",
211
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 46ms/step - accuracy: 0.6250 - loss: 2.0299\n",
212
+ "Epoch 30/100\n",
213
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 44ms/step - accuracy: 0.6250 - loss: 2.0265\n",
214
+ "Epoch 31/100\n",
215
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 42ms/step - accuracy: 0.6250 - loss: 2.0229\n",
216
+ "Epoch 32/100\n",
217
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 42ms/step - accuracy: 0.6250 - loss: 2.0191\n",
218
+ "Epoch 33/100\n",
219
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step - accuracy: 0.6250 - loss: 2.0151\n",
220
+ "Epoch 34/100\n",
221
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 42ms/step - accuracy: 0.6250 - loss: 2.0108\n",
222
+ "Epoch 35/100\n",
223
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 52ms/step - accuracy: 0.6250 - loss: 2.0062\n",
224
+ "Epoch 36/100\n",
225
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 50ms/step - accuracy: 0.6250 - loss: 2.0013\n",
226
+ "Epoch 37/100\n",
227
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.6250 - loss: 1.9961\n",
228
+ "Epoch 38/100\n",
229
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.6250 - loss: 1.9906\n",
230
+ "Epoch 39/100\n",
231
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 44ms/step - accuracy: 0.6250 - loss: 1.9848\n",
232
+ "Epoch 40/100\n",
233
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 44ms/step - accuracy: 0.7500 - loss: 1.9785\n",
234
+ "Epoch 41/100\n",
235
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 0.8750 - loss: 1.9719\n",
236
+ "Epoch 42/100\n",
237
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 103ms/step - accuracy: 0.8750 - loss: 1.9649\n",
238
+ "Epoch 43/100\n",
239
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 72ms/step - accuracy: 0.8750 - loss: 1.9574\n",
240
+ "Epoch 44/100\n",
241
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 57ms/step - accuracy: 0.8750 - loss: 1.9494\n",
242
+ "Epoch 45/100\n",
243
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 55ms/step - accuracy: 0.8750 - loss: 1.9410\n",
244
+ "Epoch 46/100\n",
245
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 55ms/step - accuracy: 0.8750 - loss: 1.9320\n",
246
+ "Epoch 47/100\n",
247
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 53ms/step - accuracy: 0.8750 - loss: 1.9225\n",
248
+ "Epoch 48/100\n",
249
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 57ms/step - accuracy: 0.8750 - loss: 1.9123\n",
250
+ "Epoch 49/100\n",
251
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 65ms/step - accuracy: 0.8750 - loss: 1.9016\n",
252
+ "Epoch 50/100\n",
253
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 102ms/step - accuracy: 0.8750 - loss: 1.8902\n",
254
+ "Epoch 51/100\n",
255
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 61ms/step - accuracy: 0.8750 - loss: 1.8781\n",
256
+ "Epoch 52/100\n",
257
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 54ms/step - accuracy: 0.8750 - loss: 1.8653\n",
258
+ "Epoch 53/100\n",
259
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 0.8750 - loss: 1.8517\n",
260
+ "Epoch 54/100\n",
261
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 0.8750 - loss: 1.8374\n",
262
+ "Epoch 55/100\n",
263
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 54ms/step - accuracy: 0.8750 - loss: 1.8223\n",
264
+ "Epoch 56/100\n",
265
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.7500 - loss: 1.8063\n",
266
+ "Epoch 57/100\n",
267
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 52ms/step - accuracy: 0.7500 - loss: 1.7895\n",
268
+ "Epoch 58/100\n",
269
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 0.7500 - loss: 1.7718\n",
270
+ "Epoch 59/100\n",
271
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 0.7500 - loss: 1.7532\n",
272
+ "Epoch 60/100\n",
273
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 51ms/step - accuracy: 0.7500 - loss: 1.7338\n",
274
+ "Epoch 61/100\n",
275
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 52ms/step - accuracy: 0.7500 - loss: 1.7134\n",
276
+ "Epoch 62/100\n",
277
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 0.7500 - loss: 1.6922\n",
278
+ "Epoch 63/100\n",
279
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.7500 - loss: 1.6701\n",
280
+ "Epoch 64/100\n",
281
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 0.7500 - loss: 1.6471\n",
282
+ "Epoch 65/100\n",
283
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 50ms/step - accuracy: 0.7500 - loss: 1.6233\n",
284
+ "Epoch 66/100\n",
285
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 60ms/step - accuracy: 0.7500 - loss: 1.5988\n",
286
+ "Epoch 67/100\n",
287
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 69ms/step - accuracy: 0.7500 - loss: 1.5735\n",
288
+ "Epoch 68/100\n",
289
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 57ms/step - accuracy: 0.7500 - loss: 1.5476\n",
290
+ "Epoch 69/100\n",
291
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 50ms/step - accuracy: 0.7500 - loss: 1.5211\n",
292
+ "Epoch 70/100\n",
293
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 56ms/step - accuracy: 0.7500 - loss: 1.4941\n",
294
+ "Epoch 71/100\n",
295
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 50ms/step - accuracy: 0.7500 - loss: 1.4667\n",
296
+ "Epoch 72/100\n",
297
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.7500 - loss: 1.4390\n",
298
+ "Epoch 73/100\n",
299
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 0.7500 - loss: 1.4110\n",
300
+ "Epoch 74/100\n",
301
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.7500 - loss: 1.3829\n",
302
+ "Epoch 75/100\n",
303
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 52ms/step - accuracy: 0.7500 - loss: 1.3547\n",
304
+ "Epoch 76/100\n",
305
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 0.7500 - loss: 1.3266\n",
306
+ "Epoch 77/100\n",
307
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 0.7500 - loss: 1.2986\n",
308
+ "Epoch 78/100\n",
309
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.7500 - loss: 1.2707\n",
310
+ "Epoch 79/100\n",
311
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 52ms/step - accuracy: 0.7500 - loss: 1.2430\n",
312
+ "Epoch 80/100\n",
313
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 50ms/step - accuracy: 0.7500 - loss: 1.2157\n",
314
+ "Epoch 81/100\n",
315
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 0.8750 - loss: 1.1886\n",
316
+ "Epoch 82/100\n",
317
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 1.0000 - loss: 1.1618\n",
318
+ "Epoch 83/100\n",
319
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 50ms/step - accuracy: 1.0000 - loss: 1.1354\n",
320
+ "Epoch 84/100\n",
321
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 1.0000 - loss: 1.1093\n",
322
+ "Epoch 85/100\n",
323
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 1.0000 - loss: 1.0835\n",
324
+ "Epoch 86/100\n",
325
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 56ms/step - accuracy: 1.0000 - loss: 1.0581\n",
326
+ "Epoch 87/100\n",
327
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 74ms/step - accuracy: 1.0000 - loss: 1.0330\n",
328
+ "Epoch 88/100\n",
329
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 55ms/step - accuracy: 1.0000 - loss: 1.0082\n",
330
+ "Epoch 89/100\n",
331
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 1.0000 - loss: 0.9838\n",
332
+ "Epoch 90/100\n",
333
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 1.0000 - loss: 0.9596\n",
334
+ "Epoch 91/100\n",
335
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 1.0000 - loss: 0.9357\n",
336
+ "Epoch 92/100\n",
337
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 1.0000 - loss: 0.9121\n",
338
+ "Epoch 93/100\n",
339
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - accuracy: 1.0000 - loss: 0.8888\n",
340
+ "Epoch 94/100\n",
341
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 50ms/step - accuracy: 1.0000 - loss: 0.8656\n",
342
+ "Epoch 95/100\n",
343
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 1.0000 - loss: 0.8427\n",
344
+ "Epoch 96/100\n",
345
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 1.0000 - loss: 0.8199\n",
346
+ "Epoch 97/100\n",
347
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 51ms/step - accuracy: 1.0000 - loss: 0.7974\n",
348
+ "Epoch 98/100\n",
349
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 48ms/step - accuracy: 1.0000 - loss: 0.7750\n",
350
+ "Epoch 99/100\n",
351
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 49ms/step - accuracy: 1.0000 - loss: 0.7527\n",
352
+ "Epoch 100/100\n",
353
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 46ms/step - accuracy: 1.0000 - loss: 0.7307\n"
354
+ ]
355
+ },
356
+ {
357
+ "data": {
358
+ "text/plain": [
359
+ "<keras.src.callbacks.history.History at 0x230194c7410>"
360
+ ]
361
+ },
362
+ "execution_count": 4,
363
+ "metadata": {},
364
+ "output_type": "execute_result"
365
+ }
366
+ ],
367
+ "source": [
368
+ " # LSTM Modeli Oluştur ve Eğit\n",
369
+ "from tensorflow.keras.models import Sequential\n",
370
+ "from tensorflow.keras.layers import Embedding, LSTM, Dense\n",
371
+ "\n",
372
+ "model = Sequential([\n",
373
+ " Embedding(input_dim=vocab_size, output_dim=16, input_length=X_pad.shape[1]),\n",
374
+ " LSTM(32),\n",
375
+ " Dense(num_classes, activation='softmax')\n",
376
+ "])\n",
377
+ "\n",
378
+ "model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n",
379
+ "model.fit(X_pad, y_encoded, epochs=100, verbose=1)\n"
380
+ ]
381
+ },
382
+ {
383
+ "cell_type": "code",
384
+ "execution_count": 6,
385
+ "id": "f5d9bb8c-c4da-45f9-93d6-23f083368c05",
386
+ "metadata": {},
387
+ "outputs": [
388
+ {
389
+ "name": "stdout",
390
+ "output_type": "stream",
391
+ "text": [
392
+ "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 165ms/step\n"
393
+ ]
394
+ },
395
+ {
396
+ "data": {
397
+ "text/plain": [
398
+ "'Hadouken'"
399
+ ]
400
+ },
401
+ "execution_count": 6,
402
+ "metadata": {},
403
+ "output_type": "execute_result"
404
+ }
405
+ ],
406
+ "source": [
407
+ "# Tahmin Fonksiyonu\n",
408
+ "\n",
409
+ "import numpy as np\n",
410
+ "\n",
411
+ "def predict_move(sequence_text):\n",
412
+ " seq = tokenizer.texts_to_sequences([sequence_text])\n",
413
+ " pad = pad_sequences(seq, maxlen=X_pad.shape[1], padding='post')\n",
414
+ " pred = model.predict(pad)\n",
415
+ " label = le.inverse_transform([np.argmax(pred)])\n",
416
+ " return label[0]\n",
417
+ "\n",
418
+ "# Örnek:\n",
419
+ "predict_move(\"DOWN,RIGHT,PUNCH\") # Hadouken\n"
420
+ ]
421
+ },
422
+ {
423
+ "cell_type": "code",
424
+ "execution_count": 7,
425
+ "id": "89a797c1-fa12-4552-951a-4dcede799be8",
426
+ "metadata": {},
427
+ "outputs": [],
428
+ "source": [
429
+ "model.save(\"joystick_move_model.keras\")\n"
430
+ ]
431
+ },
432
+ {
433
+ "cell_type": "code",
434
+ "execution_count": 8,
435
+ "id": "847f55ca-1b05-41f8-a0b8-57af26f1fb90",
436
+ "metadata": {},
437
+ "outputs": [],
438
+ "source": [
439
+ "import pickle\n",
440
+ "\n",
441
+ "# Tokenizer\n",
442
+ "with open(\"tokenizer.pkl\", \"wb\") as f:\n",
443
+ " pickle.dump(tokenizer, f)\n",
444
+ "\n",
445
+ "# LabelEncoder\n",
446
+ "with open(\"label_encoder.pkl\", \"wb\") as f:\n",
447
+ " pickle.dump(le, f)\n"
448
+ ]
449
+ },
450
+ {
451
+ "cell_type": "code",
452
+ "execution_count": null,
453
+ "id": "a8343757-6301-49f2-894f-30ce3df0b601",
454
+ "metadata": {},
455
+ "outputs": [],
456
+ "source": []
457
+ }
458
+ ],
459
+ "metadata": {
460
+ "kernelspec": {
461
+ "display_name": "Python 3 (ipykernel)",
462
+ "language": "python",
463
+ "name": "python3"
464
+ },
465
+ "language_info": {
466
+ "codemirror_mode": {
467
+ "name": "ipython",
468
+ "version": 3
469
+ },
470
+ "file_extension": ".py",
471
+ "mimetype": "text/x-python",
472
+ "name": "python",
473
+ "nbconvert_exporter": "python",
474
+ "pygments_lexer": "ipython3",
475
+ "version": "3.12.9"
476
+ }
477
+ },
478
+ "nbformat": 4,
479
+ "nbformat_minor": 5
480
+ }
app.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import numpy as np
3
+ import pickle
4
+ from tensorflow.keras.models import load_model
5
+ from tensorflow.keras.preprocessing.sequence import pad_sequences
6
+
7
+ # Model ve yardımcı objeleri yükle
8
+ model = load_model("joystick_move_model.keras")
9
+
10
+ with open("tokenizer.pkl", "rb") as f:
11
+ tokenizer = pickle.load(f)
12
+
13
+ with open("label_encoder.pkl", "rb") as f:
14
+ label_encoder = pickle.load(f)
15
+
16
+ # Başlık
17
+ st.title("🎮 Street Fighter Combo Tahmin Edici")
18
+ st.write("Joystick sekansını girin (örn: DOWN,RIGHT,PUNCH)")
19
+
20
+ # Girdi
21
+ user_input = st.text_input("Joystick Kombinasyonu")
22
+
23
+ if st.button("Tahmin Et"):
24
+ if user_input:
25
+ seq = tokenizer.texts_to_sequences([user_input])
26
+ pad = pad_sequences(seq, maxlen=model.input_shape[1], padding='post')
27
+ prediction = model.predict(pad)
28
+ predicted_move = label_encoder.inverse_transform([np.argmax(prediction)])
29
+ st.success(f"🧠 Tahmin Edilen Hareket: **{predicted_move[0]}**")
30
+ else:
31
+ st.warning("Lütfen bir joystick sekansı girin.")
joystick_move_model.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c32b2cc79868a0382d7676868e74dc82742fc57da34d50c34b32da1165cf9ad8
3
+ size 107552
label_encoder.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:13a3481a5f1602de9175c441d031624922af84c6dc641da86862f843ecfe2f78
3
+ size 348
projeözet.txt ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ✅ Proje Özeti: Street Fighter Move Recognizer
2
+ 🎯 Amaç:
3
+ Joystick hareketlerine (örneğin: ⬇️➡️🅱️ gibi) bakarak oyuncunun hangi “özel hareketi” (Hadouken, Shoryuken vb.) yapmak istediğini tahmin eden bir model oluşturmak.
4
+
5
+ 💡 Neden Özel?
6
+ Gerçek zamanlı joystick verilerini taklit ederek çalışır.
7
+
8
+ Sekans verisiyle çalışmak (zaman sıralı girişler).
9
+
10
+ Oyun zekâsı gibi davranmak: Oyuncu hangi hareketi yapıyor?
11
+
12
+ 🛠️ Teknik Yaklaşım:
13
+ Aşama Açıklama
14
+ 1. Veri Üretimi / Toplama Simüle joystick sekansları (örnek: ['DOWN', 'RIGHT', 'PUNCH']) ve bunların karşılığı özel hareket etiketi (Hadouken)
15
+ 2. Veri İşleme Her combo bir sekans (sequence), veri X = ["DOWN", "RIGHT", "PUNCH"], y = "Hadouken" gibi olur
16
+ 3. Modelleme
17
+ Seçenek 1: LSTM / GRU (sekans modelleme için)
18
+ Seçenek 2: 1D CNN (daha hızlı sonuçlar verir)
19
+ Seçenek 3: HMM (Hidden Markov Model, klasik çözüm)
20
+ 4. Model Eğitimi %80 eğitim, %20 test — sınıflandırma problemi
21
+ 5. Değerlendirme Accuracy, confusion matrix ile
22
+ 6. Model Kaydı model.pkl veya .keras olarak
23
+ 7. Streamlit Uygulaması Kullanıcıdan joystick sekansı al → model tahminini göster
24
+ 8. Hugging Face config.json, README.md, model.pkl / .keras, sample_input.json
25
+ 9. GitHub Notebook + app + model + README ile tam repo
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+ 📁 Örnek Combo Dataset (Simülasyon)
38
+ Joystick Sequence Move
39
+ ["DOWN", "RIGHT", "PUNCH"] Hadouken
40
+ ["RIGHT", "DOWN", "RIGHT", "KICK"] Shoryuken
41
+ ["LEFT", "LEFT", "PUNCH"] Dash Punch
42
+ ["DOWN", "KICK"] Low Kick
43
+
44
+ Toplam 5–10 özel hareket tanımıyla başlamak yeterli.
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+ ✅ Evet, Yapabiliriz:
53
+ ✔ Model eğitimi (LSTM / CNN)
54
+
55
+ ✔ Streamlit arayüz (combo tuşları seçtir → tahmini göster)
56
+
57
+ ✔ Hugging Face'e yükleme
58
+
59
+ ✔ GitHub'da paylaşım
60
+
61
+
62
+
63
+
64
+
65
+
requirements.txt CHANGED
@@ -1,3 +1,5 @@
1
- altair
2
- pandas
3
- streamlit
 
 
 
1
+ streamlit
2
+ tensorflow
3
+ scikit-learn
4
+ numpy
5
+ pandas
tokenizer.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5598ce21164b613f7d520d25eeafce1c27a18f54584193aa028914381b003b6b
3
+ size 500