
API優(yōu)先設(shè)計(jì):構(gòu)建可擴(kuò)展且靈活的軟件的現(xiàn)代方法
利用機(jī)器學(xué)習(xí)和圖像識(shí)別技術(shù)對(duì)時(shí)裝進(jìn)行分類
時(shí)尚-MNIST 數(shù)據(jù)集是仿照 MNIST 數(shù)據(jù)集建模的,目的是提供最簡(jiǎn)單快捷的建模途徑。如果您已經(jīng)熟悉 MNIST 手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集,這一點(diǎn)尤為重要。 事實(shí)上,在加載時(shí)尚數(shù)據(jù)時(shí),可以使用與加載 MNIST 數(shù)據(jù)相同的代碼。
與手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集一樣,時(shí)尚數(shù)據(jù)集由 10 個(gè)類別組成。這些類別如下所示。
標(biāo)簽 | 說(shuō)明 |
0 | T 恤/上衣 |
1 | 褲裝 |
2 | 套頭衫 |
3 | 連衣裙 |
4 | 外套 |
5 | 涼鞋 |
6 | 襯衫 |
7 | 運(yùn)動(dòng)鞋 |
8 | 袋子 |
9 | 踝靴 |
可以使用與 MNIST 數(shù)據(jù)集 相同的代碼 下載和加載該數(shù)據(jù)集。代碼示例可在 多種 編程語(yǔ)言中找到,但本教程將使用 R 語(yǔ)言。
以下代碼可用于加載時(shí)裝數(shù)據(jù)集 文件 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | load_mnist <- function() { load_image_file <- function(filename) { ret = list() f = gzfile(filename,’rb’) readBin(f,’integer’,n=1,size=4,endian=’big’) ret$n = readBin(f,’integer’,n=1,size=4,endian=’big’) nrow = readBin(f,’integer’,n=1,size=4,endian=’big’) ncol = readBin(f,’integer’,n=1,size=4,endian=’big’) x = readBin(f,’integer’,n=ret$n*nrow*ncol,size=1,signed=F) ret$x = matrix(x, ncol=nrow*ncol, byrow=T) close(f) ret } load_label_file <- function(filename) { f = gzfile(filename,’rb’) readBin(f,’integer’,n=1,size=4,endian=’big’) n = readBin(f,’integer’,n=1,size=4,endian=’big’) y = readBin(f,’integer’,n=n,size=1,signed=F) close(f) y } trainData <<- load_image_file(‘data/train-images-idx3-ubyte.gz’) testData <<- load_image_file(‘data/t10k-images-idx3-ubyte.gz’) trainData$y <<- load_label_file(‘data/train-labels-idx1-ubyte.gz’) testData$y <<- load_label_file(‘data/t10k-labels-idx1-ubyte.gz’) } show_digit <- function(arr784, col=gray(12:1/12), …) { image(matrix(arr784, nrow=28)[,28:1], col=col, …) } |
上述代碼讀取時(shí)尚數(shù)據(jù)集文件。共有 4 個(gè)文件,分別對(duì)應(yīng)訓(xùn)練圖像集、相關(guān)標(biāo)簽以及測(cè)試圖像集和相關(guān)標(biāo)簽。您可以 下載 這些文件,并將它們放在 /data
目錄中以便加載。
1 2 3 4 5 6 7 8 9 | 60,000 training images: t10k-images-idx3-ubyte.gz t10k-labels-idx1-ubyte.gz 10,000 test images: train-images-idx3-ubyte.gz train-labels-idx1-ubyte.gz |
請(qǐng)注意,同樣的代碼也可用于加載 MNIST 手寫(xiě)數(shù)字?jǐn)?shù)據(jù)集!
最后,要執(zhí)行加載圖像的調(diào)用,只需運(yùn)行以下命令即可:
1 2 | load_mnist() |
現(xiàn)在我們已經(jīng)加載了圖像數(shù)據(jù),讓我們來(lái)看看它的內(nèi)容。圖像數(shù)據(jù)已加載到一個(gè)名為 trainData
的變量中。這個(gè)變量包含三個(gè)部分
1 2 3 | trainData$n – the number of records that were loaded (60,000). trainData$y – the label for each image (0-9), representing a fashion category. trainData$x – a matrix of 28×28 pixel images, each record is an array of 784 integers for each pixel in the image. |
讓我們檢查第一幅圖像。我們可以運(yùn)行以下命令查看第一幅圖像的整數(shù)數(shù)據(jù)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | trainData$x[1,] [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [21] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [41] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [61] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [81] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 13 [101] 73 0 0 1 4 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 [121] 0 0 0 0 3 0 36 136 127 62 54 0 0 0 1 3 4 0 0 3 [141] 0 0 0 0 ] 0 0 155 236 207 178 107 156 161 109 64 23 77 130 72 15 0 0 0 0 [201] 0 0 0 0 0 0 0 1 0 69 207 223 218 216 216 188 154 191 210 204 209 222 228 225 0 98 233 198 210 222 229 229 234 [541] 249 220 194 215 217 241 65 73 106 117 168 219 221 215 217 223 223 224 229 29 [561] 75 204 212 204 193 205 211 225 216 185 197 206 198 213 240 195 227 245 239 223 [581] 218 212 209 222 220 221 230 67 48 203 183 194 213 197 185 190 194 192 202 214 [601] 219 221 220 236 225 216 199 206 186 181 177 172 181 205 206 115 0 122 219 193 [621] 179 171 183 196 204 210 213 207 211 210 200 196 194 191 195 191 198 192 176 156 [641] 167 177 210 92 0 0 74 189 212 191 175 172 175 191 179 182 182 181 176 166 168 99 58 0 0 [701] 0 0 0 0 0 0 0 40 61 44 72 41 35 0 0 0 0 0 0 0 [721] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [741] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [761] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [781] 0 0 0 0 |
請(qǐng)注意圖像數(shù)據(jù)的第一條記錄包含 784 個(gè)整數(shù)值。每個(gè)數(shù)字對(duì)應(yīng) 28×28 圖像中的一個(gè)像素。我們將使用這些值作為機(jī)器學(xué)習(xí)模型的輸入,處理圖像識(shí)別。
我們可以通過(guò) trainData$y[1]
值來(lái)查看該圖像的類別。如下所示。
1 2 | trainData$y[1] 9 |
第一張圖片的類別是 9
,對(duì)應(yīng)的是 踝靴
。
我們還有一個(gè)可視化圖像數(shù)據(jù)的輔助方法,名為 show_digit
。我們可以用它來(lái)查看每張圖像,了解數(shù)據(jù)的實(shí)際顯示效果。
1 2 | show_digit(trainData$x[1,]) |
運(yùn)行上述代碼后,圖像輸出如下所示。
顯示 fashion-mnist 數(shù)據(jù)集中的第一張圖片
讓我們來(lái)看看處理時(shí)尚數(shù)據(jù)集的模型是什么樣的。既然要進(jìn)行圖像識(shí)別,我們就需要為機(jī)器學(xué)習(xí)模型提供像素輸入。 我們還需要從模型中獲取 10 個(gè)不同的類別作為輸出,并確定每張圖像的分類類型。讓我們從輸入開(kāi)始。
由于輸入是一幅 28×28 像素的灰度圖像,我們最終會(huì)有 28 * 28 = 784 個(gè)輸入。我們還將有 10 個(gè)輸出,每個(gè)類別或等級(jí)一個(gè)。我們可以用下面的神經(jīng)網(wǎng)絡(luò)模型來(lái)直觀地展示這一設(shè)計(jì)。
用于識(shí)別 28×28 像素圖像的神經(jīng)網(wǎng)絡(luò)機(jī)器學(xué)習(xí)模型
在上述設(shè)計(jì)中,我們提供了 784 個(gè)輸入,(28×28)圖像中的每個(gè)像素都有一個(gè)輸入。我們將收到 10 個(gè)不同的輸出,每個(gè)輸出代表時(shí)尚對(duì)象可被歸類為的每個(gè)獨(dú)特類別。 隱藏層可以由任意數(shù)量的神經(jīng)元和層組成,這取決于你希望你的神經(jīng)網(wǎng)絡(luò)有多深或多淺。 要實(shí)現(xiàn)更深的抽象和更高的處理結(jié)果,例如深度學(xué)習(xí),一般需要更多的隱藏層和神經(jīng)元。就我們的目的而言,一個(gè)相對(duì)淺層的神經(jīng)網(wǎng)絡(luò)就足夠了。
當(dāng)然,神經(jīng)網(wǎng)絡(luò)只是一種可用于圖像識(shí)別和分類的機(jī)器學(xué)習(xí)模型。實(shí)際上,我們將使用幾種不同的機(jī)器學(xué)習(xí)算法來(lái)建立模型,并比較它們的準(zhǔn)確性結(jié)果。 其中包括邏輯回歸、支持向量機(jī)和提升樹(shù)。
讓我們來(lái)看看上述簡(jiǎn)單圖像識(shí)別模型所能達(dá)到的一些精確度結(jié)果。
首先,讓我們將每張圖像的 Y
標(biāo)簽轉(zhuǎn)換成一個(gè)因子。這樣,它們就可以在所有圖像數(shù)據(jù)中成為唯一的類別。我們可以使用下面顯示的代碼來(lái)完成這項(xiàng)工作。
1 2 3 | trainData$y <- as.factor(trainData$y) testData$y <- as.factor(testData$y) |
此外,讓我們?yōu)橐蜃臃峙淇勺x標(biāo)簽,這樣我們就能識(shí)別每張圖像的類別,而無(wú)需查找每個(gè)預(yù)測(cè)類別的數(shù)值。
1 2 3 4 5 6 7 8 | labels <- c(‘T-shirt/top’, ‘Trouser’, ‘Pullover’, ‘Dress’, ‘Coat’, ‘Sandal’, ‘Shirt’, ‘Sneaker’, ‘Bag’, ‘Ankle boot’) levels(trainData$y) <- labels levels(testData$y) <- labels dataTrain <- data.frame(x = trainData$x[1:10000,], y = trainData$y[1:10000]) dataTest <- data.frame(x = testData$x, y = testData$y) |
正如您在上述代碼中看到的,我們將訓(xùn)練數(shù)據(jù)限制在前 10,000 張圖像。通過(guò)這種方式,我們可以加快訓(xùn)練機(jī)器學(xué)習(xí)模型的處理時(shí)間。根據(jù)您的電腦速度,您可能希望在全部數(shù)據(jù)集上進(jìn)行訓(xùn)練。 請(qǐng)記住,由于我們擁有訓(xùn)練集和測(cè)試集的標(biāo)簽,因此可以將兩者結(jié)合起來(lái),在整個(gè)數(shù)據(jù)集(70,000 張圖像)上進(jìn)行訓(xùn)練,從而進(jìn)一步提高準(zhǔn)確率。
數(shù)據(jù)設(shè)置完成后,我們就可以開(kāi)始訓(xùn)練了。但首先,讓我們看看在不使用任何機(jī)器學(xué)習(xí)的情況下,數(shù)據(jù)的基準(zhǔn)準(zhǔn)確率是多少。
在訓(xùn)練機(jī)器學(xué)習(xí)模型之前,重要的是查看在沒(méi)有機(jī)器學(xué)習(xí)的情況下對(duì)圖像進(jìn)行分類的基準(zhǔn)準(zhǔn)確率。 這樣,我們就能更好地了解人工智能機(jī)器學(xué)習(xí)模型是否真的在學(xué)習(xí),從而改進(jìn)非機(jī)器學(xué)習(xí)算法方法。
產(chǎn)生基準(zhǔn)準(zhǔn)確度結(jié)果的常用方法是簡(jiǎn)單地猜測(cè)。在這種情況下,我們可以簡(jiǎn)單地選擇出現(xiàn)頻率最高的時(shí)尚對(duì)象類別,并假設(shè)每張圖像都是這一類別。 畢竟,如果我們預(yù)測(cè)每張圖片最常出現(xiàn)的類別,那么我們對(duì)每張圖片預(yù)測(cè)正確的幾率就會(huì)比猜測(cè)其他類別的幾率稍高一些。
既然我們要找出出現(xiàn)頻率最高的圖像類別,為了計(jì)算出一個(gè)簡(jiǎn)單的基線結(jié)果,讓我們看看我們的數(shù)據(jù)集中到底有多少種不同的圖像類別。
1 | table(dataTrain$y) |
通過(guò)上述代碼,我們可以得到下表中的機(jī)器學(xué)習(xí)圖像識(shí)別類別(記住,我們只查看了前 10,000 張圖像?。?/p>
1 2 3 4 T-shirt/top Trouser Pullover Dress Coat Sandal Shirt 942 1027 1016 1019 974 989 1021 Sneaker Bag Ankle boot 1022 990 1000
從上表可以看出, "褲子 "
是出現(xiàn)頻率最高的圖像類別。因此,如果我們對(duì)數(shù)據(jù)集中的每張圖像都預(yù)測(cè)為 "褲子"
,那么在完全猜測(cè)一個(gè)類別時(shí),我們就能獲得盡可能高的準(zhǔn)確率。這就是我們的基準(zhǔn)準(zhǔn)確率。
現(xiàn)在,只要用類別列表中的最大數(shù)量除以訓(xùn)練集中的圖像數(shù)量,就能計(jì)算出這個(gè) “猜測(cè) “指標(biāo)的基準(zhǔn)準(zhǔn)確率。
1 | max(table(dataTrain$y)) / nrow(dataTrain) |
我們最終得到的準(zhǔn)確率為 0.1027
或 10.27%
。這似乎并不太理想,尤其是考慮到我們有 10 個(gè)不同類別的圖像。在 10 個(gè)類別中,猜測(cè)任何一個(gè)類別(在完全平衡的數(shù)據(jù)集上)的準(zhǔn)確率約為 10%。 當(dāng)然,由于我們的數(shù)據(jù)集在不同類別之間確實(shí)(大部分)是平衡的,這也解釋了為什么我們的基準(zhǔn)準(zhǔn)確率約為 10%。由于數(shù)據(jù)集中 “褲子 “對(duì)象的圖片數(shù)量比其他類型的圖片多,所以我們的準(zhǔn)確率略有提高。
回想一下,我們只查看了數(shù)據(jù)集中前 10,000 張圖片的類別。如果你實(shí)際查看訓(xùn)練集中所有 60,000 張圖片的類別,它們?cè)谒蓄悇e中實(shí)際上是完全平衡的! 在整個(gè)訓(xùn)練圖像數(shù)據(jù)集中,每個(gè)類別有 6000 張圖像。測(cè)試數(shù)據(jù)集也是如此,每個(gè)類別有 1,000 張圖像。
現(xiàn)在我們有了 10.27% 的基準(zhǔn)猜測(cè)準(zhǔn)確率,讓我們看看機(jī)器學(xué)習(xí)圖像識(shí)別是否能做得更好。
對(duì)于我們應(yīng)用到數(shù)據(jù)中的每個(gè)機(jī)器學(xué)習(xí)模型,我們都將使用以下代碼來(lái)測(cè)量混淆矩陣中的準(zhǔn)確性結(jié)果和總體準(zhǔn)確性。回想一下,為了更快地獲得結(jié)果,我們只在 10,000 張圖片的數(shù)據(jù)子集上進(jìn)行訓(xùn)練。
1 | trainctrl <- trainControl(verboseIter = TRUE, number=5, repeats=1, method=’repeatedcv’) fit <- train(y ~ ., data=dataTrain, method = ‘gbm’, trControl = trainctrl) confusionMatrix(predict(fit, dataTrain), dataTrain$y) confusionMatrix(predict(fit, dataTest), dataTest$y) length(which(predict(fit, dataTrain) == dataTrain$y)) / nrow(dataTrain) length(which(predict(fit, dataTest) == dataTest$y)) / nrow(dataTest) |
混淆矩陣如下
1 2 3 4 5 6 | Confusion Matrix and Statistics Reference Prediction T-shirt/top Trouser Pullover Dress Coat Sandal Shirt Sneaker Bag Ankle boot T-shirt/top 815 2 7 25 3 0 115 0 0 0 Trouser 1 1012 0 5 0 1 0 0 3 0 Pullover 8 1 823 9 72 0 81 0 2 0 Dress 39 11 10 941 27 0 34 0 6 0 Coat 6 1 96 23 817 0 75 0 7 0 Sandal 0 0 1 0 0 969 1 6 0 5 Shirt 63 0 75 16 54 0 703 0 10 0 Sneaker 0 0 0 0 0 12 0 989 2 18 Bag 10 0 4 0 1 2 12 1 958 0 Ankle boot 0 0 0 0 0 5 0 26 2 977 |
在混淆矩陣中,最佳準(zhǔn)確度將顯示為一條從預(yù)測(cè)類別的左上方到右下方的大值對(duì)角線。對(duì)于每個(gè)參考類別,您希望看到同一類別預(yù)測(cè)的最高值。
上述混淆矩陣(基于梯度提升機(jī)模型的結(jié)果)的準(zhǔn)確率為 90%。
讓我們來(lái)看看我們的成果。
使用 提升邏輯回歸 的機(jī)器學(xué)習(xí)模型,我們可以用以下代碼計(jì)算出準(zhǔn)確率。
1 | fit <- train(y ~ ., data=dataTrain, method = ‘LogitBoost’, trControl = trainctrl) |
通過(guò) 提升樹(shù) ,我們可以得到以下結(jié)果。
1 | fit <- train(y ~ ., data=dataTrain, method = ‘gbm’, trControl = trainctrl) |
通過(guò) 多項(xiàng)式回歸 ,我們可以得到以下結(jié)果。
1 | fit <- train(y ~ ., data=dataTrain, method = ‘multinom’, trControl = trainctrl, MaxNWts = 10000) |
通過(guò) 支持向量機(jī) ,我們可以得到以下結(jié)果。
1 | fit <- train(y ~ ., data=dataTrain, method = ‘svmRadial’, trControl = trainctrl) |
從上面顯示的機(jī)器學(xué)習(xí)圖像識(shí)別準(zhǔn)確率中,我們可以看到機(jī)器學(xué)習(xí)模型取得的結(jié)果肯定比我們的基線 “猜測(cè) “模型要好得多。 我們?cè)?10,000 張圖片上訓(xùn)練出的最佳模型(SVM)在訓(xùn)練集上的準(zhǔn)確率為 91%,在測(cè)試集上的準(zhǔn)確率為 87%。 如果將其與我們的基準(zhǔn)準(zhǔn)確率(”猜測(cè) “模型)進(jìn)行比較,我們的準(zhǔn)確率僅為 10%,而 “猜測(cè) “模型只是預(yù)測(cè)了每張圖片中出現(xiàn)頻率最高的類別(褲子)。
與基線模型相比,我們的機(jī)器學(xué)習(xí)圖像識(shí)別預(yù)測(cè)模型的準(zhǔn)確率大幅提高,證明我們的模型確實(shí)比簡(jiǎn)單的猜測(cè)更好。
事實(shí)上,讓我們來(lái)看看我們的模型在處理網(wǎng)絡(luò)上的實(shí)時(shí)時(shí)尚圖片時(shí)效果如何。
要在真實(shí)圖片上測(cè)試我們的模型,我們可以對(duì)想要測(cè)試的時(shí)尚類別進(jìn)行在線 圖片搜索 。例如,讓我們?cè)囋?連衣裙 。
由于我們的機(jī)器學(xué)習(xí)模型是在大小為 28×28 像素的圖像上訓(xùn)練出來(lái)的,因此在使用人工智能機(jī)器學(xué)習(xí)圖像識(shí)別模型處理圖像之前,我們只需調(diào)整圖像的大小。為此,我們只需下載圖像,然后在任何 繪畫(huà)程序 中進(jìn)行編輯,將其調(diào)整到正確的尺寸。請(qǐng)記住,將圖像調(diào)整為 28×28 像素的固定分辨率很可能會(huì)扭曲長(zhǎng)寬比和圖像質(zhì)量,從而導(dǎo)致分類預(yù)測(cè)的可靠性降低。 不過(guò),它還是讓我們了解了圖像識(shí)別機(jī)器學(xué)習(xí)算法的工作原理。
除了將大小調(diào)整為 28×28 像素外,我們還需要將背景涂成黑色。預(yù)處理完成后,我們就可以將圖像加載到模型中了。圖像顯示如下。
用于機(jī)器學(xué)習(xí)圖像識(shí)別的 28×28 像素連衣裙圖像特寫(xiě)。
由于上圖是 28×28 像素圖像的特寫(xiě)(雖然人工智能對(duì)其進(jìn)行分類沒(méi)有問(wèn)題,但看到的圖像還是相當(dāng)小的?。旅媸钦鎸?shí)分辨率的實(shí)際圖像。 您可以了解到這些圖像有多小,但人工智能仍能成功進(jìn)行分類!
用于機(jī)器學(xué)習(xí)圖像識(shí)別的 28×28 像素連衣裙圖像的實(shí)際視圖。
這張圖很小,但我們的機(jī)器學(xué)習(xí)模型經(jīng)過(guò)訓(xùn)練可以處理它。讓我們通過(guò)圖像識(shí)別模型運(yùn)行該圖像,看看人工智能將該圖像識(shí)別為哪個(gè)類別。
我們可以用以下代碼加載圖像并對(duì)其進(jìn)行分類。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | runTest <- function(filename, model) { png <- loadImage(filename) show_digit(png$bytes) pngData <- data.frame(x = matrix(png$bytes, 1, 784)) predict(model, pngData) } |
上述輔助方法只是簡(jiǎn)單地加載 png 圖像。然后顯示圖像,以便我們看到圖像的外觀。然后,它將圖片中的字節(jié)轉(zhuǎn)換為我們的模型所需的格式(灰度,共有 784 個(gè)整數(shù)值)。最后,它調(diào)用 預(yù)測(cè)
方法將圖片分類為特定類型的時(shí)尚物品。
最后,我們可以運(yùn)行輔助方法來(lái)加載和分類圖像。讓我們看看它是怎么做的。
1 | runTest(‘data/test/dress-28×28.png’, fit) |
上述測(cè)試的輸出結(jié)果如下。
1 | [1] Dress |
成功!
在真實(shí)的測(cè)試數(shù)據(jù)上檢查機(jī)器學(xué)習(xí)模型是一種方便、人性化的方法,可以展示機(jī)器學(xué)習(xí)模型的準(zhǔn)確性。當(dāng)然,實(shí)際的統(tǒng)計(jì)精確度要高得多,但直觀演示還是很有幫助的。 可視化測(cè)試和統(tǒng)計(jì)準(zhǔn)確度測(cè)量都是顯示我們的機(jī)器學(xué)習(xí)模型實(shí)際學(xué)習(xí)準(zhǔn)確度的方法。
我們還可以通過(guò)繪制 學(xué)習(xí)曲線 來(lái)證明我們的機(jī)器學(xué)習(xí)模型能夠預(yù)測(cè)出更好的結(jié)果,并且確實(shí)在 學(xué)習(xí) 。
學(xué)習(xí)曲線是 觀察準(zhǔn)確性的 一種方法
詳細(xì)考慮一下這個(gè)想法。如果只在一張圖片上訓(xùn)練一個(gè)模型,它應(yīng)該很容易就能學(xué)會(huì)正確分類。畢竟,這只是 1 張圖像和 1 個(gè)類別。這很容易。這樣一來(lái),1 張圖片的準(zhǔn)確率就能達(dá)到 100%。 現(xiàn)在,在不同類別的測(cè)試圖像上運(yùn)行相同的模型。它很有可能會(huì)預(yù)測(cè)這張測(cè)試圖片與單張訓(xùn)練圖片的類別相同。畢竟,它所見(jiàn)過(guò)的唯一圖像就是單張訓(xùn)練圖像。 因此,它很可能也會(huì)預(yù)測(cè)出測(cè)試圖像的相同類別。這導(dǎo)致準(zhǔn)確率為 0%。在這種情況下,兩個(gè)準(zhǔn)確率相差最大(100% 對(duì) 0%)。
接下來(lái),我們考慮用稍大一點(diǎn)的 10 幅圖像數(shù)據(jù)集來(lái)實(shí)現(xiàn)同樣的想法。由于機(jī)器學(xué)習(xí)模型只需學(xué)習(xí) 10 張不同的圖像,因此它仍能獲得很高的準(zhǔn)確率?,F(xiàn)在針對(duì)測(cè)試集運(yùn)行該模型。 雖然它的準(zhǔn)確率可能比 0% 稍高一些(正如我們?cè)谥粚?duì) 1 幅圖像進(jìn)行訓(xùn)練時(shí)所看到的那樣),但我們預(yù)計(jì)它的表現(xiàn)仍然會(huì)很差。 這是因?yàn)槟P同F(xiàn)在已經(jīng)看到了 10 張不同的圖像,使其更有可能在測(cè)試集中至少正確獲得 1 張圖像。這可能會(huì)表現(xiàn)為 99% 的準(zhǔn)確率相對(duì)于 1% 或類似的準(zhǔn)確率。
一般來(lái)說(shuō),機(jī)器學(xué)習(xí)模型接觸的訓(xùn)練數(shù)據(jù)越多,訓(xùn)練準(zhǔn)確率就越低,測(cè)試準(zhǔn)確率就越高。模型在更多的訓(xùn)練數(shù)據(jù)中學(xué)習(xí)會(huì)變得更加困難。 不過(guò),數(shù)據(jù)范圍可以讓它更好地歸納出以前未見(jiàn)過(guò)的新圖像。到了一定程度,兩種準(zhǔn)確度開(kāi)始趨同(或至少接近趨同)。
通過(guò)這種方式,學(xué)習(xí)曲線可以告訴我們,我們的模型是否真的在從數(shù)據(jù)中學(xué)習(xí),并在交叉驗(yàn)證或測(cè)試集上通過(guò)越來(lái)越大的數(shù)據(jù)集獲得更好的準(zhǔn)確度。 我們還可以了解更多的數(shù)據(jù)是否會(huì)使我們的模型變得更好!
為了證明我們的機(jī)器學(xué)習(xí)圖像識(shí)別模型確實(shí)在學(xué)習(xí),我們可以繪制數(shù)據(jù)在越來(lái)越大的訓(xùn)練集中的學(xué)習(xí)曲線。我們將繪制訓(xùn)練集準(zhǔn)確率和測(cè)試集準(zhǔn)確率的對(duì)比圖。 我們可以使用從 1,000 張圖像到 60,000 張圖像的訓(xùn)練集。這樣會(huì)產(chǎn)生如下學(xué)習(xí)曲線。
用于時(shí)裝分類的圖像識(shí)別學(xué)習(xí)曲線
正如上文所述,我們可以清楚地看到,學(xué)習(xí)曲線由兩條向下和向右的弧線組成,似乎最終趨于一致。訓(xùn)練集的準(zhǔn)確率幾乎達(dá)到 100%,而測(cè)試集的準(zhǔn)確率則低得多,大約只有 60% 或更低。 隨著更多的訓(xùn)練數(shù)據(jù)被輸入到機(jī)器學(xué)習(xí)模型中,我們的訓(xùn)練準(zhǔn)確率迅速下降到 80% 左右,而測(cè)試集的準(zhǔn)確率則逐漸提高到 75% 或更高。
如果我們?cè)谟?xùn)練集和測(cè)試集之間繪制一條趨勢(shì)線,就會(huì)更清楚地看到,在大約 55000 張訓(xùn)練圖像之后,準(zhǔn)確率水平開(kāi)始趨近于 75% 左右。
收斂時(shí)帶有平滑趨勢(shì)線的時(shí)裝分類圖像識(shí)別學(xué)習(xí)曲線
從學(xué)習(xí)曲線圖中可以看出,在使用 60,000 張圖像進(jìn)行訓(xùn)練后,訓(xùn)練集和測(cè)試集的準(zhǔn)確率似乎都趨近于 78% 左右。 如果我們輸入更多的圖像數(shù)據(jù)來(lái)訓(xùn)練模型,我們的模型似乎不會(huì)比這更好。 這是使用學(xué)習(xí)曲線的主要好處,因?yàn)樗梢愿嬖V我們是否應(yīng)該花時(shí)間尋找更多的訓(xùn)練數(shù)據(jù),或者花時(shí)間微調(diào)我們的模型和特征列表。
既然我們知道了學(xué)習(xí)曲線的作用,那就讓我們來(lái)看看如何 構(gòu)建 學(xué)習(xí)曲線吧
要從我們的圖像識(shí)別時(shí)尚數(shù)據(jù)集中建立學(xué)習(xí)曲線,我們只需在一個(gè)循環(huán)中迭代,每次都在更大的數(shù)據(jù)集上訓(xùn)練我們的模型。我們可以用下面的代碼來(lái)實(shí)現(xiàn)這一目標(biāo)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | library(reshape2) results <- data.frame() for (i in 1:30) { partialSet <- dataTrain[1:1000 * i,] fit <- train(y ~ ., data=partialSet, method = ‘LogitBoost’, trControl = trainctrl) correct1 <- length(which(predict(fit, partialSet) == partialSet$y)) / nrow(partialSet) correct2 <- length(which(predict(fit, dataTest) == dataTest$y)) / nrow(dataTest) results <- rbind(results, c(correct1, correct2)) names(results) <- c(‘Train’, ‘CV’) r <- melt(results) r <- cbind(r, seq(from = 1000, to = nrow(results) * 1000, by = 1000)) names(r) <- c(‘Set’, ‘Accuracy’, ‘Count’) print(ggplot(data = r, aes(x = Count, y = Accuracy, colour = Set)) + geom_line() + geom_smooth(method = ‘lm’, se=F)) } |
在上述代碼中,請(qǐng)注意我們只是調(diào)用了一個(gè) for
學(xué)習(xí)曲線在分析機(jī)器學(xué)習(xí)模型的性能方面可以發(fā)揮難以置信的作用。例如,它們可以顯示模型內(nèi)部的 偏差和差異 ,以及在更大數(shù)據(jù)集上學(xué)習(xí)的成功率。因此,在驗(yàn)證人工智能機(jī)器學(xué)習(xí)模型時(shí), 了解 并考慮使用學(xué)習(xí)曲線非常重要。
該項(xiàng)目的 源代碼 可在 GitHub 上獲取。
原文鏈接: https://www.primaryobjects.com/2017/10/23/image-recognition-for-fashion-with-machine-learning/
API優(yōu)先設(shè)計(jì):構(gòu)建可擴(kuò)展且靈活的軟件的現(xiàn)代方法
API 安全:如何準(zhǔn)備和應(yīng)對(duì)攻擊漏洞
Python 集成 NFT構(gòu)建 API 的實(shí)戰(zhàn)指南
API版本控制與微服務(wù):最佳實(shí)踐的重要性
通過(guò) Python 使用 當(dāng)當(dāng)開(kāi)放平臺(tái) API 實(shí)現(xiàn)書(shū)籍推薦系統(tǒng)
掌握 API 數(shù)據(jù)檢索:過(guò)濾和排序的全面指南
2023年12個(gè)必備的書(shū)籍API
API 發(fā)現(xiàn):你需要了解的一切
文檔提取與人工智能的完整指南
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)