I’m trying to make an AI that plays Snake. I’m new to this stuff and need help picking the right neural network setup.
Here’s what I’ve got:
-
Input: 3 layers of a 10x10 grid (300 total inputs)
- Layer 1: Snake body
- Layer 2: Apple location
- Layer 3: Snake head
-
Output: 4 values for possible moves (up, down, left, right)
Is this a good way to set things up? Any tips on choosing the right network architecture?
I tried something like this:
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(3, 10, 10)),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dense(4, activation='softmax')
])
But I’m not sure if it’s the best approach. What do you think? Should I use convolutional layers instead? Any advice would be awesome!
I’ve experimented with Snake AI before, and your approach is on the right track. However, I’d suggest a few tweaks based on my experience:
-
Convolutional layers can be really effective for grid-based games like Snake. They’re great at picking up spatial patterns.
-
Consider simplifying your input. Instead of 3 separate layers, you could use a single 10x10 grid with different values for empty spaces, snake body, apple, and head. This might make it easier for the network to understand the game state.
-
For the output, you might want to consider using a ‘value’ output alongside the action probabilities. This can help with techniques like reinforcement learning.
Here’s a rough outline of a network that worked well for me:
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(10, 10, 1)),
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(5) # 4 actions + 1 value
])
Remember, the key is to experiment and see what works best for your specific implementation. Good luck with your project!