Как настроить метки данных в массиве для обучения модели Keras? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь внедрить Keras в первый раз (извините за тупой вопрос) в рамках более широкого проекта по созданию ИИ, который учится играть на соединении 4. Как часть этого, я передаю NN a 6* 7 сетка и выводит массив из 7 значений, дающий вероятности для каждого столбца в игре.Вот вывод метода Model.summary () для более подробной информации:

______________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten (Flatten)            (None, 42)                0         
_________________________________________________________________
dense (Dense)                (None, 20)                860       
_________________________________________________________________
dense_1 (Dense)              (None, 20)                420       
_________________________________________________________________
dense_2 (Dense)              (None, 7)                 147       
=================================================================
Total params: 1,427
Trainable params: 1,427
Non-trainable params: 0
_________________________________________________________________
_________________________________________________________________

модель даст (на данный момент случайный) прогноз, когда я передам ей массивы массива формы (1, 6, 7), однако, когда я пытаюсь обучить модель с массивом формы (221, 6, 7) для данных и массивом формы (221, 7) для меток, я получаю эту ошибку:

ValueError: Ошибка при проверке цели: ожидается, что плотность_2 будет иметь форму (1,), но получен массив с формой (7,)

Это код, который я использую для обучения модели (какие выходы (221, 6, 7) и (221, 7)):

board_tensor = np.array(full_board_list)
print(board_tensor.shape)
label_tensor = np.array(full_label_list)
print(label_tensor.shape)
self.model.fit(board_tensor, label_tensor)

это код, который я использую для определения модели:

self.model = keras.Sequential([
             keras.layers.Flatten(input_shape=(6, 7)),
             keras.layers.Dense(20, activation=tf.nn.relu),
             keras.layers.Dense(20, activation=tf.nn.relu),
             keras.layers.Dense(7, activation=tf.nn.softmax)])
self.model.compile(optimizer=tf.train.AdamOptimizer(),
                   loss='sparse_categorical_crossentropy',
                   metrics=['accuracy'])

(модельчасть объекта AI, чтобы его можно было сравнивать с другими типами объектов AI). Этот код успешно предсказывает пакет размером 1, сгенерированный из двухмерного списка, представляющего плату (он выводит (1, 6, 7)) и (1, 7)):

input_tensor = np.array(board.board)
input_tensor = np.expand_dims(input_tensor, 0)
print(input_tensor.shape)
probability_distribution = self.model.predict(input_tensor)
print(probability_distribution.shape)

Я понимаю, что ошибка, вероятно, связана с отсутствием пониманиямоя часть относительно того, что методы в Керасе ожидают, что будут даны;Итак, в качестве небольшого дополнения, есть ли у кого-нибудь хорошие, подробные учебные ресурсы, которые действительно помогут вам понять, что делает каждый метод (т.е. не просто сообщают вам, какой код вводить, чтобы сделать распознаватель изображений), который был бы понятенлюдям, новичкам в Keras и Tensorflow, вроде меня?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 21 декабря 2018

Вы используете потерю sparse_categorical_crossentropy, которая принимает целочисленные метки (не с горячим кодированием), а ваши метки имеют горячее кодирование.Вот почему вы получаете сообщение об ошибке.

Самый простой способ исправить это - изменить потерю на categorical_crossentropy.

...