訂閱
糾錯(cuò)
加入自媒體

在 R 中使用 Keras 構(gòu)建深度學(xué)習(xí)圖像分類器

介紹

深度學(xué)習(xí)和人工智能的一個(gè)重要應(yīng)用是圖像分類。圖像分類是根據(jù)圖像所包含的特定特征或特征對(duì)圖像進(jìn)行標(biāo)記的過程。該算法識(shí)別這些特征并利用它們來區(qū)分圖像并為它們分配標(biāo)簽。

卷積神經(jīng)網(wǎng)絡(luò) (CNN) 是深度學(xué)習(xí)圖像分類模型的主要構(gòu)建塊,通常用于圖像識(shí)別、圖像分類、對(duì)象檢測和其他類似任務(wù)。

Python 廣泛用于圖像分類問題。TensorFlow 和 Keras 是用于在 Python 中構(gòu)建圖像分類器的兩個(gè)流行包。但是,這兩個(gè)庫也可以在 R 環(huán)境中使用。本文介紹了在 R 中使用 Keras 構(gòu)建深度學(xué)習(xí)圖像分類器模型的分步方法。

MNIST 時(shí)尚圖像分類器

我們將構(gòu)建一個(gè)圖像分類器,可以對(duì)服裝圖像進(jìn)行分類,例如連衣裙、襯衫和夾克。

我們將使用 Fashion MNIST 數(shù)據(jù)集,該數(shù)據(jù)集包含 70,000 張灰度圖像。每張圖像都是灰度 28 x 28 圖像,分為 10 個(gè)不同的類別。每個(gè)圖像都附有一個(gè)標(biāo)簽?偣灿惺畟(gè)標(biāo)簽:

· T恤/上衣

· 褲子

· 套衫

· 裙子

· 外套

· 涼鞋

· 襯衫

· 運(yùn)動(dòng)鞋

· 包

· 踝靴

讓我們首先導(dǎo)入所有必需的庫。

library(keras)

library(tidyverse)

然后使用以下命令直接從 Keras 導(dǎo)入 Fashion MNIST 數(shù)據(jù)集。此外,將使用 60,000 張圖像來訓(xùn)練模型,并使用 10,000 張圖像來評(píng)估模型對(duì)圖像進(jìn)行分類的學(xué)習(xí)效果。

fashion_mnist <- dataset_fashion_mnist()

c(train_images, train_labels) %<-% fashion_mnist$train

c(test_images, test_labels) %<-% fashion_mnist$test

我們現(xiàn)在有四個(gè)數(shù)組:train_images 和 train_labels 數(shù)組包含訓(xùn)練集,這是模型用來訓(xùn)練的數(shù)據(jù)。該模型針對(duì)測試集進(jìn)行驗(yàn)證,包括 test_images 和 test_label 數(shù)組。

每張圖片都是一個(gè) 28 x 28 的數(shù)組,像素值范圍從 0 到 255。標(biāo)簽是從 0 到 9 的整數(shù)數(shù)組。這些與衣服的類別有關(guān)。之后,為每個(gè)圖像分配一個(gè)標(biāo)簽。因?yàn)轭惷话跀?shù)據(jù)集中,我們將使用以下命令將它們保存在向量中,并在稍后繪制圖像時(shí)使用它們。

class_names = c('T-shirt/top',

'Trouser',

'Pullover',

'Dress',

'Coat',

'Sandal',

'Shirt',

'Sneaker',

'Bag',

'Ankle boot')

在我們訓(xùn)練模型之前,讓我們看一下數(shù)據(jù)集的格式。使用下面的命令,我們將打印訓(xùn)練圖像和訓(xùn)練標(biāo)簽的尺寸,它們是 60,000 張圖像,每張 28 × 28 像素。

dim(train_images)

dim(train_labels)

同樣,使用以下命令打印測試圖像和測試標(biāo)簽的尺寸,即 10,000 張圖像,每張圖像的大小為 28 x 28 像素。

dim(test_images)

dim(test_labels)

然后,我們將使用以下命令查看數(shù)據(jù)集中的示例圖像。

options(repr.plot.width=7, repr.plot.height=7)

sample_image <- as.data.frame(train_images[7, , ])

colnames(sample_image) <- seq_len(ncol(sample_image))

sample_image$y <- seq_len(nrow(sample_image))

sample_image <- gather(sample_image, "x", "value", -y)

sample_image$x <- as.integer(sample_image$x)

ggplot(sample_image, aes(x = x, y = y, fill = value)) +

geom_tile() + scale_fill_gradient(low = "white", high = "black", na.value = NA) +

scale_y_reverse() + theme_minimal() + theme(panel.grid = element_blank()) +

theme(aspect.ratio = 1) + xlab("") + ylab("")

在訓(xùn)練模型之前,必須對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。為了減少像素值,我們必須對(duì)數(shù)據(jù)進(jìn)行歸一化。目前,所有圖像像素的值都在 0-255 之間,我們想要介于 0 和 1 之間的值。因此,我們將所有像素值除以 255.0 分為訓(xùn)練集和測試集。

train_images <- train_images / 255

test_images <- test_images / 255

為確保數(shù)據(jù)格式正確,讓我們查看訓(xùn)練集中的前 30 張圖像。我們還將在每個(gè)圖像下方顯示類名。

options(repr.plot.width=10, repr.plot.height=10)

par(mfcol=c(10,10))

par(mar=c(0, 0, 1.5, 0), xaxs='i', yaxs='i')

for (i in 1:30) {

img <- train_images[i, , ]

img <- t(apply(img, 2, rev))

image(1:28, 1:28, img, col = gray((0:255)/255), xaxt = 'n', yaxt = 'n',

main = paste(class_names[train_labels[i] + 1]))}

現(xiàn)在是時(shí)候建立我們的模型了。

構(gòu)建模型

要構(gòu)建神經(jīng)網(wǎng)絡(luò),我們需要如下配置模型的層:

1.卷積或Conv2D層:卷積層從圖像或圖像的一部分中提取特征。我們?cè)谶@里指定三個(gè)參數(shù):

· 過濾器——這是將在卷積中使用的過濾器的數(shù)量。例如,32 或 64。

· 內(nèi)核大小——卷積窗口的長度。例如 (3,3) 或 (4,4)。

· 激活函數(shù)——例如,ReLU、Leaky ReLU、Tanh 和 Sigmoid。

2.Pooling 或 MaxPooling2D 層:該層用于減小圖像的大小。

3.Flatten Layer:該層將n維數(shù)組縮減為一維。

4.Dense Layer:這一層是全連接的,這意味著當(dāng)前層的所有神經(jīng)元都鏈接到下一層。對(duì)于我們的模型,第一密集層有 128 個(gè)神經(jīng)元,第二密集層有 10 個(gè)神經(jīng)元。

5.Dropout Layer:為了防止模型過擬合,該層忽略了一組神經(jīng)元(隨機(jī))。

model <- keras_model_sequential()

model %>%

layer_conv_2d(filters = 32, kernel_size = c(3,3),

activation = 'relu', input_shape = c(28, 28, 1)) %>%

layer_max_pooling_2d(pool_size = c(2,2)) %>%

layer_flatten() %>%

layer_dense(units = 128, activation = 'relu') %>%

layer_dropout(rate = 0.5) %>%

layer_dense(units = 10, activation = 'softmax')

在模型準(zhǔn)備好進(jìn)行訓(xùn)練之前,需要進(jìn)行一些額外的設(shè)置。這些是在模型的編譯步驟中添加的:

1.損失函數(shù)——這個(gè)函數(shù)評(píng)估我們的算法如何有效地表示數(shù)據(jù)集。根據(jù)我們的數(shù)據(jù)集,我們可以從“categorical_cross_entropy”

“binary_cross_entropy”和“sparse categorical_cross_entropy”等備選方案中進(jìn)行選擇。

2.優(yōu)化器——有了這個(gè),我們可以調(diào)整神經(jīng)網(wǎng)絡(luò)的權(quán)重和學(xué)習(xí)率。我們可以從許多優(yōu)化器中進(jìn)行選擇,例如 Adam、AdaDelta、SGD 等。

3.Metrics – 這些用于評(píng)估我們模型的性能。例如,準(zhǔn)確度、均方誤差等。

model %>% compile(

loss = 'sparse_categorical_crossentropy',

optimizer = 'adam',

metrics = c('accuracy')

我們模型層中的所有參數(shù)和形狀都可以使用“summary”函數(shù)查看,如下所示。

summary(model)

要開始訓(xùn)練,我們將調(diào)用 fit 方法,它將使用訓(xùn)練和測試數(shù)據(jù)以及以下輸入來擬合我們的模型:

history % fit(x_train, train_labels, epochs = 20,verbose=2)

1.Epochs – 整個(gè)數(shù)據(jù)集通過神經(jīng)網(wǎng)絡(luò)向前和向后發(fā)送的次數(shù)。verbose – 查看我們輸出的選擇。例如,verbose = 0 不打印任何內(nèi)容

2.verbose = 1 打印進(jìn)度條和每個(gè) epoch 一行,verbose = 2 每個(gè) epoch 打印一行。

用 20 個(gè) Epoch 運(yùn)行模型后,我們得到了 97.36% 的訓(xùn)練準(zhǔn)確率。

score % evaluate(x_train, train_labels)

cat('Train loss:', score$loss, "n")

cat('Train accuracy:', score$acc, "n")

我們可以使用以下命令繪制精度損失圖以及 Epoch :

plot(history)

現(xiàn)在我們將看到模型在測試數(shù)據(jù)集上的表現(xiàn):

score % evaluate(x_test, test_labels)

cat('Test loss:', score$loss, "n")

cat('Test accuracy:', score$acc, "n")

我們?cè)跍y試數(shù)據(jù)集上獲得了 91.6% 的準(zhǔn)確率。我們可以利用訓(xùn)練好的模型對(duì)一些測試圖像進(jìn)行預(yù)測。

predictions % predict(x_test)

我們從模型中得到預(yù)測,即測試集中每個(gè)圖像的標(biāo)簽。我們來看第一個(gè)預(yù)測:

predictions[1, ]

預(yù)測是一組十個(gè)數(shù)字。這些表達(dá)了模特的“信心”。

作為替代方案,我們還可以使用以下命令直接打印類預(yù)測:

class_pred % predict_classes(x_test)

class_pred[1:20]

現(xiàn)在我們將繪制一些帶有他們預(yù)測的圖像。正確的預(yù)測是藍(lán)色的,而錯(cuò)誤的預(yù)測是紅色的。

options(repr.plot.width=7, repr.plot.height=7)

par(mfcol=c(5,5))

par(mar=c(0, 0, 1.5, 0), xaxs='i', yaxs='i')

for (i in 1:25) {

img <- test_images[i, , ]

img <- t(apply(img, 2, rev))

predicted_label <- which.max(predictions[i, ]) - 1

true_label <- test_labels[i]

if (predicted_label == true_label) { color <- 'blue' }

else

{ color <- 'red' }

image(1:28, 1:28, img, col = gray((0:255)/255), xaxt = 'n', yaxt = 'n',

main = paste0(class_names[predicted_label + 1],

"(",class_names[true_label + 1], ")"),col.main = color)}

這就是在 R 中使用 Keras 進(jìn)行圖像分類的方法!

結(jié)論

在本文中,我們學(xué)習(xí)了如何在 R 中使用 Keras 構(gòu)建深度學(xué)習(xí)圖像分類器。該模型在測試數(shù)據(jù)上具有很高的準(zhǔn)確性。但是,必須記住,準(zhǔn)確度可能會(huì)根據(jù)訓(xùn)練集而改變。因此,該模型不適用于與訓(xùn)練圖像不同的圖像。

以下是本文的一些主要內(nèi)容:

Tensorflow 和 Keras 都有官方的 R 支持。就像 Python 一樣,在 R 中設(shè)置和訓(xùn)練模型很容易。本文中的方法可以應(yīng)用于另一個(gè)圖像數(shù)據(jù)集進(jìn)行分類,或者可以將訓(xùn)練好的模型保存并部署為應(yīng)用程序。

image.png

       原文標(biāo)題 : 在 R 中使用 Keras 構(gòu)建深度學(xué)習(xí)圖像分類器

聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場。如有侵權(quán)或其他問題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

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

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