人工智慧實務工作坊-手把手教你深度學習實務

R語言基礎介紹

林嶔 (Lin, Chin)

課程簡介

– 我們今天的課程如下:

  1. R語言基礎介紹 (上午9:00 –中午12:00)

建立R語言開發環境、介紹物件類別、熟悉迴圈功能、基本資料整理等

  1. 深度學習基礎知識 (下午13:00 –下午14:00)

了解預測函數、損失函數、實際使用MxNet建構線性迴歸

  1. 神經網路介紹 (下午14:00 –下午15:30)

利用IRIS建構MLP、利用MNIST建構CNN、實際建構研究流程

  1. 真實世界的卷積神經網路開發 (下午15:30 –下午17:00)

利用經典網路做圖像辨識、自己訓練一個貓狗圖像分類器

開始的第一步:安裝R語言

F1_1

第一節:與電腦交談(1)

– 因此,使用R的第一步,請先將他當作一個高級的計算機。

– 請試著在左邊的Console視窗中,輸入下列程式碼,並體會他的計算功能

# 四則運算
123 + 489
145 * 12

# 括弧優先規則
(1 + 2) * 3

# 指數運算
12^4

第一節:與電腦交談(2)

– 『函數』的使用方式是打下特定的字句,並且在『小括號』內輸入參數作為「input」,接著電腦將會根據你的指令進行回答。

  1. 函數「exp()」:負責進行自然指數運算

  2. 函數「sqrt()」:負責進行平方根運算

  3. 函數「log()」:負責(自然)對數運算

exp(2)
sqrt(10)
log(3)

– 有趣的是,『函數』中的『input』不見得只能有1個,如函數「log()」可以額外輸入對數的底數,並以『,』進行分隔:

log(3, base = 3)
log(4, base = 2)

– 需要注意的是,如果我們不告訴電腦哪個是底數,哪個是運算目標,哪個是底數,那他將會依序認為你輸入的第一個數為需要被運算的數,而第二個數為底數:

log(9, 3)
log(8, 2)

第一節:與電腦交談(3)

– 註:物件的屬性有很多種,我們第二節才會對他進行詳細的介紹

– 注意,等號的右邊為「input」,等號的左邊為「output」

x = 2 * 2 * 3
print(x)

– 如果你只是需要查看物件內容,事實上直接輸入物件名稱也可以達到相同效果

x

– 物件強大的地方在於,我們可以將其做為暫存的工具,並且可以直接對「x」物件進行運算

x/4

第一節:與電腦交談(4)

– 函數「c()」中間以逗點為界,此函數可以將不同「數字」合併在同一個物件內

x = c(1, 2, 3, 4, 5)
x
x^3
x = c(1, 2, 3, 4, 5)
y = c(6, 7, 9, 8, 10)
y - x
x * y

第二節:熟悉R裡面的基本物件(1)

  1. 變數(Variable)層:邏輯(logical)向量、整數(integer)向量、因子(factor)向量、數字(numeric)向量、文字(character)向量

  2. 陣列(Array)層:矩陣(matrix)、資料表(data.frame)

  3. 列表(List)層:列表(list)、S3物件(S3 class)、S4物件(S4 class)

第二節:熟悉R裡面的基本物件(2)

  1. 函數「length()」可以查詢該向量的長度
x = c(1, 2, 3, 4, 5)
length(x)
  1. 函數「array()」可以產生一個陣列
x = 1:24
A = array(x, dim = c(3, 2, 4))
A
  1. 函數「dim()」可以查看該陣列的維度數
dim(A)
length(A)
  1. 函數「list()」可以產生一個列表
L = list(x, A)
L

第二節:熟悉R裡面的基本物件(3)

– 這是變數(Variable)層物件的索引方式

x[3]
x[c(3, 5)]

– 這是陣列(Array)層物件的索引方式

A[3,1,2]
A[3,,]

– 這是列表(List)層物件的索引方式

L[[1]]

– 你也可以交叉使用這些索引函數

L[[2]][3,,]

第二節:熟悉R裡面的基本物件(4)

y = c(6, 7, 9, 8, 10)
y[7] = 3 * 5
y
y[3] = -1
y
y[3] = y[1] + y[2]
y[6] = y[4] * y[5]
y

第二節:熟悉R裡面的基本物件(5)

y = c(1, 1)
y[3] = y[1] + y[2]
y[4] = y[2] + y[3]
y[5] = y[3] + y[4]
y[6] = y[4] + y[5]
y[7] = y[5] + y[6]
y

第三節:迴圈與自訂函數(1)

– 在這裡我們需要兩個物件:物件「x」為儲存費波納奇數列的物件,而物件「indexes」代表著隨迴圈變化的物件

x = c(1, 1)

for (i in 1:20) {
  x[i+2] = x[i] + x[i+1]
}

x
##  [1]     1     1     2     3     5     8    13    21    34    55    89
## [12]   144   233   377   610   987  1597  2584  4181  6765 10946 17711

第三節:迴圈與自訂函數(2)

i = 1
x[i+2] = x[i] + x[i+1]
i = 2
x[i+2] = x[i] + x[i+1]
i = 20
x[i+2] = x[i] + x[i+1]

第三節:迴圈與自訂函數(3)

– 函數「paste」的功能是將文字前後連接起來,接著我們能再用「print」輸出在Console視窗中

students = c("小華", "小明", "小王")
scores = c(100, 80, 70)

for (i in 1:3) {
  print(paste(students[i], "的考試成績為", scores[i], "分", sep = ""))
}
## [1] "小華的考試成績為100分"
## [1] "小明的考試成績為80分"
## [1] "小王的考試成績為70分"

第三節:迴圈與自訂函數(4)

a = 2
b = 4
step = 20

x = c(a, b)

for (i in 1:step) {
  x[i+2] = x[i] + x[i+1]
}

x
##  [1]     2     4     6    10    16    26    42    68   110   178   288
## [12]   466   754  1220  1974  3194  5168  8362 13530 21892 35422 57314

第三節:迴圈與自訂函數(5)

Fibonacci = function (a, b, step) {
  
  x = c(a, b)
  
  for (i in 1:step) {
    x[i+2] = x[i] + x[i+1]
  }
  
  x
  
}
Fibonacci(2, 4, 20)
##  [1]     2     4     6    10    16    26    42    68   110   178   288
## [12]   466   754  1220  1974  3194  5168  8362 13530 21892 35422 57314

第四節:套件使用與讀寫檔案(1)

F4_1

– 其數據集包含了150個樣本,都屬於鳶尾屬下的三個亞屬,分別是山鳶尾(setosa)、變色鳶尾(versicolor)和維吉尼亞鳶尾(virginica)。四個特徵被用作樣本的定量分析,它們分別是花萼(sepal)和花瓣(petal)的長度和寬度。

第四節:套件使用與讀寫檔案(2)

iris = read.csv('data/iris.csv')
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

第四節:套件使用與讀寫檔案(3)

x = iris[,1]
y = iris[,2]
plot(x, y, xlab = 'Sepal Length', ylab = 'Sepal Width')

model = lm(y~x)
print(model)
## 
## Call:
## lm(formula = y ~ x)
## 
## Coefficients:
## (Intercept)            x  
##     3.41895     -0.06188

第四節:套件使用與讀寫檔案(4)

– 請在這裡下載MNIST的手寫數字資料,並讓我們了解一下這筆資料的結構

– 在這裡我們需要學習如何安裝「套件」,安裝後使用方法如下(你可不可以使用「read.csv」讀取?當然可以,但你可以測試看看速度):

library(data.table)

mnist = fread("data/MNIST.csv", data.table = FALSE)
mnist = data.matrix(mnist)
X = mnist[,-1]
X = t(X)
dim(X) = c(28, 28, 1, dim(mnist)[1])

Y = mnist[,1]

第四節:套件使用與讀寫檔案(5)

library(OpenImageR)

imageShow(X[,,,25])

Y[25]
## [1] 2

第四節:套件使用與讀寫檔案(6)

a = array(1:4, dim = c(2, 2))

a
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
t(a)
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
for (i in 1:dim(X)[4]) {
  X[,,,i] = t(X[,,,i] )
}

第四節:套件使用與讀寫檔案(7)

imageShow(X[,,,25])

第五節:讀取圖像(1)

– 讓我們到這裡下載其中的100張貓以及100張狗,最後再用這個分類器預測裡面貓狗各5張測試圖片。

– 讓我們試著把檔案讀進來,並學會畫圖:

library(OpenImageR)

img <- readImage('Dogs vs. Cats/cat.1.jpg')
imageShow(img)