我有一些資料,我必須將其分類為0或1。該資料從一個.npz檔案中加載。它給了我訓練、驗證和測驗資料。它們看起來是這樣的:
x_train = [[[ 0 0 0 ... 0 1 4]
[0 0 0 ... 4 25 2]
[6 33 15 ... 33 0 0]
...
[0 23 4 ... 9 31 0]
[4 0 0 ... 0 0 12]
[5 0 0 ... 3 0 0 ]]
[[ 88 71 59 ... 61 62 62]
[74 88 73 ... 59 70 60]
[69 61 85 ... 60 58 82]
...
[68 85 58 ... 55 75 72]
[69 69 70 ... 81 76 83]
[74 68 76 ... 60 74 72 ]]
[[ 87 134 146 ... 108 116 157]
[108 117 144 ... 102 58 122]
[124 148 106 ... 97 135 146]
...
[96 153 111 ... 104 129 154]
[129 140 100 ... 74 114 97]
[119 115 160 ... 172 84 148 ]]
...
[[ 92 96 64 ... 69 83 83]
[85 44 89 ... 115 94 76]
[93 103 91 ... 92 81 75]
...
[16 109 81 ... 84 95 20]
[100 27 89 ... 66 107 48]
[24 67 144 ... 104 115 123 ]]
[[ 69 70 74 ... 72 73 75]
[72 72 76 ... 73 75 76]
[74 75 72 ... 72 69 73]
...
[72 72 69 ... 72 76 72]
[70 72 73 ... 72 76 67]
[69 72 72 ... 72 71 71 ]]
[[ 65 137 26 ... 134 57 174]
[91 76 123 ... 39 63 124]
[81 203 134 ... 192 63 143]
...
[1 102 96 ... 33 63 169]
[82 32 108 ... 151 75 151]
[12 97 164 ... 101 125 60 ]] 。]
y_train:
[0 0 0 ... 0 0 0]
這些是我的輸入形狀:
x_train.shape = (5000, 128, 128)
y_train.shape = (5000,)
如你所見,y只是標簽,x只是3D資料。因為它是一個二進制分類器,我想建立一個有3個密集層的簡單NN。這就是我所擁有的:
model = Sequential()
model.add(Dense(12, input_dim = 8, activation='relu')
model.add(Dense(8, activation='relu')
model.add(Dense(1, activation='sigmoid')
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'] )
model.fit(x_train, y_train, epochs=150, batch_size=8)
但是由于我的輸入,我得到了這個錯誤:
ValueError: 輸入0的層sequential_4 是不兼容的與層。預期軸-1的輸入形狀的值8但收到input with shape(8, 128, 128)
我怎樣才能解決這個問題?對于這種型別的問題,我的NN是不是太簡單了?
uj5u.com熱心網友回復:
你的代碼存在多個問題。我已經嘗試添加單獨的章節來解釋它們。請仔細閱讀所有這些問題,并嘗試我在下面顯示的代碼示例。
1. 將樣本/批次通道作為輸入維度傳遞
。你正在傳遞批處理通道作為密集層的輸入形狀。這是不正確的。相反,你需要做的是傳遞模型應該期望的每個樣本的形狀,在這個例子中是(128,128)。模型會自動在前面添加一個通道,讓批次在計算圖中流動,如(None, 128, 128),如下圖model.summary()所示
2.密集層的2D輸入
。你的每一個樣本(在本例中共有5000個樣本)都是一個形狀為128,128的2D矩陣。密集層不能直接消耗它,除非先把它壓平。(或者使用一個不同的層來更適合處理2D/3D輸入,這一點將在后面討論)。
from tensorflow.keras import Sequential
from tensorflow.keras.layer import Dense, Flatten
model = Sequential()
model.add(Flatten(input_shape=(128,128) )
model.add(Dense(12, activation='relu')
model.add(Dense(8, activation='relu')
model.add(Dense(1, activation='sigmoid')
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'] )
model.summary()
模型。"sequential_6"。
_________________________________________________________________
層(型別)輸出形狀引數#
=================================================================
flatten_3 (扁平化) (None, 16384) 0
_________________________________________________________________
dense_5 (Dense) (None, 12) 196620
_________________________________________________________________
dense_6 (Dense) (None, 8) 104
_________________________________________________________________
dense_7 (Dense) (None, 1) 9
=================================================================
總引數。196,733。
可訓練的引數。196, 733
不可訓練的引數。0 0
_________________________________________________________________
3.為你的問題使用不同的架構。
"對于這種型別的問題,我的NN是不是太簡單了?"這不是關于架構的復雜性,而是關于能夠處理某種型別資料的層的型別。在這種情況下,你有具有單通道(128,128)的影像,這是一種 2D 輸入。通常,彩色影像有
R、G、B通道,最終成為(128,128,3)形狀的輸入。一般的做法是使用CNN層來實作。
下面是一個例子--
from tensorflow.keras import Sequential from tensorflow.keras.layer import Dense, Flatten, Conv2D, MaxPooling2D, Reshape model = Sequential() model.add(Reshape((128,128,1), input_shape=(128,128)) model.add(Conv2D(5, 5, activation='relu') model.add(MaxPooling2D((2,2) ) model.add(Conv2D(10, 5, activation='relu') model.add(MaxPooling2D((2,2) ) model.add(Conv2D(20, 5, activation='relu') model.add(MaxPooling2D((2,2) ) model.add(Conv2D(30, 5, activation='relu') model.add(MaxPooling2D((2,2) ) model.add(Flatten()) model.add(Dense(12, activation='relu') model.add(Dense(8, activation='relu') model.add(Dense(1, activation='sigmoid') model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'] ) model.summary()模型。"sequential_13"。 _________________________________________________________________ 層(型別)輸出形狀引數# ================================================================= reshape_5 (Reshape) (None, 128, 128, 1) 0 0 _________________________________________________________________ conv2d_16 (Conv2D) (None, 124, 124, 5) 130 130 _________________________________________________________________ max_pooling2d_16 (MaxPooling (None, 62, 62, 5) 0 0 _________________________________________________________________ conv2d_17 (Conv2D) (None, 58, 58, 10) 1260 1260 _________________________________________________________________ max_pooling2d_17 (MaxPooling (None, 29, 29, 10) 0 _________________________________________________________________ conv2d_18 (Conv2D) (None, 25, 25, 20) 5020 5020None, 12, 12, 20) 0 _________________________________________________________________ conv2d_19 (Conv2D) (None, 8, 8, 30) 15030 15030 _________________________________________________________________ max_pooling2d_19 (MaxPooling (None, 4, 4, 30) 0 0 _________________________________________________________________ flatten_9 (Flatten) (None, 480) 0 _________________________________________________________________ dense_23 (Dense) (None, 12) 5772 _________________________________________________________________ dense_24 (Dense) (None, 8) 104 _________________________________________________________________ dense_25 (Dense) (None, 1) 9 ================================================================= 總引數。27,325 可訓練的引數。27, 325 不可訓練的引數。0 _________________________________________________________________要了解
Conv2D層和MaxPooling層是什么,請查看我的轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/328133.html
標籤:

