日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小狗分类器,你家的狗子是个什么狗?

發布時間:2024/9/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小狗分类器,你家的狗子是个什么狗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


項目介紹

小狗分類器可以做什么?

通過這個分類器,你只需要上傳照片,就可以得到小狗的品種,以及更多的信息。

這就是所謂的「機器學習」,讓機器自己去“學習”。我們今天要做的這個分類任務,是一個“監督學習”的過程。

監督學習的主要目標是從有標簽的訓練數據中學習模型,以便對未知或未來的數據做出預測。

我給大家講一個例子。
用“房子的尺寸”預測“房子的價格”

圖片來自(吳恩達-機器學習)


? ? X-房子的尺寸(小狗的圖片)
? ? Y-房子的價格(小狗的類別)

如圖,我們根據已經有的數據集(圖上的坐標),可以擬合出一條近似符合規律的直線。

這樣,再有新的房子尺寸(1250),我們就可以估算出房子的價格(220k)了。

有了這些簡單的基礎,可以開始搞了。

效果展示

訓練集的準確率為0.925,但測試集只有0.7

說明過擬合了,可以再增加一些圖片,或者使用數據增強,來減少過擬合。



測試了兩張圖片,全都識別對了!


編寫思路

整個分類器的實現,可以分為以下幾個部分:

1 準備數據集

我們可以通過爬蟲技術,把4類圖像(京巴、拉布拉多、柯基、泰迪)保存到本地。總共有840張圖片做訓練集,188張圖片做測試集。

數據集的準備,可以參考上一篇文章。

點擊上圖,閱讀原文


2 數據集的預處理


1) 統一尺寸為100*100*3(RGB彩色圖像)


#?統一尺寸的核心代碼
img?=?Image.open(img_path)
new_img?=?img.resize((100,?100),?Image.BILINEAR)
new_img.save(os.path.join('./dog_kinds_after/'?+?dog_name,?jpgfile))


2) 由于數據是自己下載的,需要制作標簽(label),可提取圖像名稱的第一個數字作為類別。(重命名圖片)


kind?=?0

#?遍歷京巴的文件夾
images?=?os.listdir(images_path)
for?name?in?images:
????image_path?=?images_path?+?'/'
????os.rename(image_path?+?name,?image_path?+?str(kind)?+'_'?+?name.split('.')[0]+'.jpg')


3)劃分數據集

840張圖片做訓練集,188張圖片做測試集。


4)把圖片轉換為網絡需要的類型


# 只放了訓練集的代碼,測試集一樣操作。

ima_train?=?os.listdir('./train')

#?圖片其實就是一個矩陣(每一個像素都是0-255之間的數)(100*100*3)

# 1.把圖片轉換為矩陣
def?read_train_image(filename):
????img?=?Image.open('./train/'?+?filename).convert('RGB')
????return?np.array(img)

x_train?=?[]
#?2.把所有的圖片矩陣放在一個列表里?(840,?100,?100,?3)
for?i?in?ima_train:
????x_train.append(read_train_image(i))

x_train?=?np.array(x_train)

# 3.提取kind類別作為標簽
y_train?=?[]
for?filename?in?ima_train:
????y_train.append(int(filename.split('_')[0]))

#?標簽(0/1/2/3)(840,)
y_train?=?np.array(y_train)

#?我是因為重命名圖片為(1/2/3/4),所以都減了1
#?為了能夠轉化為獨熱矩陣
y_train?=?y_train?-?1??

#?4.把標簽轉換為獨熱矩陣
#?將類別信息轉換為獨熱碼的形式(獨熱碼有利于神經網絡的訓練)
y_train?=?np_utils.to_categorical(y_train)
y_test?=?np_utils.to_categorical(y_test)
print(y_test)

x_train?=?x_train.astype('float32')
x_test?=?x_test.astype('float32')

x_train?/=?255
x_test?/=?255

print(x_train.shape)??#?(840,?100,?100,?3)
print(y_train.shape)??#?(840,)


3 搭建卷積神經網絡


Keras是基于TensorFlow的深度學習庫,是由純Python編寫而成的高層神經網絡API,也僅支持Python開發。


它是為了支持快速實踐而對Tensorflow的再次封裝,讓我們可以不用關注過多的底層細節,能夠把想法快速轉換為結果。


# 1.搭建模型(類似于VGG,直接拿來用就行)

model?=?Sequential()
#?這里搭建的卷積層共有32個卷積核,卷積核大小為3*3,采用relu的激活方式。
# input_shape,字面意思就是輸入數據的維度。

#這里使用序貫模型,比較容易理解
#序貫模型就像搭積木一樣,將神經網絡一層一層往上搭上去

model.add(Conv2D(32,?(3,?3),?activation='relu',?input_shape=(100,?100,?3)))
model.add(Conv2D(32,?(3,?3),?activation='relu'))
model.add(MaxPooling2D(pool_size=(2,?2)))
model.add(Dropout(0.25))

model.add(Conv2D(64,?(3,?3),?activation='relu'))
model.add(Conv2D(64,?(3,?3),?activation='relu'))
model.add(MaxPooling2D(pool_size=(2,?2)))
model.add(Dropout(0.25))
#dropout層可以防止過擬合,每次有25%的數據將被拋棄

model.add(Flatten())
model.add(Dense(256,?activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4,?activation='softmax'))


4 訓練


訓練的過程,就是最優解的過程。



對上圖來說,就是根據數據集,不斷的迭代,找到一條最近似的直線(y =?kx?+ b),把參數k,b保存下來,預測的時候直接加載。


#?編譯模型
sgd?=?SGD(lr=0.01,?decay=1e-6,?momentum=0.9,?nesterov=True)
model.compile(loss='categorical_crossentropy',?optimizer=sgd,?metrics=['accuracy'])

#?一共進行32輪
#?也就是說840張圖片,每次訓練10張,相當于一共訓練84次
model.fit(x_train,?y_train,?batch_size=10,?epochs=32)


#?保存權重文件(也就是相當于“房價問題的k和b兩個參數”)
model.save_weights('./dog_weights.h5',?overwrite=True)
#?評估模型
score?=?model.evaluate(x_test,?y_test,?batch_size=10)
print(score)


5 預測


此時k、b(參數)和x(小狗的圖像)都是已知的了,求k(類別)就完了。


#?1.上傳圖片
name?=?input('上傳圖片的名稱(例如:XX.jpg)為:')

#?2.預處理圖片(代碼省略)

#?3.加載權重文件
model.load_weights('dog_weights.h5')

#?4.預測類別
classes?=?model.predict_classes(x_test)[0]

target?=?['京巴',?'拉布拉多',?'柯基',?'泰迪']
#?3-泰迪?2-柯基?1-拉布拉多?0-京巴

#?5.打印結果
print("識別結果為:"?+?target[classes])

依賴環境

1?深度學習框架Keras和TensorFlow

2?PIL擴展庫(預處理圖片)

3 Pycharm/Jupyter notebook

源碼地址??

我把源碼(包括Jupyter notebook文件)和數據集都打包好了。

公眾號后臺,回復【圖像識別】



推薦閱讀:(點擊下方標題即可跳轉)

170 道 Python 爬蟲面試題(2019 版)

為什么 Python 3 ?把 print 改為函數?




??長按 2 秒關注「 小詹學Python 」

總結

以上是生活随笔為你收集整理的小狗分类器,你家的狗子是个什么狗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。