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: