簡體   English   中英

Tensorflow 中 Flatten() 層中的輸入和 output 形狀存在問題

[英]Problem with input and output shapes in Flatten() layer in Tensorflow

我正在嘗試為圖像分類構建一個基本的卷積神經網絡。 我有一個屬於 4 個類的圖像數據集。 我使用ImageDataGeneratorflow_from_directory創建了 Tensorflow 數據集:

train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    validation_split=0.2
)

val_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255, validation_split=0.2)

train_data = train_datagen.flow_from_directory(
    dataset_source, 
    color_mode='rgb',
    batch_size=batch_size, 
    class_mode='categorical',
    shuffle=True,
    subset='training'
) 

val_data = val_datagen.flow_from_directory(
    dataset_source, 
    color_mode='rgb',
    batch_size=batch_size, 
    class_mode='categorical',
    shuffle=False,
    subset='validation'
)

我測試的 CNN 架構示例很簡單,如下所示:

image_shape = (299, 299, 3)

model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=image_shape))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(128, activation='relu'))
model.add(tf.keras.layers.Dense(4))

model.compile(loss = "categorical_crossentropy",
             optimizer = "adam",
             metrics = ["accuracy"])

每當我嘗試使用model.fit(train_data, epochs=100, validation_data = val_data)開始訓練時,都會收到以下與Flatten()層相關的錯誤:

InvalidArgumentError:  Input to reshape is a tensor with 7372800 values, but the requested shape requires a multiple of 645248
[[node sequential_1/flatten_1/Reshape (defined at <ipython-input-9-d01204576b1d>:1) ]] [Op:__inference_train_function_1823]

我使用各種版本的 CNN 對其進行了檢查,即使是最簡單的包含單個卷積層,但每次都會出現錯誤,只是值不同。 這可能很明顯,但是盡管嘗試了很多次,我還是無法解決它,所以我會非常感謝任何關於如何處理我的問題的指導。

使用flow_from_directory調用而不指定target_size只是自找麻煩,因為即使是單個大小錯誤的輸入也會弄亂您的 model 擬合過程。 簡單的解決方法是將target_size=(299, 299)添加到調用中,以確保安全(如評論中所示)。

此外,考慮在flow_from_directory調用上方添加image_shape = (299, 299, 3)並指定target_size = image_shape[:-1]以從那里拉取它。 這將使修改image_shape更容易,您可能想要嘗試各種輸入大小縮放。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM