Kesalahan dimensi masukan pada jaringan padat berurutan dengan Keras

Ini adalah pertanyaan yang panjang karena saya mencoba menjelaskan semaksimal mungkin masalah saya karena ini adalah masalah yang berulang bagi saya dan saya benar-benar tidak mengerti, jadi terima kasih telah meluangkan waktu untuk membaca saya

Saya ingin membuat model padat berurutan yang mengambil daftar masukan dengan dimensi seperti ini:

[ukuran_batch, dimensi_data]

Jadi saya mendefinisikan jaringan saya seperti ini:

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'])

tetapi ketika saya menggunakan jaringan ini dengan input berbentuk seperti ini : (1, 185) saya mendapat error:

Kesalahan saat memeriksa input: input_padat diharapkan memiliki 3 dimensi, tetapi mendapat array dengan bentuk (185, 1)

Jangan tanya mengapa saya mengatakan bahwa bentuk vektor saya adalah (1, 185) dan dalam pesan kesalahan kita melihat (185, 1) karena ketika saya memeriksa bentuk array saya sebelum memberikannya sebagai masukan ke jaringan saya, bentuk yang ditampilkan adalah (1, 185)

Oke, jadi saya memeriksa beberapa topik lalu saya menemukan yang ini yang di dalamnya dijelaskan bahwa :

Lapisan padat memerlukan input sebagai (batch_size, input_size) atau (batch_size, opsional,...,opsional, input_size)

Jadi itu yang aku lakukan bukan? Tapi saya juga melihat bahwa:

Bentuk di Keras :

...

Jadi, meskipun Anda menggunakan input_shape=(50,50,3), saat keras mengirimi Anda pesan, atau saat Anda mencetak ringkasan model, itu akan menampilkan (None,50,50,3)

...

Jadi, saat menentukan bentuk masukan, Anda mengabaikan ukuran kumpulan: input_shape=(50,50,3)

Oke ! mari kita coba, sekarang saya mendefinisikan lapisan masukan saya seperti ini:

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

Ketika saya melakukan model.summary() :

__________________________________________________________________ Lapisan (tipe) Output Shape Param # ============ ========= padat (Padat) (Tidak ada, 380) 70680 _________________________________________________________________ padat_1 (Padat) (Tidak ada, 380) 144780 _________________________________________________________________ padat_2 (Padat) (Tidak ada, 380) 144780 __________________________________________________________________ padat_3 (Padat) (Tidak ada, 7) 2667 ================== ================================ Total parameter: 362,907 Param yang dapat dilatih: 362,907 Param yang tidak dapat dilatih: 0


Oke, saya pikir itu yang saya inginkan tetapi ketika saya memberikan array SAMA sebagai input, saya sekarang mendapatkan kesalahan:

ValueError: Kesalahan saat memeriksa input: input_padat yang diharapkan berbentuk (185,) tetapi mendapat array dengan bentuk (1,)

Aku bingung, apa yang salah paham?

__________EDIT__________ :

Fungsi prediksi:

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

Baris tempat saya menggunakan fungsi saya:

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

Hasil persis dari pencetakan 'DEBUG' saya:

[[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)

_________EDIT2__________ :

Pelacakan balik kesalahan:

File ".!Qltrain.py", baris 360, di Qs, action, flag_alea = prediksi(Dense_model, [state], ACTION_SIZE, Epsilon) File ".\Lib\Core.py", baris 336, di prediksi keluaran = solid_model .predict(state) File "C:\Users\Odeven\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", baris 1096, dalam prediksi x, check_steps=Benar, nama_langkah='langkah', langkah=langkah) File "C:\Users\Odeven\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py ", baris 2382, dalam _standardize_user_data pengecualian_prefix='input') File "C:\Users\Odeven\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_utils.py" , baris 362, di standardize_input_data ' tetapi mendapat array dengan bentuk ' + str(data_shape)) ValueError: Kesalahan saat memeriksa input: diharapkan input_padat berbentuk (185,) tetapi mendapat array dengan bentuk (1,)

Jika Anda memeriksa 3 baris pertama, Anda dapat melihat bahwa kode asal erorr adalah kode yang saya tambahkan pada pengeditan pertama saya

_______contoh mandiri_______

Konten 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)

Keluaran lengkap:

Ubah ini:


person Xeyes    schedule 10.07.2019    source sumber
comment
Saya menambahkan fungsi prediksi ke posting saya, saya juga menambahkan baris di mana saya menggunakannya dan pesan debug yang saya miliki ketika saya mencetak dimensi   -  person Dr. Snoopy    schedule 10.07.2019
comment
Apakah Anda yakin ini adalah bagian kode yang menghasilkan kesalahan? Mungkin Anda memiliki array (185,1) di tempat lain dan ada kesalahan di sana. Bagi saya tidak jelas bagaimana kesalahan dan kode yang Anda sertakan terkait.   -  person Xeyes    schedule 10.07.2019
comment
Saya benar-benar yakin dengan kode yang dieksekusi, saya menambahkan jejak balik kesalahan, saya tahu ini sangat aneh, itulah mengapa saya benar-benar tidak memahami kesalahan ini   -  person Dr. Snoopy    schedule 10.07.2019
comment
Kemudian buatlah contoh mandiri yang mereproduksi kesalahan dan kita dapat menjalankannya.   -  person Xeyes    schedule 10.07.2019
comment
Oke saya baru saja membuat file bernama test.py di mana saya hanya menulis kode penting dan saya mendapatkan kesalahan yang sama, saya menambahkan konten file ini di edit ketiga + kesalahan traceback   -  person Dr. Snoopy    schedule 10.07.2019
comment
Mari kita melanjutkan diskusi ini dalam chat.   -  person Xeyes    schedule 10.07.2019
comment
Oke terima kasih banyak! itu bekerja dengan baik! Saya merasa sangat terkejut bahwa keras tidak menafsirkan daftar dengan benar, tetapi oke, sekarang saya akan selalu mengonversi daftar saya ^^. Terima kasih telah meluangkan waktu untuk membaca postingan yang panjang ini   -  person Xeyes    schedule 10.07.2019


Jawaban (2)


Ke dalam ini:

output = dense_model.predict(state)

Tampaknya keras menjadi bingung jika Anda meneruskan daftar biasa untuk memprediksi dan mungkin tidak melakukan apa yang Anda inginkan, dengan cara ini Anda memastikan bahwa state adalah array numpy dengan bentuk yang Anda harapkan.

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

Saya bukan ahli Keras tetapi menurut saya, seperti yang dikatakan @Matias Valdenegro dan karena algoritme akan melakukan perkalian matriks melalui jaringan, Anda diharapkan memberikan array.

person Dr. Snoopy    schedule 10.07.2019
comment
Ketika saya melakukan apa yang Anda jelaskan pada wadah 'non numpy array' saya mendapat kesalahan berikut: ValueError: Kesalahan saat memeriksa input: diharapkan input_padat memiliki 2 dimensi, tetapi mendapat array dengan bentuk (1, 1, 185)... jadi Saya pikir solusi terbaik adalah mengubah daftar saya menjadi array :) - person Xeyes; 10.07.2019

Jika Anda hanya memiliki satu keadaan di mana Anda ingin melakukan prediksi, Anda dapat memperluas redupnya data Anda sebagai berikut:

Apakah Anda yakin masukan pelatihan Anda berbentuk (1, 158)? Kedua kesalahan tersebut menunjukkan bahwa bentuk sebenarnya adalah (158, 1)

state = np.expand_dims(state, axis=0)
person Adakor    schedule 10.07.2019
comment
__________________________________________________________________ Lapisan (tipe) Output Shape Param # ============ ========= padat (Padat) (Tidak ada, 380) 70680 _________________________________________________________________ padat_1 (Padat) (Tidak ada, 380) 144780 _________________________________________________________________ padat_2 (Padat) (Tidak ada, 380) 144780 __________________________________________________________________ padat_3 (Padat) (Tidak ada, 7) 2667 ================== ================================ Total parameter: 362,907 Param yang dapat dilatih: 362,907 Param yang tidak dapat dilatih: 0 _________________________________________________________________ [[0.11966889292971739 , 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119668892929 71739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119668892 92971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119668 89292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119 66889292971739, 0,11966889292971739 , 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119668892929 71739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119668892 92971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119668 89292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119 66889292971739, 0,11966889292971739 , 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119668892929 71739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119668892 92971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119668 89292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,119 66889292971739, 0,11966889292971739 , 0,11966889292971739, 0. 11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,1196688929297173 9, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,1196688929297 1739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,1196688929 2971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,1196688 9292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971 739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292 971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889 292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966 889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971 739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292 971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889 292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966 889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971 739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292 971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889 292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966 889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971739, 0,11966889292971 739, 0.11966889292971739, 0.11966889292971739]] (1, 185) ________________________________________________________________ Lapisan (tipe) Param Bentuk Keluaran # ==== ================ padat (Padat) (Tidak ada, 380) 70680 _________________________________________________________________ padat_1 (Padat) (Tidak ada, 380) 144780 _________________________________________________________________ padat_2 (Padat) (Tidak ada, 380) 144780 _________________________________________________________________ padat_3 (Padat) (Tidak ada, 7) 2667 =========== ==================== ==== Total parameter: 362.907 Param yang dapat dilatih: 362.907 Param yang tidak dapat dilatih: 0 _________________________________________________________________ Traceback (panggilan terakhir terakhir): File ". \test.py", baris 47, dalam keluaran, ac, flag = prediksi(ModelDense, status, 7, 0.0) File ".\test.py", baris 31, dalam prediksi keluaran = padat_model.prediksi(status) File " C:\Users\Odeven\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", baris 1096, dalam prediksi x, check_steps=True,steps_name=' langkah', langkah=langkah) File "C:\Users\Odeven\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", baris 2382, di _standardize_user_data pengecualian_prefix='input') File "C:\Users\Odeven\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_utils.py", baris 362, dalam standardize_input_data ' tetapi mendapat array dengan bentuk '+ str(data_shape)) ValueError: Kesalahan saat memeriksa input: input_padat diharapkan berbentuk (185,) tetapi mendapat array dengan bentuk (1,) - person Xeyes; 10.07.2019