Input_shape z Conv1D vrstva Keras

0

Otázka

Snažím se, aby CNN model pro binární klasifikaci non-image dataset. Můj model/ kód pracuje a produkuje velmi dobré výsledky (přesnost je vysoká), ale nejsem schopen pochopit input_shape parametr pro 1. vrstvu Conv1D.

Tvar X nebo vstupní (zde x_train_df) je (2000, 28). Má 28 funkcí a 2000 vzorků. A tvar Y nebo štítky (zde y_train_df) je (2000, 1).

model = Sequential()
model.add(Conv1D(filters = 64, kernel_size = 3, activation = 'relu', input_shape = (x_train_df.shape[1], 1)))
model.add(Conv1D(filters = 64, kernel_size = 3, activation = 'relu'))
model.add(MaxPooling1D(pool_size = 2))
model.add(Flatten())
model.add(Dense(100, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))

optimzr = Adam(learning_rate=0.005)
model.compile(loss='binary_crossentropy', optimizer=optimzr,  metrics=[[tf.keras.metrics.AUC(curve="ROC", name = 'auc')], [tf.keras.metrics.AUC(curve="PR", name = 'pr')]])

# running the fitting
model.fit(x_train_df, y_train_df, epochs = 2, batch_size = 32, validation_data = (x_val_df, y_val_df), verbose = 2)

Dal jsem input_shape jako (28, 1) (převzato od referenční tuto otázku).

Ale v Conv1D vrstva dokumentaci je psáno, že,

Při použití této vrstvy jako první vrstva v modelu, poskytují input_shape argument (n-tice celých čísel, nebo Žádný, např. (10, 128) pro sekvence 10 vektorů 128-dimenzionální vektory.

Co jsem pochopil, ze to je rozměr input_shape by měla být (2000, 1) jak jsem již 2000 jedno-dimenzionální vektory. Ale dávat to jako input_shape ukazuje chybu, jako,

ValueError: Vstup 0 z vrstvy "sequential_25" je neslučitelné s vrstva: předpokládaný tvar=(None, 2000, 1), nalezený tvar=(None, 28)

Takže moje otázka je, jaký by měl být správný input_shape?

1

Nejlepší odpověď

0

Pojďme se podívat, jak "Conv1D" bere vstup.

>>> # The inputs are 128-length vectors with 10 timesteps, and the batch size
>>> # is 4.
>>> input_shape = (4, 10, 128)
>>> x = tf.random.normal(input_shape)
>>> y = tf.keras.layers.Conv1D(
... 32, 3, activation='relu',input_shape=input_shape[1:])(x)
>>> print(y.shape)
    (4, 8, 32)

3+D tenzor s tvar: batch_shape + (kroky, input_dim)

Jak je vidět výše, existuje 128 funkcí, 10 timesteps a velikosti šarže 4. Takže, Conv1D bere jako vstupní (batch_size,timesteps,funkce). Trvá 3D vstup. Řekněme, že si vyberete velikost dávky jako 1 pro váš případ. Budete muset dát vstup jako (1,2000,28).

2021-11-22 08:00:37

Takže vstup jako (1,2000,28) udělal chybu jako ValueError: logits and labels must have the same shape, received ((None, 1) vs (None, 2000)). Tak jsem změnil tvarů (2000, 28, 1) pro x_train_df a (2000, 1, 1) pro y_train_df jak je uvedeno v této a fungovalo to. Jsem z toho zmatená. To bude velmi užitečné, pokud byste mohl vysvětlit, jak upravit kód v otázce.
Badal

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................