Как ввести массив из n элементов и вывести массив размера k в нейронной сети, используя керасы? - PullRequest
0 голосов
/ 03 мая 2020

Я новичок в машинном обучении и использовании нейронных сетей с керасом. Я пытаюсь использовать обучение с подкреплением вместе с нейронной сетью, которая в конечном итоге может предсказать правильные действия робота в монопольной игре, если он будет играть против людей.

Для этого я пытаюсь использовать нейронную сеть, которая получает массив из 23 чисел с плавающей точкой (определяющий состояние игроков) и выводит массив из 7 чисел с плавающей запятой (максимальное количество возможных действий, которые можно предпринять в данный момент). Моя текущая NN следующая:

model = Sequential()
model.add(Dense(150, input_dim=23, activation='relu'))
model.add(Dense(7, activation='sigmoid'))
model.compile(loss='mse', optimizer=Adam(lr=0.2))

Мое намерение состоит в том, чтобы иметь 3 слоя nn, со скрытым слоем в 150 (нейронов) и 7 нейронов в последнем слое.

#An input example would be:
state = [0.35,0.65,0.35,3.53...] # array of 23 items, float numbers.
output = model.predict(state)

#I expect output to be:
[0.21,0.12,0.98,0.32,0.44,0.12,0.41] #array size of 7

#Then I could simply just use the index with the highest number as the action to take. 
action = output.index(max(output))

Я не уверен, почему, но вместо этого я получаю эту ошибку: ValueError: Error when checking input: expected dense_23_input to have shape (23,) but got array with shape (1,)

Я уверен, что было бы лучше, если бы у меня был только один нейрон последнего слоя, предсказывающий целые числа в диапазоне, для номера экземпляров с 1 по 7. Однако я не знаю ни одной функции активации, которая могла бы это сделать. Пожалуйста, не стесняйтесь предложить лучшие модели nn для этой цели, я был бы очень признателен. Я знаю, что это может быть не самой лучшей моделью для этой цели.

Но, по сути, главный вопрос здесь состоит в том, как мне ввести один размер массива 23 и вывести массив размера 7?

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Спасибо за ваш вклад! Мне удалось решить проблему. В конце концов я использовал трехслойный nn с одним выходом нейрона и функцией активации сигмоидальной оболочки, которая выглядела так:

model = Sequential()
model.add(Dense(150, input_shape=(23,), activation='relu'))
model.add(Dense(1, input_shape=(7,), activation='sigmoid'))
model.compile(loss='mse', optimizer=Adam(lr=0.2))

#Required input would look something like this:
input =np.array([0.2,0.1,0.5,0.5,0.8,0.3,0.2,0.2,0.2,0.9,0.2,0.8,0.6,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.1,0.5,0.4])
input = np.reshape(input,(1,-1))

#The output would look like something like this:
print(saved_model.predict(input))
#[[0.00249215 0.15893634 0.50805619 0.86176279 0.34417642 0.29258215
  0.131994  ]]

Отсюда я просто получил бы индекс с наибольшей вероятностью, чтобы определить класс моего ввода.

0 голосов
/ 03 мая 2020

Я совсем не очень знаком с keras, но в pytorch все должно работать в пакетном режиме, и поэтому вы получаете больше измерений, чем вы хотите.

Вход для вашего первого линейного слоя должен иметь Размеры (batch_size,23). Если вы хотите увидеть, как работает один пример через сеть, сначала измените его на input.reshape(1,-1). Выход будет иметь димс (1,7). Вы должны изменить последнюю активацию слоя на softmax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...