訂閱
糾錯
加入自媒體

如何構(gòu)建一個 CNN 模型,以從圖像中對幼苗的種類進(jìn)行分類?

new_train = np.a(chǎn)sarray(new_train)
# CLEANED IMAGES
for i in range(8):
   plt.subplot(2,4,i+1)
   plt.imshow(new_train[i])

將標(biāo)簽轉(zhuǎn)換為數(shù)字

標(biāo)簽是字符串,這些很難處理。因此,我們將這些標(biāo)簽轉(zhuǎn)換為二元分類。

分類可以由 12 個數(shù)字組成的數(shù)組表示,這些數(shù)字將遵循以下條件:

如果未檢測到物種,則為 0。

1 如果檢測到該物種。

示例:如果檢測到 Blackgrass,則數(shù)組將為 = [1,0,0,0,0,0,0,0,0,0,0,0]

labels = preprocessing.LabelEncoder()
labels.fit(traininglabels[0])
print('Classes'+str(labels.classes_))
encodedlabels = labels.transform(traininglabels[0])
clearalllabels = np_utils.to_categorical(encodedlabels)
classes = clearalllabels.shape[1]
print(str(classes))
traininglabels[0].value_counts().plot(kind='pie')

定義我們的模型并拆分?jǐn)?shù)據(jù)集

在這一步中,我們將拆分訓(xùn)練數(shù)據(jù)集進(jìn)行驗證。我們正在使用 scikit-learn 中的 train_test_split() 函數(shù)。這里我們拆分?jǐn)?shù)據(jù)集,保持 test_size=0.1。這意味著總數(shù)據(jù)的 10% 用作測試數(shù)據(jù),其余 90% 用作訓(xùn)練數(shù)據(jù)。檢查以下代碼以拆分?jǐn)?shù)據(jù)集。new_train = new_train/255
x_train,x_test,y_train,y_test = train_test_split(new_train,clearalllabels,test_size=0.1,random_state=seed,stratify=clearalllabels)
防止過擬合

過擬合是機(jī)器學(xué)習(xí)中的一個問題,我們的模型在訓(xùn)練數(shù)據(jù)上表現(xiàn)非常好,但在測試數(shù)據(jù)上表現(xiàn)不佳。在深度神經(jīng)網(wǎng)絡(luò)過度擬合的深度學(xué)習(xí)中,過度擬合的問題很嚴(yán)重。過度擬合的問題嚴(yán)重影響了我們的最終結(jié)果。為了擺脫它,我們需要減少它。在這個問題中,我們使用 ImageDataGenerator() 函數(shù)隨機(jī)改變圖像的特征并提供數(shù)據(jù)的隨機(jī)性。、為了避免過擬合,我們需要一個函數(shù)。此函數(shù)隨機(jī)改變圖像特性。檢查以下代碼以了解如何減少過度擬合generator = ImageDataGenerator(rotation_range = 180,zoom_range = 0.1,width_shift_range = 0.1,height_shift_range = 0.1,horizontal_flip = True,vertical_flip = True)
generator.fit(x_train)

定義卷積神經(jīng)網(wǎng)絡(luò)

我們的數(shù)據(jù)集由圖像組成,因此我們不能使用線性回歸、邏輯回歸、決策樹等機(jī)器學(xué)習(xí)算法。我們需要一個用于圖像的深度神經(jīng)網(wǎng)絡(luò)。在這個問題中,我們將使用卷積神經(jīng)網(wǎng)絡(luò)。該神經(jīng)網(wǎng)絡(luò)將圖像作為輸入,并將提供最終輸出作為物種值。我們隨機(jī)使用了 4 個卷積層和 3 個全連接層。此外,我們使用了多個函數(shù),如 Sequential()、Conv2D()、Batch Normalization、Max Pooling、Dropout 和 Flatting。

我們使用卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練。

該模型有 4 個卷積層。

該模型有 3 個全連接層。

np.random.seed(seed)
model = Sequential()
model.a(chǎn)dd(Conv2D(filters=64, kernel_size=(5, 5), input_shape=(scale, scale, 3), activation='relu'))
model.a(chǎn)dd(BatchNormalization(axis=3))
model.a(chǎn)dd(Conv2D(filters=64, kernel_size=(5, 5), activation='relu'))
model.a(chǎn)dd(MaxPooling2D((2, 2)))
model.a(chǎn)dd(BatchNormalization(axis=3))
model.a(chǎn)dd(Dropout(0.1))
model.a(chǎn)dd(Conv2D(filters=128, kernel_size=(5, 5), activation='relu'))
model.a(chǎn)dd(BatchNormalization(axis=3))
model.a(chǎn)dd(Conv2D(filters=128, kernel_size=(5, 5), activation='relu'))
model.a(chǎn)dd(MaxPooling2D((2, 2)))
model.a(chǎn)dd(BatchNormalization(axis=3))
model.a(chǎn)dd(Dropout(0.1))
model.a(chǎn)dd(Conv2D(filters=256, kernel_size=(5, 5), activation='relu'))
model.a(chǎn)dd(BatchNormalization(axis=3))
model.a(chǎn)dd(Conv2D(filters=256, kernel_size=(5, 5), activation='relu'))
model.a(chǎn)dd(MaxPooling2D((2, 2)))
model.a(chǎn)dd(BatchNormalization(axis=3))
model.a(chǎn)dd(Dropout(0.1))
model.a(chǎn)dd(Flatten())
model.a(chǎn)dd(Dense(256, activation='relu'))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(Dropout(0.5))
model.a(chǎn)dd(Dense(256, activation='relu'))
model.a(chǎn)dd(BatchNormalization())
model.a(chǎn)dd(Dropout(0.5))
model.a(chǎn)dd(Dense(classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

<上一頁  1  2  3  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標(biāo)題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號