Я пытаюсь сделать игру Snake, используя алгоритм geneti c и Keras.
Моя проблема сейчас заключается в следующем:
Я создаю начальную популяцию змеи с X генами каждый, где X NUMBER_WEIGHTS:
INPUT = 24
NEURONS_HIDDEN_1 = 16
NEURONS_HIDDEN_2 = 16
OUTPUT = 3
NUMBER_WEIGHTS = INPUT * NEURONS_HIDDEN_1 + NEURONS_HIDDEN_1 * NEURONS_HIDDEN_2 + NEURONS_HIDDEN_2 * OUTPUT
, и я создаю начальную популяцию следующим образом:
population = numpy.random.choice(numpy.arange(-1, 1, step=0.01), size=(config.NUMBER_OF_POPULATION, config.NUMBER_WEIGHTS))
У меня есть цикл for, который для каждой змеи внутри моей популяции начинается скрипт pygame, внутри скрипта pygame у меня есть NN Keras, но я бы хотел передать сгенерированные мной веса в NN.
Мой NN на данный момент такой:
from keras.layers import Dense, Activation
from keras.models import Sequential
from keras.optimizers import SGD
from utils import config
def neural_net(weights):
model = Sequential()
model.add(Dense(config.INPUT, input_shape=(config.INPUT,)))
model.add(Activation('relu'))
# create the dense input layer
# model.add(Dense(config.INPUT, activation=keras.activations.relu(4,), input_dim=4))
# model.add(Activation('sigmoid'))
# create first hidden layer
model.add(Dense(config.NEURONS_HIDDEN_1, input_shape=(config.INPUT,)))
model.add(Activation('relu'))
# create second hidden layer
model.add(Dense(config.NEURONS_HIDDEN_2, input_shape=(config.NEURONS_HIDDEN_1,)))
model.add(Activation('relu'))
# create output layer
model.add(Dense(config.OUTPUT, input_shape=(config.NEURONS_HIDDEN_2,)))
model.add(Activation('softmax'))
print(weights.shape[0])
model.set_weights(weights)
# create the optimizer (Stochastic Gradient Descent)
sgd = SGD(lr=0.01, decay=0.0, momentum=0.0, nesterov=False)
# Use mean squared error loss and SGD as optimizer
model.compile(loss='mse', optimizer=sgd)
return model
Но model.set_weights (weights) возвращает это исключение:
File "neural_network.py", line 28, in neural_net
model.set_weights(weights)
File "C:\Users\Davide\AppData\Local\Programs\Python\Python37\lib\site-packages\keras\engine\network.py", line 527, in set_weights
K.batch_set_value(tuples)
File "C:\Users\Davide\AppData\Local\Programs\Python\Python37\lib\site-packages\keras\backend\tensorflow_backend.py", line 2960, in batch_set_value
tf_keras_backend.batch_set_value(tuples)
File "C:\Users\Davide\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\backend.py", line 3323, in batch_set_value
x.assign(np.asarray(value, dtype=dtype(x)))
File "C:\Users\Davide\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\ops\resource_variable_ops.py", line 819, in assign
self._shape.assert_is_compatible_with(value_tensor.shape)
File "C:\Users\Davide\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\tensor_shape.py", line 1110, in assert_is_compatible_with
raise ValueError("Shapes %s and %s are incompatible" % (self, other))
ValueError: Shapes (24, 24) and () are incompatible
Process finished with exit code 1
У нас есть 24 входных * 16 нейронов на скрытом слое один, затем 16 нейронов * 16 нейронов на скрытом слое 2 и, наконец, 16 нейронов скрытый слой 2 * 3 входа = 24 * 16 + 16 * 16 + 16 * 3 = 688
И
print(weights.shape[0])
- это 688. Так почему я не могу установить правильные веса?
Впервые я делаю проект с использованием ИИ, так что я, возможно, совершенно не понял, как это работает