Saya mencoba membuat autoencoder di Keras dengan backend Tensorflow. Saya mengikuti tutorial ini untuk membuatnya sendiri. Input ke jaringan adalah jenis arbitrer yaitu setiap sampel adalah array 2d dengan jumlah kolom tetap (12 dalam kasus ini) tetapi baris berkisar antara 4 dan 24.

Apa yang saya coba sejauh ini adalah:

# Generating random data
myTraces = []
for i in range(100):
    num_events = random.randint(4, 24) 
    traceTmp = np.random.randint(2, size=(num_events, 12))

    myTraces.append(traceTmp)

myTraces = np.array(myTraces) # (read Note down below) 

Dan ini contoh model saya

input = Input(shape=(None, 12))

x = Conv1D(64, 3, padding='same', activation='relu')(input)

x = MaxPool1D(strides=2, pool_size=2)(x)

x = Conv1D(128, 3, padding='same', activation='relu')(x)

x = UpSampling1D(2)(x)
x = Conv1D(64, 3, padding='same', activation='relu')(x)

x = Conv1D(12, 1, padding='same', activation='relu')(x)

model = Model(input, x)
model.compile(optimizer='adadelta', loss='binary_crossentropy')

model.fit(myTraces, myTraces, epochs=50, batch_size=10, shuffle=True, validation_data=(myTraces, myTraces))

CATATAN: Sesuai Keras Doc , dikatakan bahwa input harus berupa array numpy, jika saya melakukannya saya mendapatkan kesalahan berikut:

ValueError: Error when checking input: expected input_1 to have 3 dimensions, but got array with shape (100, 1)

Dan jika saya tidak mengubahnya menjadi array numpy dan membiarkannya menjadi daftar array numpy, saya mendapatkan kesalahan berikut:

ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 100 arrays: [array([[0, 1, 0, 0 ...

Saya tidak tahu apa yang saya lakukan salah di sini. Saya juga baru mengenal Keras. Saya akan sangat menghargai bantuan apa pun terkait hal ini.

0
Muaz Usmani 20 November 2017, 17:41

1 menjawab

Jawaban Terbaik

Numpy tidak tahu cara menangani daftar array dengan berbagai ukuran baris (lihat jawaban ini). Ketika Anda memanggil np.array dengan traceTmp, itu akan mengembalikan daftar array, bukan array 3D (Array dengan bentuk (100, 1) berarti daftar 100 array). Keras juga membutuhkan array yang homogen, artinya semua array input harus memiliki bentuk yang sama.

Apa yang dapat Anda lakukan adalah mengisi array dengan nol sehingga semuanya memiliki bentuk (24,12): kemudian np.array dapat mengembalikan array 3 dimensi dan lapisan input keras tidak mengeluh.

3
lmartens 20 November 2017, 15:09