簡體   English   中英

Tensorflow/Keras Conv2D 層中的輸入形狀錯誤

[英]Input shape error in Tensorflow/Keras Conv2D layer

我是第一次用 Keras 構建卷積神經網絡,但我遇到了一些問題。 CNN 的目的是檢測 490x640px 灰度圖像中的模式,我已將其轉換為 3D numpy 數組。 我的 Pandas 數據幀的圖像數據列中的每個圖像的形狀都是(490, 640, 1)

我的代碼如下所示:

from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow.keras import layers, models

# Assigning values to split the dataset into training and test data.
X = data[0]
Y = data[1]

# Allocate 20% of the dataset to be used as test data
train_images, test_images, train_labels, test_labels = train_test_split(X, Y, test_size=0.2, random_state=10)

class_names = ['Neutral', 'Anger', 'Contempt', 'Disgust', 'Fear', 'Happy', 'Sadness', 'Surprise']

model = models.Sequential()
model.add(layers.Conv2D(490, (3, 3), activation="relu", input_shape=(490, 640, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(100, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(100, (3, 3), activation='relu'))

我的模型此時的摘要如下所示:

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 488, 638, 490)     4900      
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 244, 319, 490)     0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 242, 317, 100)     441100    
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 121, 158, 100)     0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 119, 156, 100)     90100     
=================================================================
Total params: 536,100
Trainable params: 536,100
Non-trainable params: 0

然后我有以下內容:

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(8, activation='softmax'))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=10, 
                    validation_data=(test_images, test_labels))

問題是,當我嘗試運行它時,出現以下錯誤:

ValueError:檢查輸入時出錯:預期 conv2d_1_input 有 4 個維度,但得到了形狀為 (261, 1) 的數組

我必須指出train_images.shape返回值(261,) ,而train_images[0].shape返回(490, 640, 1)

這在理論上對我來說是有意義的,但我仍然不知道如何為我的 CNN 正確塑造我的數據,並檢測我是否做錯了什么。

問題是您的某些圖像大小不同。 您可以輕松驗證,例如:

shapes = list()
for i in X:
    shapes.append(i.shape)

sorted_shapes = np.sort(np.array(shapes).sum(axis=1))
assert sorted_shapes[0] == sorted_shapes[1], 'Not all pictures have equal size.'

如果此行引發錯誤,您將不得不裁剪/調整它們的大小。

暫無
暫無

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

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