Изучив основы нейронных сетей, я хочу создать небольшой, но уникальный проект (более сложный, чем рукописные цифры и т. Д. c). Я решил реализовать бесконечную игру раннеров, записывать свои ходы и тренировать нейронную сеть с собранными данными.
Игра выглядит так:
Игрок может двигаться вправо и влево (стрелки), цель состоит в том, чтобы избежать астероидов. Когда игрок нажимает стрелку влево, записываются координаты всех астероидов, положение игрока и движение влево. Когда игрок нажимает стрелку вправо, происходит то же самое, но «движение» устанавливается вправо. У меня была проблема с выяснением того, как записывать отсутствие движения, поэтому я кодировал его, чтобы записывать отсутствие движения (прямо), когда нажимаю стрелку вверх. Поэтому, когда я не двигался, я нажимал стрелку вверх (в среднем темпе)
Может быть максимум 20 астероидов, но я собрал данные для меньшего набора данных, чтобы посмотреть, как он работает.
Собранные данные выглядят так:
Как видно в первом ряду, имеется 42 столбца , 20 столбцов для x-координат всех астероидов на доске. 20 столбцов для y-координат всех астероидов на доске. 1 столбец для x-координаты игрока 1 столбец для хода (0 - слева; 1 - справа; 2 - прямо, без движения)
Я собрал 4042 выборки: 1140 слева 1122 справа 1780 прямо
Как я уже говорил, я подготовил его для обработки 20 астероидов, но я собрал данные только по нескольким из них, поэтому остальные столбцы заполнены нулями.
Я использовал тензорный поток для обучить нейронную сеть
data = pd.read_csv('collected_data.csv')
y = data['move']
x = data.drop('move', axis=1)
x_train = x.to_numpy()
y_train = y.to_numpy()
x_train = tf.keras.utils.normalize(x_train, axis=1)
model = tf.keras.Sequential([
tf.keras.layers.Dense(41,activation='hard_sigmoid',input_shape=x_train[0].shape),
tf.keras.layers.Dense(41, activation='hard_sigmoid'),
tf.keras.layers.Dense(41, activation='hard_sigmoid'),
tf.keras.layers.Dense(3,activation='hard_sigmoid')
])
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10)
model.save('model.h5')
Результат:
Моя модель не подходит на всех. Когда я запускаю игру, космический корабль вообще не движется, всегда выбирая go прямо. Я пробовал разные архитектуры нейронных сетей, больше слоев, меньше слоев и т.д. c. но это почти не меняет результат. У меня недостаточно данных? Данные слишком сложны? Я выбрал не ту модель? Буду благодарен за любые советы. Спасибо!