Ошибка входного размера в последовательной плотной сети с Keras - PullRequest
0 голосов
/ 10 июля 2019

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

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

[batch_size, data_dimension]

Итак, я определил свою сеть так:

ModelDense = Sequential()

ModelDense.add(Dense(380, input_shape=(None,185), activation='elu', kernel_initializer='glorot_normal'))
ModelDense.add(Dense(380, activation='elu', kernel_initializer='glorot_normal'))
ModelDense.add(Dense(380, activation='elu', kernel_initializer='glorot_normal'))
ModelDense.add(Dense(7, activation='elu', kernel_initializer='glorot_normal'))
optimizer = tf.keras.optimizers.Adam(lr=0.00025)

ModelDense.compile(loss='mean_squared_error', optimizer=optimizer, metrics=['accuracy'])

но когда я использую эту сеть с входом, имеющим такую ​​форму: (1, 185) я получаю ошибку:

Ошибка при проверке ввода: ожидалось, что плотность_производителя имеет 3 измерения, но получен массив с формой (185, 1)

Не спрашивайте меня, почему я сказал, что моя векторная форма (1, 185) и в сообщении об ошибке мы видим (185, 1), потому что, когда я проверяю свою форму массива непосредственно перед передачей его в качестве входных данных для моя сеть показанная форма (1, 185)

Хорошо, я проверил некоторые темы, затем нашел эту , в которой объясняется, что:

Плотные слои требуют ввода как (batch_size, input_size) или (batch_size, необязательный, ..., необязательный, input_size)

Так это то, что я сделал, не так ли? Но я также видел, что:

Фигуры в Керасе:

...

Таким образом, даже если вы использовали input_shape = (50,50,3), когда keras отправляет вам сообщения или когда вы печатаете сводку модели, она будет отображаться (Нет, 50,50,3)

...

Таким образом, при определении формы ввода вы игнорируете размер пакета: input_shape = (50,50,3)

Хорошо! давайте попробуем, я теперь определил свой входной слой следующим образом:

ModelDense.add(Dense(380, input_shape=(185,), activation='elu', kernel_initializer='glorot_normal'))

Когда я делаю модель.summary ():

_________________________________________________________________ Layer (тип) Выходная форма Параметр # ================================================== =============== плотный (плотный) (нет, 380) 70680 _________________________________________________________________ плотность_1 (плотный) (нет, 380) 144780 _________________________________________________________________ density_2 (Плотный) (нет, 380) 144780 _________________________________________________________________ density_3 (Плотный) (Нет, 7) 2667 ================================================== =============== Всего параметров: 362 907 Обучаемые параметры: 362 907 Необучаемые параметры: 0


Хорошо, я думаю, что это то, что я хочу, но когда я даю массив ЖЕ * в качестве ввода, я теперь получаю ошибку:

ValueError: Ошибка при проверке входных данных: ожидается, что плотность записи будет иметь shape (185,), но получил массив с shape (1,)

Я запутался, что я не так понял?

_________ РЕДАКТ. __________:

Функция прогнозирования:

def predict(dense_model, state, action_size, epsilon):

    alea = np.random.rand()

    # DEBUG
    print(state)
    print(np.array(state).shape)

    output = dense_model.predict(state)

    if (epsilon > alea):
        action = random.randint(1, action_size) - 1
        flag_alea = True

    else:
        action = np.argmax(output)
        flag_alea = False

    return output, action, flag_alea

Строка, в которой я использую свою функцию:

Qs, action, flag_alea = predict(Dense_model, [state], ACTION_SIZE, Epsilon)

Точный результат моей печати 'DEBUG':

[[0,0, 0,0, 0,0, 0,12410027302060064, 0,0, 0,0, 0,0, 0,0, 0,0,+0,18851780241253108, 0,0, 0,0, +0,2863141820958198, 0,0, 0,07328154770628756, 0,418848167539267, +0,07328154770628756, +0,2094240837696335, 0,42857142857142855, 0,0, 0,12410027302060064, 0.0, 0.0, 0.0, 0.0, 0,263306220774655, 0,14740566037735847, +0,40346984062941293, 0,675310642895732, 0.0, 0.0, 0.0, 0.0, 0,07328154770628756,0.0, +0,4396892862377253, 0,0, +0,42857142857142855, 0,0, 0,12410027302060064, 0,08759635599159075, 0,0, +0,1401927621025243, +0,6755559204272007, 0,0, 0,0, +0,11564568886156315, +0,4051863857374392, 0,0, 0,0, +0,19087612139721322, 0,0, +0,07328154770628756, +0,6282722513089005, +0,14656309541257512, +0,10471204188481675, 0,42857142857142855, 0,0, +0,12410027302060064,0.0, 0.0, 0.0, 0.0, +0,0974621385076755, 0,0, 0,0, 0,675310642895732, 0,0, 0,0, 0,0, +0,09543806069860661, 0,07328154770628756, 0,10471204188481675, +0,5129708339440129, +0,5233396901920598, 0,42857142857142855, 0.0, 0.0, 0.0, 0.0, +0,5528187746700128, +0,6755564266434103, 0,0, 0,0,0,10086746015735323, 0,1350621285791464, 0.0, 0.0, 0.0, 0.0, 0,14891426591693724, +0,5166404112353377, +0,14656309541257512, +0,10471204188481675, +0,42857142857142855, 0,00846344605088234, +0,012550643645226955, 0,0, 0,0, +0,004527776502072811, 0,0, 0,001294999849051237, +0,019391579553484917, +0,02999694086611271, 0,0026073455810546875, 0,0, 0,0, +0,016546493396162987, +0,024497902020812035, +0,00018889713101089,0.0, 0,005568447522819042, 0,0, +0,007975691929459572, +0,01434263214468956, 0,0, 6.733229383826256e-05, 0,0012099052546545863, 0,0, +0,0001209513284265995, 0,01868056133389473, 0,025530844926834106, +0,004079729784280062, 0,0, 0,0, 0,01332627609372139, +0,026645798236131668, 0,0, 0,0, +0,007684763520956039, 0,0, 0,010554256848990917, +0,007236589677631855, 0,0013368092477321625, +0,000697580398991704, 0,00213554291985929, 0,0, 0,0021772112231701612, +0,012761476449668407, 0,015171871520578861, 0,001512336079031229, 0,0, 0,0, 0,008273545652627945, 0,01777557097375393, +0,006600575987249613, 0,0, +0,007174563594162464, 0,0, 0,004660750739276409, +0,009024208411574364, 0,0, 0,0014235835988074541, 0,0, 0,0, 0,0, 0,008785379119217396, 0,010602384805679321, +0,0024691042490303516, 0,0, 0,0, +0,003091508522629738, +0,0120345214381814, 0,003123666625469923, 0,0, 0,005664713680744171, 0,0, +0,004825159907341003, +0,0034197410568594933, 0,0030767947901040316, +0,004110954236239195, 0,0, 0,0, 0,001896441332064569,0,002400417113676667, 0,0012791997287422419, 0,0, 0,0, 0,0, 0,0021027529146522284, 0,006922871805727482, 0,004868669901043177, 0,0, 7,310241926461458e-05, 0,0]]

(1, 185) * 10 10 * 1082) * 10, 1082 * 10, 1082 * 10, 1082 * 10, 1082 * 10, 1082 * * 10, 1082 * * 10, 1082 * 10, 1082 * * 10, 1082 * 10, 1082 * 10, 1082 * * 10, 1082 * * 10, 1082, * 10, 1082, * 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 08, 000, 000, 000, 0,002400417113676667.:

Отслеживание ошибок:

Файл ".! Qltrain.py", строка 360, в Qs, действие, flag_alea = предикат (Dense_model, [состояние], ACTION_SIZE, Epsilon) Файл ". \ Lib \ Core.py", строка 336, в прогнозируемом выходе = dens_model.predict (состояние) Файл "C: \ Users \ Odeven \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-пакеты \ tenorsflow \ python \ keras \ engine \ training.py ", строка 1096, в прогнозе x, check_steps = True, steps_name = 'steps', steps = steps) Файл "C: \ Users \ Odeven \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ tenorsflow \ python \ keras \ engine \ training.py", строка 2382, в _standardize_user_data exception_prefix = 'input') Файл" C: \ Users \ Odeven \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ensorflow \ python \ keras \ engine \ training_utils.py ", строка 362, в standardize_input_data ', но получил массив с формой' + str (data_shape)) ValueError: Ошибка при проверке ввода: ожидалось, что плотность_инстанции имеет форму (185,), но получен массив с формой (1,)

Если вы посмотрите первые 3 строки, вы увидите, что код, из которого идет erorr, - это код, который я добавил в моем первом редакторе

_______ автономный пример _______

Содержимое test.py:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import random
import numpy as np

ModelDense = Sequential()

ModelDense.add(Dense(380, input_shape=(185,), activation='elu', kernel_initializer='glorot_normal'))
ModelDense.add(Dense(380, activation='elu', kernel_initializer='glorot_normal'))
ModelDense.add(Dense(380, activation='elu', kernel_initializer='glorot_normal'))
ModelDense.add(Dense(7, activation='elu', kernel_initializer='glorot_normal'))
optimizer = tf.keras.optimizers.Adam(lr=0.00025)

ModelDense.compile(loss='mean_squared_error', optimizer=optimizer, metrics=['accuracy'])


ModelDense.summary()



def predict(dense_model, state, action_size, epsilon):

    alea = np.random.rand()

    print(state)
    print(np.array(state).shape)

    dense_model.summary()

    output = dense_model.predict(state)

    if (epsilon > alea):
        action = random.randint(1, action_size) - 1
        flag_alea = True

    else:
        action = np.argmax(output)
        flag_alea = False

    return output, action, flag_alea



state = []
state.append([np.random.rand()] * 185)
output, ac, flag = predict(ModelDense, state, 7, 0.0)

print(output)

Полный вывод:

_________________________________________________________________ Layer (тип) Выходная форма Параметр # ================================================== =============== плотный (плотный) (нет, 380) 70680 _________________________________________________________________ плотность_1 (плотный) (нет, 380) 144780 _________________________________________________________________ density_2 (Плотный) (нет, 380) 144780 _________________________________________________________________ density_3 (Плотный) (Нет, 7) 2667 ================================================== =============== Всего параметров: 362 907 Обучаемые параметры: 362 907 Необучаемые параметры: 0 _________________________________________________________________ [[0.11966889292971739, 0.11966889292971739, 0.11966889292971739,0,11966889292971739, 0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739,+0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739,0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739,+0,11966889292971739, 0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739,+0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739, +0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, +0,11966889292971739, +0,11966889292971739]] (1, 185) _________________________________________________________________ слой (тип) Выходная форма Param #================================================================= плотный (Плотный) (нет, 380) 70680 _________________________________________________________________ dens_1 (плотный) (отсутствует, 380) 144780 _________________________________________________________________ dens_2 (плотный) (отсутствует, 380) 144780 _________________________________________________________________ dens_3 (Плотный) (Нет, 7) 2667 ================================================================= Всего параметров: 362 907 Обучаемые параметры: 362 907 Необучаемые параметры: 0 _________________________________________________________________ Traceback (последний вызов был последним): Файл ". \test.py ", строка 47, в выходных данных, ac, flag = предикат (ModelDense, state, 7, 0.0) Файл". \ test.py ", строка 31, в выходных данных предикатов = dens_model.predict (state) Файл" C: \ Users \ Odeven \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ tenorflow \ python \ keras \ engine \ training.py ", строка 1096, в прогнозе x, check_steps = True, steps_name = 'steps', steps = steps) Файл "C: \ Users \ Odeven \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ tenorflow \ python \ keras \ engine \ training.py ", строка 2382, в _standardize_user_data exception_prefix = 'input') Файл" C ": \ Users \ Odeven \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ site-packages \ tenorflow \ python \ keras \ engine \ training_utils.py ", строка 362, в standardize_input_data ', но получил массив с формой' + str (data_shape)) ValueError: Ошибка при проверке входных данных: ожидалось, что dens_input имеет форму (185,), но получил массив с формой (1,)

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Измените это:

output = dense_model.predict(state)

На это:

output = dense_model.predict(np.array(state))

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

0 голосов
/ 10 июля 2019

Я не профессионал в Keras, но я думаю, что, как сказал @Matias Valdenegro, и, поскольку алгоритм будет выполнять умножение матриц по сети, он ожидает, что вы дадите массив.

Если у вас есть только одно состояние, в котором вы хотите выполнить прогнозирование, вы можете увеличить размер данных следующим образом:

state = np.expand_dims(state, axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...