零基礎使用Swift學習數據科學

概述

  • Swift正迅速成為數據科學中最強大、最有效的語言之一
  • Swift與Python非常相似,所以你會發現2種語言的轉換非常平滑
  • 我們將介紹Swift的基礎知識,並學習如何使用該語言構建你的第一個數據科學模型

介紹

Python被廣泛認為是數據科學中最好、最有效的語言。近年來我遇到的大多數調查都將Python列為這個領域的領導者。

但事實是數據科學是一個廣闊並且不斷髮展的領域。我們用來構建數據科學模型的語言也會隨之發展。還記得R是什麼時候的流行語言嗎?它很快就被Python超越了。Julia語言去年也出現在數據科學中。目前現在有另一種語言正在蓬勃發展。

是的,我說的是Swift語言。

零基礎使用Swift學習數據科學

"我總是希望當我開始學習一門新語言的時候,會有一些開闊思維的新想法,這點Swift絕對不會讓我失望。Swift易於解釋,並且靈活,簡潔,安全,易於使用,快速。大多數其他語言在這些方面都有很大的限制。"——Jeremy Howard

當Jeremy Howard認可一種語言並開始在日常的數據科學工作中使用該語言時,你有必要開始思考這個語言的優點了。

在本文中,我們將瞭解Swift作為一種編程語言,以及它如何適應數據科學領域。如果你是Python用戶,你將注意到兩者之間的細微差別和驚人的相似之處。這裡也有很多代碼,讓我們開始吧!

目錄

  1. 為什麼選擇Swift?
  2. 數據分析的Swift基礎
  3. 在Swift中使用Python庫
  4. Swift中使用TensorFlow建立基本模型
  5. 數據科學Swift的未來

1.為什麼選擇Swift?

PyTorch是為了克服Tensorflow中的限制。但現在我們正接近Python的極限,而Swift有可能填補這一空白。"——Jeremy Howard

最近,Swift作為一種數據科學語言引起了很多人的興奮和關注。每個人都在談論它。以下是你應該學習Swift的幾個理由:

  • Swift快,很接近C的速度了
  • 同時,它有一個非常簡單和可讀的語法,非常類似Python:
零基礎使用Swift學習數據科學

  • 與Python相比,Swift是一種更高效、更穩定、更安全的編程語言
  • 這也是一種很好的移動語言。事實上,它是為iPhone開發iOS應用程序的官方語言
  • 它對自動微分有強大的集成支持,這使它成為為數不多的用於數值計算的高級語言之一
  • 它背後有谷歌、Apple、FastAI等的支持!

以下是Jeremy Howard對Swift的評價視頻:https://youtu.be/drSpCwDFwnM

2.數據分析的Swift基礎

在我們開始使用Swift執行數據科學的細節之前,讓我們簡要介紹一下Swift編程語言的基礎知識。

2.1 Swift的生態系統

當前數據科學的Swift主要由兩個生態系統組成:

  1. 開源生態系統
  2. 蘋果的生態系統
零基礎使用Swift學習數據科學

開源生態系統是我們可以下載並在任何操作系統或機器上運行Swift的地方。我們可以使用非常酷的Swift庫來構建機器學習應用程序,比如用於TensorFlow的Swift、SwiftAI和SwiftPlot。

Swift還允許我們無縫地從Python中導入成熟的數據科學庫,如NumPy、panda、matplotlib和scikit-learn。

另一方面,蘋果的生態系統本身就令人印象深刻。有一些有用的庫,比如CoreML,可以讓我們用Python來訓練大型模型,並直接將它們導入到Swift中進行推理。此外,它還提供了大量的預先訓練過的先進模型,我們可以直接使用它們來構建iOS/macOS應用程序。

零基礎使用Swift學習數據科學

還有其他有趣的庫,比如swift ,coreml,transformer,可以讓我們在iPhone上運行最先進的文本生成模型,比如GPT-2、BERT等。

零基礎使用Swift學習數據科學

當你需要為Apple設備構建基於機器學習的應用程序時,還有許多其他的庫可以提供良好的功能。

這兩個生態系統之間存在多種差異。但最重要的是,為了使用蘋果的生態系統,你需要有一臺蘋果的機器,你只能為蘋果的設備開發,如iOS, macOS等。

既然你已經有了Swift作為數據科學語言的概述,讓我們進入代碼吧!

2.2 為Swift設置環境

Swift可用於谷歌Colab與GPU和TPU版本。我們將使用它,以便你可以快速跟上它的速度,而不必在安裝過程中花費太多時間。

零基礎使用Swift學習數據科學

你可以按照下面的步驟打開一個Colab筆記本,這是快速激活的:

  1. 打開一個空白的Swift筆記本(https://colab.research.google.com/github/tensorflow/swift/blob/master/notebooks/blank_swift.ipynb)
  2. 點擊"File",然後選擇"Save a copy in Drive"-這將保存一個新的Swift筆記本在你自己的谷歌驅動器上!
零基礎使用Swift學習數據科學

  1. 已經準備好開始寫Swift代碼了,一下是第一行:

如果你想在你自己的系統上使用Swift,那麼這裡有一些你可以打開的鏈接:

  • 如果你想在本地系統上安裝Swift,你可以按照安裝說明操作:https://swift.org/getting-started/#using-the-repl
  • 在Ubuntu上安裝Jupyter筆記本,請參考Jeremy Howard安裝Swift的說明:https://forums.fast.ai/t/jeremys-harebrained-install-guide/43814
  • 在Ubuntu上,你也可以用Docker安裝Swift:https://github.com/apple/swift-docker

現在,讓我們快速介紹一下一些基本的Swift函數,然後再進入使用它的數據科學功能。

2.3 打印功能

我相信你用過這個。它的工作方式與Python中非常相似。只需調用print(),在括號內輸入你想打印的內容:

2.4 Swift的變量

Swift提供了兩個有用的選項來創建變量:letvar. let用來創建一個"常量",這個常量的值在程序的任何地方都不能改變。var與我們在Python中看到的變量非常相似——你可以在程序的任何時候更改存儲在其中的值。

讓我們看一個例子來看看區別。創建兩個變量a和b:

現在,嘗試改變a和b的值:

你會注意到,b能夠不報錯的更新其值,而a則給出一個錯誤:

零基礎使用Swift學習數據科學

這種創建常量與變量的能力非常有用,可以幫助我們防止代碼中出現看不見的bug。你將在本文中進一步看到,我們將使用let來創建存儲重要信息並且不需要變更值的常量,

這裡有一個技巧:使用var來創建你想使用一些中間計算的結果,因為這些中間計算結果需要改變。類似地,使用let來存儲訓練數據或者結果,這些數據基本上就是你不想更改或弄亂的值。

此外,Swift還有一個很酷的功能,你甚至可以使用表情符號作為變量名!

零基礎使用Swift學習數據科學

這是因為Swift非常支持Unicode,所以我們可以用希臘字母來創建變量:

2.5 Swift的數據類型

Swift支持所有常見的數據類型,如整數、字符串、浮點數和雙精度。我們可以賦值給任何變量,其類型會被Swift自動檢測到:

你還可以在創建變量時顯式地編寫數據類型。這有助於防止程序中的錯誤,因為如果類型不匹配。Swift將拋出一個錯誤:

可以做個小測驗。創建一個顯式類型為"Float"的值為4的常量,結果是會報錯的。

有一種簡單的方法可以將變量的值包含在字符串中,方法是將變量放在括號中,並在括號前寫入反斜槓()。例如:

零基礎使用Swift學習數據科學

可以對佔用多行的字符串使用三個雙引號(""")。

2.6 列表和字典

Swift支持列表和字典數據結構,就像Python一樣(這又是一個比較!)這裡與Python不同,我們不需要像字典的"{}"和列表的"[]"這樣的單獨語法。

讓我們用Swift創建一個列表和字典:

我們可以通過在"[]"括號內寫入索引或者鍵來訪問列表或字典的元素(類似於Python):

上面的代碼將把"Jayne"和"Public Relations"的鍵值對添加到字典中。如果你打印以上的字典以下就是輸出:

零基礎使用Swift學習數據科學

2.7 使用循環

循環是任何編程語言最重要的特性之一,Swift不會讓你失望。它不僅支持所有傳統的循環機制(for、while等),而且還實現了它自己的一些變體。

for..in 循環

非常類似於Python,你可以使用在Swift中的list或者range使用for循環:

零基礎使用Swift學習數據科學

第一個例子中的三個點表示Swift中的"range"。如果我們想做a到b範圍內的事情,我們會使用a…b的語法。

類似地,如果我們想不要最後一個數字,我們可以把這三個點改成"..a.."。

這裡需要注意的另一點是,與Python不同,Swift不使用縮進的概念,而是使用花括號"{}"來表示代碼層次結構。

你可以在Swift中以類似的方式使用while和其他類型的循環。你可以這裡瞭解更多關於循環的信息:https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html。

2.8 條件(if-else)

Swift支持條件語句,如if, if..else, if..else..if, 嵌套if甚至switch語句(Python不支持)。if語句的語法非常簡單:

boolean_expression可以是任何比較,只有在比較結果或表達式的計算結果為true時,才會執行if塊中編寫的語句。你可以在這裡閱讀其他條件語句:https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html。

2.9 函數

Swift函數在語法上與Python中的函數非常相似。這裡的主要區別是我們使用了func關鍵字而不是def,並且我們明確地提到了參數的數據類型和函數的返回類型。

一個基本的函數如下:

零基礎使用Swift學習數據科學

和條件語句一樣,我們使用花括號"{}"來表示屬於這個函數的代碼塊。

2.10 用代碼編寫註釋

編寫註釋是優秀代碼最重要的方面之一。這適用於任何行業。這是你應該學習的最重要的編程技巧!

在你的代碼裡包含註釋文本,作為對自己的註釋或提醒。註釋在編譯時會被Swift忽略。

單行註釋以兩個斜槓(//)開頭:

多行註釋以一個前斜槓和一個星號(/*)開始,以一個星號和一個前斜槓(*/)結束:

現在你已經熟悉了Swift的基礎知識,讓我們來學習一個有趣的功能——在Swift中使用Python庫!

3.在Swift中使用Python庫

Swift支持與Python的互操作性。這意味著你可以從Swift導入有用的Python庫,調用它們的函數,並在Swift和Python之間無縫地切換。

這給了Swift的數據科學生態系統不可思議的力量。這個生態系統還很年輕,還在發展中,你已經可以使用成熟的庫,如Numpy、panda和Python的Matplotlib來填補現有Swift產品的空白。

為了在Swift中使用Python的模塊,你可以直接導入Python並加載任何你想要使用的庫!

這與你在Python中使用NumPy的方式非常相似,不是嗎?你可以對其他包做同樣的事情,如matplotlib:

零基礎使用Swift學習數據科學

你已經學了不少關於Swift的東西。現在是時候構建你的第一個模型了!

4.使用TensorFlow建立Swift的基本模型

零基礎使用Swift學習數據科學

Swift4Tensorflow是Swift開源生態系統中最成熟的庫之一。我們可以使用一個非常簡單的keras類語法很容易的建立機器學習和深度學習模型。

它變得更加有趣!Swift4Tensorflow不僅僅是對TensorFlow的快速包裝,它還被開發為該語言本身的一個特性。人們普遍認為,在不久的將來,它將成為該語言的核心部分。

這意味著來自蘋果公司的Swift團隊和谷歌的Tensorflow團隊的工程師將確保你能夠在Swift中進行高性能的機器學習。

該庫還向Swift添加了許多有用的特性,比如對自動微分的原生支持(這讓我想起了PyTorch中的Autograd),從而使它與數值計算更加兼容。

零基礎使用Swift學習數據科學

4.1 關於數據集

讓我們來理解一下我們將在本節中使用的問題陳述。如果你以前接觸過深度學習領域,你可能對它很熟悉。

我們將構建一個卷積神經網絡(CNN)模型,使用MNIST數據集將圖像分類為數字。該數據集包含6萬張訓練圖像和1萬張手寫數字測試圖像,可用於訓練圖像分類模型:

零基礎使用Swift學習數據科學

這個數據集是處理計算機視覺問題的一個相當常見的數據集,所以我不打算詳細描述它。

4.2 開始項目

在開始構建模型之前,我們需要下載數據集並對其進行預處理。為了方便你,我已經創建了一個GitHub存儲庫,裡面預處理了代碼和數據

下載安裝代碼,下載數據集,導入必要的庫:

你的數據集現在將在Colab上下載。讓我們加載數據集:

4.3 加載數據集

4.4 探索MNIST

我們將從數據集繪製一些圖像,以瞭解我們的工作是什麼:

這是我們的圖像是這樣的:

零基礎使用Swift學習數據科學

看起來很直觀,對吧?第一個數字是手寫的0,第二個數字是4。

4.5 定義模型的結構

現在讓我們定義模型的體系結構。我使用的是LeNet-5架構,這是一個非常基礎的CNN模型,使用了2個卷積層,平均池化層和3個全連接層。

最後一個全連接層的形狀是10,因為我們有10個目標類,每個數字一個從0到9:

你可能已經注意到,這些代碼看起來非常類似於Keras、PyTorch或TensorFlow等Python框架中。

編寫代碼的簡單性是Swift最大的賣點之一。

Swift4Tensorflow你可以在這裡閱讀更多關於它的信息:https://www.tensorflow.org/swift/api_docs/Structs

4.6 選擇梯度下降作為優化器

類似地,我們需要一個優化器函數來訓練我們的模型。我們將使用Swift4Tensorflow中提供的隨機梯度下降(SGD):

Swift4Tensorflow支持許多額外的優化器。你可以根據你的項目選擇:

  • AMSGrad
  • AdaDelta
  • AdaGrad
  • AdaMax
  • Adam
  • Parameter
  • RMSProp
  • SGD

4.7 模型訓練

現在一切都設置好了,讓我們來訓練模型!

上面的代碼運行一個訓練循環,該循環將數據集示例提供給模型,以幫助它做出更好的預測。以下是我們的訓練步驟:

  1. 我們迭代每個epoch。epoch是遍歷整個數據集的次數。
  2. 在epoch中,我們遍歷訓練數據集中的每個樣本,獲取其特徵(x)和標籤(y),這對於下一步非常重要。
  3. 利用例子的特徵,我們做了一個預測,並與真實標籤進行了比較。這是用來計算模型的損失和梯度。
  4. 這時使用梯度下降法來更新模型中的變量。
  5. 記錄一些訓練數據,以便以後能看到它們。
  6. 為每個epoch重複步驟1到5。

epochCount變量是遍歷數據集集合的次數。

你花了多少epoch才在測試集上達到90%以上的準確率?

我在12個epoch內,在訓練和測試集的準確率都達到了97%以上。

零基礎使用Swift學習數據科學

4.8 可視化訓練和測試數據

雖然打印出模型的訓練進度很有幫助,但是看到可視化圖像通常更有幫助。

讓我們將在模型訓練期間捕獲的訓練和測試統計數據可視化。

這是訓練和測試精度在訓練過程中的演變過程:

零基礎使用Swift學習數據科學

5.數據科學Swift的未來

行業專家們對Swift的反應是令人難以置信的,感覺它不僅有潛力成為數據科學的主流語言,而且它也是用於在現實世界構建基於機器學習的應用程序。

目前,它還處於起步階段,圍繞數據科學和數值計算的庫仍在發展中。然而,它背後有強大的行業支持,我期待著未來它將擁有一個豐富的工具和庫生態系統(甚至可能比現在的Python更好)。

這裡有幾個Swift的庫,你可以進一步探索:

  • Nifty (Demo):這是一個通用的Swift編程語言的數值計算庫。
    Github鏈接:https://github.com/nifty-swift/Nifty-demo
  • Swiftplot:用於數據可視化的Swift庫。
    Github鏈接:https://github.com/KarthikRIyer/swiftplot
  • Swift的TensorFlow:是下一代機器學習平臺。
    Github鏈接:https://github.com/tensorflow/swift

Swift AI:這是一個完全用Swift編寫的高性能深度學習庫。Github鏈接:https://github.com/Swift-AI/Swift-AI

本文中使用的所有代碼都可以在Github上找到:https://github.com/mohdsanadzakirizvi/swift-datascience


分享到:


相關文章: