قولجازبا سيفردى تانۋ

قولجازبا سيفردى تانۋ

ماشينالىق ۇيرەنۋ جاتتىعۋى

تالاپ: قولمەن جازىلعان اراپ سيفرلارىن كومپيۋتەرگە تانىتۋ. ياعىني ءمالىم ءبىر سيفردى اق قاعازعا جازامىز، مىسالى قاعازعا 8 سيفرىن قولمەن جازامىز. سوسىن قاعازداعى قولجازبانى سۋرەتكە تارىپ، پروگرامما ارقىلى اناليز جاسايمىز. پروگرامما سۋرەتتەگى جازۋدىڭ ەرەكشەلىكتەرىنە ساي جاتتىقتىرىلعان knn مودەلىنىڭ نىڭ توپقا ءبولۋ ءادىسى ارقىلى ەسەپتەۋ جۇرگىزىپ، ەسەپتەۋ ناتيجەسىن كورسەتەدى. كورسەتكەن ناتيجە ءبىز جازعان 8 سيفرى بولسا، پروگرامما نىسانانى ءساتتى تاپقان بولادى.

قاجەتتى ازىرلىكتەر:

Anaconda3

ۇلگى ساندىق مالىمەتتەرى: 0-9 عا دەينگى سيفرلاردىڭ قولجازبا نۇسقاداعى ۇلگى سۋرەتتەرى، مولشەرمەن 5000 دانا سۋرەت.

1. پايزوننىڭ حۇجاتىن قۇرىپ، پايزوننىڭ جۇمىس ورتاسىنا قاجەتتى مودۋلدەرمەن بۋمالاردى ەنگىزەمىز.

1 import matplotlib.pyplot as plt
2 import numpy as np
3 import pandas as pd

2.اۋەلى ۇلگى سۋرەتتىڭ بىرەۋىن اشىپ كورەلىك. 

سۋرەتتىڭ ينفورماتسياسىن باقىلاۋ ارقىلى ونىڭ ۇزىندىعى مەن ەنىنىڭ 28 سيفرمەن ياعىني ءار ءبىر سۋرەت ەكى ولشەمدى numpy ساندار تىزبەگى ارقىلى تاڭبالانعانىن بايقايمىز.

1 img_arr = plt.imread('./data/3/3_33.bmp')
2 img_arr.shape
3 plt.imshow(img_arr)

1- سۋرەت

3. مودۋەلدى جاتتىقتىرۋ.

3.1 اۋەلى ۇلگى مالىمەتتەرىن جيناقتايمىز.

feature = [] # بەس مىڭ دانا نۇمپاي تىزبەسى
target = [] # بەس مىڭ دانا سايكەستى سيفر

مۇندا ەكى تىزبەك الىپ ۇلگى ساندىق مالىمەتتەرىن feature اتتى تىزبەككە نىسانا ساندىق مالىمەتتەرىن target اتتى تىزبەككە ساقتايىق.

سۋرەتتەر 10 توپقا ءبولىنىپ ايىرىم حۇجات قالتاسىندا ساقتالعاندىقتان for اينالىمى ارقىلى تۇگەل ارالاپ سۋرەت مالىمەتتەرىن feature تىزبەككە، سۋرتكە سايكەس نىسانا مالىمەتتەرىن target اتتى تىزبەككە سالامىز. نىسانا دەپ وتىرعانىمىز ءار ءبىر سۋرەتتەگى سيفر.

 1 feature = [] # بەس مىڭ دانا numpy تىزبەسى
 2 target = [] # بەس مىڭ دانا سايكەستى سيفر
 3 
 4 for i in range(10):
 5     for j in range(1,501):
 6         imgPath = './data/'+str(i)+'/'+str(i)+'_'+ str(j)+ '.bmp'
 7         img_arr = plt.imread(imgPath)
 8         feature.append(img_arr)
 9         target.append(i)

اينالىم اتقارىلعاندا سۋرەت مالىمەتتەرى مەن سايكەستى ساندار تىزبەككە تىزىلەدى. ءسويتىپ feature اتتى تىزبەكتىڭ ىشىندە 5000 دانا سۋرەتتىڭ ەكى ولشەمدى numpy تىزبەگى ساقتالعان بولادى دا target اتتى تىزبەكتە سول تىزبەكتەگى سۋرەتتەردىڭ اتتارى ساقتالعان بولادى،ونى نىسانا دەپ اتايمىز. سۋرەت مالىمەتتەرى مەن نىسانا مالىمەتتەرى وزارا سايكەس كەلەدى. ياعىني ءبىرىنشى سۋرەت 0 دەگەن جازۋدىڭ قولجازبا سۋرەتى بولسا، نىساناداعى ءبىرىنشى سۋرەت 0 دەگەن سيفر بولادى دەگەن ءسوز.

تىزبەكتەگى مالىمەتتەردىڭ قۇرىلىمىن ىشكەرىلەي ءتۇسىنۋ ءۇشىن ءبىز ونداعى ەكى ولشەمدى تىزبەسىنىڭ سىرتقى تۇلعاسىن كورەيىك. مۇندا shape. ارقىلى تۇلعاسىن كورەمىز.

feature = np.array(feature)
target = np.array(target)
feature.shape 

feature.shape   نىڭ ناتيجەسى (5000, 28, 28) بولىپ شىقتى. بۇدان ونىڭ ءۇش ولشەمدى ساندار تىزبەگى ەكەنىن بايقايمىز. ءبىزدىڭ nkk مودۋلىمىزدى جاتتىقترۋعا ەكى ولشەمدى ساندار تىزبەسى قاجەت بولادى، سوندىقتان ءۇش ولشەمدى ساندار تىزبەسىن ەكى ولشەمدى ساندار تىزبەسىنە اينالدىرامىز. ياعىني feature اتتى تىزبەكتەگى ءار ءبىر دانا سۋرەتتىڭ ەكى ولشەمدى ساندىق مالىمەتىن ءبىر ولشەمدى تىزبەككە اينالدىرامىز.

1 feature = feature.reshape((5000),784)

ەندى feature.shape دەيتىن كاد جولدارىن اتقارىپ ەكىلىك جۇيەدەگى ساندىق تىزبەگە اينالعان اينالماعانىن بايقايىق. پروگرامما ناتيجەسى (5000, 784) دەپ كورسەتەدى. دەمەك ەكى ولشەمدى تىزبەككە ءساتتى اينالعان بولدى. (5000 دەگەن سان مەن 784 قايدان شىقتى ؟ ول سىرتقى تۇلعا مالىمەتتەرىن كورگەن كەزدە شىققان (5000, 28, 28) دەگەن ءوش ولشەمدى مالىمەتتىڭ 5000 بولەگىن سول بەتى قالتىرىپ 28 كوبەيتۋ 28 دەگەندى 784 دەپ الىپ وتىرمىز، ءسويتىپ ءبىر سۋرەتتى ءۇش ولشەمدى سيفرمەن بەلگىلەۋدەن ەكى ولشەمدى سيفرمەن بەلگىلەۋگە الماستىردىق. مۇندا سۋرت دۇرس كورىنبەۋى مۇمكىن، ءبىراق ساندىق مالىمەت وزگەرمەيدى.)

ءسويتىپ ۇلگى مالىمەتتەرىن جيناقتاۋ جۇمىسى تامامدالدى.


3.2 ۇلگى ساندىق مالىمەتتەرىن ەكى توپقا ءبولىپ ءبىر ءبولىمىن مودۋەلدى جاتتىقتىرۋعا ەندى ءبىر بولەگىن جاتتىعۋدىڭ ناتيجەسىن سىناۋعا پايدالانامىز. 

ۇلگى ساندىق مالىمەتتەرى مەن نىسانا ساندىق مالىمەتتەرىن جەكە-جەكە ەكى توپقا بولۋدەن بۇرىن ولاردىڭ رەت تارتىبىن بۇلدىرۋگە تۋرا كەلەدى. سەبەبى اۋەلگى رەت ءتارتىپ راتسونال ساندار ءتارتىبي بويىىشا كىشىدەن ۇلكەندە قاراي تارتىپپەن تىزىلگەن. وسى تارتىپ بويىنشا بۇكىل مالىمەتتى ورتاسىناق قاق بولشەك كىشى ساندار ءبىر ءبىر توپقا، ۇلكەن ساندار ءبىر توپقا ءبولىنىپ قالادى. مۇل ماشينالىق جاتتعۋدىڭ تالابىنا ساي كەلمەيدى سوندىقتان سانداردىڭ رەت ءتارتىبىن كەزدەيسوقتىق فۋنكتسياسى ارقىلى بۇلدىرەيىك.

1 np.random.seed(10) # مالىم كەزدەيسوقتىق
2 np.random.shuffle(feature)
3 np.random.seed(10) # مالىم كەزدەيسوقتىقتى قايتادان پايدالانۋ
4 np.random.shuffle(target)

ەكى تىزبەكتىڭ رەت تارتىبىن بۇلدىرگەندە سۋرەت مالىمەتتەرى مەن نىسانا مالىمەتتەرىنىڭ اۋەلگى سايكەستىگىن ساقتاپ قالۋ ءۇشىن ەكى رەتتە دە بەلگىلى كەزدەيسوقتىقتى پايدالانامىز. ءسويتىپ رەت ءتارتىپ الماسقانىمەن سۋرەت پەن سۋرەت اتىنىڭ سايكەستىگى وزگەرمەيدى. ياعىني ءبىرىنشى تىزبەكتەگى 777 - ورىندا 5 دەگەن سيفردىڭ سۋرەتى بولسا، ەكىنشى تىزبەكتىڭ 777 - ورنىنداعى سان 5 دەگەن سيفر دەگەن ءسوز.

4. رەت ءتارتىبى وزگەرگەن ءار ەكى تىزبەكتى ەكى توپقا بولەيىك.

مۇنداعى 5000 مىڭ دانا مالىمەتتىڭ 4980 داناسىن مودۋەلدى جاتتىقتىرۋعا پايالانايىق دا قالعان 20 داناسىن سىناققا پايدالانايىق. ەندەشە ءار ەكى تىزبەكتەگى سانداردى وسىلاي ەكى توپقا بولەيىك.

1 # جاتتىعۋعا قاجەتتى بولەكتى كەسىپ الامىز.
2 x_train = feature[:4980]
3 y_train = target[:4980]
4 # سىناققا قاجەتتى بولەكتى كەسىپ الامىز.
5 x_test = feature[4980:]
6 y_test = target[4980:]
7 
8 x_train.shape # جاتتىعۋعا جاجەتتى ساندىق مالىمەتتەردىڭ سانى 4980 دانا
9 x_test.shape # سىناققا قاجەتتى ساندىق مالىمەتتەردىڭ ۇزىن سانى 20 دانا بولعان ەكەن.

3.3 مودۋەلدى جاتتىقتىرۋ

1 from sklearn.neighbors import KNeighborsClassifier # قاجەتتى بۋماندى ەنگىزۋ
2 knn = KNeighborsClassifier(n_neighbors=17) # كلاستى ناقتىلاندىرىپ وبيەكت قۇرامىز، ءارى قاجەتتى پارامەتىردى 17 دەپ بەكتەمىز.
3 knn.fit(x_train,y_train) # مودۋەلدى جاتتىقتىرۋ

پروگرامما اتقارىلعاننان كەيىن تومەندەگىدەي ناتيجە كورىنەدى. بۇل مودۋەلدى جاتتىقتىرۋدىڭ ناتيجەسى 

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=17, p=2,
weights='uniform')

3.4 مولدەلدىڭ دۇرىستىق دارەجەسى

ەندى سىناق مالىمەتتەرى ارقىلى سىناق جاساۋ ارقىلى جاتتىقتىرىلعان مودۋەلدىڭ دۇرىستىق دارەجەسىن دارەجەسىن تەكسەرىپ كورەلىك.

1 print('مودەلدىڭ ناتيجەسى:',knn.predict(x_test))
2 print('شىنايى ءمان :',y_test)

جوعارىداعى كادتىڭ ناتيجەسى تومەندەگىدەي

مولدەلدىڭ ناتيجەسى: [6 6 4 4 0 8 5 8 8 2 4 3 3 9 4 1 1 2 9 2]
شىنايى ءمان : [6 6 4 4 0 8 5 8 2 2 4 3 3 9 4 2 6 2 9 2]

مودەلدىڭ ناتيجەسى مەن شىنايى ءماندى سالىستىرۋ ارقىلى جاتتىقتىرىلعان وسى مولدەلدىڭ كوپ ساندى سيفرلاردى دۇرىس تانىعاندىعىن، شىنارا سيفرلاردى دۇرىس تاني الماعانىن بايقايمىز.

2-سۋرەت


4. جاتتىققان مودۋەلدى ساقتاۋ

كوپتەگەن جاعدايلاردا مودۋەلدى جاتتىقتىرۋ بارىسى كۇردەلى دە ماشاقاتتى جۇمىس ەسەپتەلەدى، ءىبز كوپ رەتكى تاجىريبەدەن كەيىن دۇرىستىق دارەجەسى جوعارى دەپ قاراعان مودۋەلىمىزدى حۇجات فورماسىندا ساقتاپ الىپ تىكە پايدالانۋىمىزعا بولادى.

1 from sklearn.externals import joblib # مودۋەلدى ساقتاۋعا قاجەتتى بۋمانى ەنگىزۋ
2 joblib.dump(knn,'./knn_dwdar.m') # جاتتىقان مولدەدى ساقتاۋ

5. مودۋەلدى پايدالانۋ

ەندى جاتتىقتىرىلعان مودەلدى پايدالانىپ قولجازبا سيفردى تانىتىپ كورەلىك. تانىتۋدان بۇرىن بىرقىدىرۋ دايىندىق جۇمىستار ىستەلۋى قاجەت.

5.1 ەڭ اۋەلى اق قاعازعا جازىلعان قولجازبا سيفرلاردى سۋرەتكە تارتىپ پروگرامما حۇجاتىنىڭ قاسىنا ساقتاپ قويايىق.

3- سۋرەت

ەندى سۋرەتتى python نىڭ جۇمسى ورتاسىنا ەنگىزەيىك، ياعىني سۋرەتتى اشايىق.

1 ex_img_arr = plt.imread('./数字.jpg')
2 plt.imshow(ex_img_arr)
3 
4 # سۋرەتتەگى ساندار جۇيەسىن باقىلايىىق.
5 ex_img_arr.shape
6 # ناتيجەسى (241, 257, 3) بولدى، وسىدان قاراپ بۇل سۋرەتتىڭ ءۇش ولشەمدى سيفر ارقىلى تاڭبالانعانىن، بىلەمىز. 

5.2 سۋرەتتەگى 2 دەگەن سيفردى كەسىپ الايىق

1 img_two_arr = ex_img_arr[0:75,130:185,:]
2 plt.imshow(img_two_arr) # سۋرەتتى اشىپ كورۋ
3 
4 # سۋرەتتەگى ساندار جۇيەسىن باقىلايىق.
5 img_two_arr.shape
6 # باقىلاۋدان كورسەتكەن ناتيجە: (75, 55, 3) 

5.3 قاراپايىم تاسىلمەن سۋرەتتەگى ءۇش ولشەمدى ساندىق مالىمەتتى ەكى ولشەمدى ساندىق مالىمەتكە الماستىرايىق. سەبەبى ءبىز جاتتىقتىرعان مودۋەل ەكى ولشەمدى سۋرەت مالىمەتتەرى بويىنشا جاتتىقتىرىلعان.

 1 # سۋرەتتى ۇزىندىعى مەن ەنىن تەڭ سالىستىرمادا سىعىمداۋ
 2 import scipy.ndimage as ndimage
 3 img_two_arr = ndimage.zoom(img_two_arr,zoom = (28/75,28/55))
 4 # سىعىمداۋدان كەيىنگى سۋرەت مالىمەتىن كورەيىك.
 5 img_two_arr.shape
 6 # ناتيجەسى: (28, 28) 
 7 
 8 #  سىعىمدالعاننان كەيىنگى سۋرەتتى اشىپ كورەيىك.
 9 plt.imshow(img_two_arr)
10 # سىعىمداۋ بارىسىندا سۋرەتتىڭ ورەسكەل بۇزىلماعانىن كورەمىز.
11 
12 # ەندى ونى تاعى ءبىر رەت وزگەرتىپ ۇلگى سۋرەتتپەن ۇقساس كۇيگە اكەلەيىك.
13 
14 img_two_arr = img_two_arr.reshape((1,-1)) 

وسىلايشا قولجابا سۋرەتتگى 2 دەگەن سيفردىڭ سۋرەتىن مودۋەلگە سايكەستىرىپ وزگەرتتىك.


6. سۋرەتتى مودەلگە جىبەرىپ تانىتىپ كورەلىك

1 knn.predict(img_two_arr)
2 # ناتيجەسى: array([2])

تاجىريبە ءساتتى بولدى، سۋرەتتەگى سيفر 2 ەكەنىن پروگرامما ەسەپتەپ شىعاردى.

原文地址:https://www.cnblogs.com/dwdar/p/13549251.html