一碗酸梅湯 作品

第53章 大功告成

    不過,在跑代碼之前,還要對數據進行預處理。

    江寒先從報名信息表中,將性別信息仍然“健在”的行挑出來,只保留序號、姓名和性別,另存為label.xls。

    這些記錄一共9527條,大約佔三萬多條數據總數的30%。

    它們對應著9527張真彩色照片。

    24位真彩色的圖片,每個像素點在內存裡,要佔用3個字節的存儲單元。

    每張照片有210x120個像素,這樣讀入一張照片,需要的內存空間就是210x120x3=75600個byte。

    9527條數據,共需要9527x75600=720241200b≈686.88m≈0.7g!

    這個內存開銷,還是比較容易接受的。

    但是,“感知機”的算法,需要進行大量浮點乘法運算。

    對每個像素的每個rgb分量都算一遍?

    沒那個必要,也太浪費時間。

    所以,聰明的做法,是先把照片數據“壓縮”一下。

    江寒給“感知機”的代碼,添加了一個loaddata函數,用來讀取和處理照片數據。

    在這個函數里,先定義一個二維的整形數組feature。

    然後從label.xls中讀出序號、姓名信息,按照剛才建立的索引表,找到對應的照片文件。

    下一步,將照片讀取到內存中,讀取的同時,將每個像素二值化。

    具體做法是:色彩濃度在閾值以上的像素,取值為1,低於閾值就讓它為0。

    這樣一來,原本的真彩色照片,就被轉換成了黑白輪廓圖。

    然後,再將輪廓圖中的0或者1的取值,按照從左到右、從上到下的順序,重新編排成一行數據,存放到數組feature中。

    feature中的每一行,都存儲了一張照片的二值化信息。

    一共9527張照片,就需要9527行。

    全部照片處理完畢後,就得到了一個巨大的二維數組feature。

    它有25200列、9527行。

    接下來,定義一個擁有9527個整形元素的一維數組label。

    從label.xls中讀入性別信息,男生設為1,女生設為0,存放在數組label中。

    feature加上對應的label,就構成了訓練數據集。

    訓練“感知機”時,將一行行feature代入公式中,進行加權和運算,其結果再通過sign函數,轉換為0或1,然後和對應的label值對照。

    如果不相符,就調整權重和偏置,然後重新計算。

    當每一個feature代入公式後,都能計算出正確的label時,就得到了一組權重和偏置。

    也就是說,構建出了一個可用的數學模型。

    依據這個模型,計算機就可以讀入任何一張同尺寸、類型的照片,對其二值化的數據代入模型中運算,並根據運算結果判斷分類歸屬。