Ubuntu で Swift for TensorFlow を利用するには下記のものが必要になります。
♦Clang
♦Swift
♦Swift for TensorFlow
以下がインストール手順です。
〈Clangのインストール〉
$ sudo apt update $ sudo apt install clang -y
〈Swiftのインストール〉
$ wget https://swift.org/builds/swift-5.3.2-release/ubuntu2004/swift-5.3.2-RELEASE/swift-5.3.2-RELEASE-ubuntu20.04.tar.gz $ tar fvxz swift-5.3.2-RELEASE-ubuntu20.04.tar.gz $ sudo mv swift-5.3.2-RELEASE-ubuntu20.04 /usr/local/swift $ export PATH=/usr/local/swift/usr/bin:$PATH
注)Swift の最新バージョンは https://swift.org/download/ で確認してください。
〈Swift for TensorFlowのインストール〉
$ wget https://storage.googleapis.com/swift-tensorflow-artifacts/releases/v0.12/rc2/swift-tensorflow-RELEASE-0.12-ubuntu20.04.tar.gz $ tar fvxz swift-tensorflow-RELEASE-0.12-ubuntu20.04.tar.gz $ sudo mv swift-tensorflow-RELEASE-0.12-ubuntu20.04 /usr/local/swift-tensorflow $ export PATH=/usr/local/swift-tensorflow/usr/bin:$PATH
注)Swift for TensorFlow の最新バージョンは https://github.com/tensorflow/swift/blob/main/Installation.md で確認してください。
〈コンパイルと実行〉
$ swiftc -O tensorflow.swift -o tensorflow $ ./tensorflow
tensorflow.swift
import TensorFlow
let t1 = Tensor<Float>([[1, 2]])
let t2 = Tensor<Float>([[1, 2, 3], [4, 5, 6]])
let t3 = Tensor<Float>(ones:[2, 3])
let t4 = Tensor<Float>(zeros:[2, 3])
let t5 = Tensor<Float>(randomNormal:[2, 3])
let t6 = Tensor<Float>(randomUniform:[2, 3])
print(t2 + t3)
print(matmul(t1, t2))
〈実行結果〉
[[2.0, 3.0, 4.0], [5.0, 6.0, 7.0]] [[9.0, 12.0, 15.0]]
〈3層ニューラルネットワーク〉
units1:第1層(入力層)のユニット数
units2:第2層(隠れ層)のユニット数
units3:第3層(出力層)のユニット数
epochs:エポック数
tensorflow.swift
import TensorFlow
struct NeuralNetwork:Layer {
var w1:Tensor<Float>
var b1:Tensor<Float>
var w2:Tensor<Float>
var b2:Tensor<Float>
init(units1:Int, units2:Int, units3:Int) {
w1 = Tensor<Float>(randomUniform:[units1, units2])
b1 = Tensor<Float>(randomUniform:[units2])
w2 = Tensor<Float>(randomUniform:[units2, units3])
b2 = Tensor<Float>(randomUniform:[units3])
}
func callAsFunction(_ x:Tensor<Float>) -> Tensor<Float> {
return matmul(tanh(matmul(x, w1) + b1), w2) + b2
}
}
func loss(_ model:NeuralNetwork, _ x:Tensor<Float>, _ y:Tensor<Float>) -> Tensor<Float> {
return meanSquaredError(predicted:model(x), expected:y)
}
func train(model:inout NeuralNetwork, x:inout Tensor<Float>, y:inout Tensor<Float>, epochs:Int) {
let optimizer = Adam(for:model, learningRate:0.001)
for epoch in 1...epochs {
let gradients = gradient(at:model) { model -> Tensor<Float> in
let loss = loss(model, x, y)
if epoch % 1000 == 0 { print("\(epoch) epoch: loss = \(loss)") }
return loss
}
optimizer.update(&model, along:gradients)
}
}
var neuralNetwork = NeuralNetwork(units1:2, units2:7, units3:1)
var x_train:Tensor<Float> = [[1.0, 1.0], [1.0, 2.0], [1.0, 3.0], [2.0, 1.0], [2.0, 2.0], [2.0, 3.0], [3.0, 1.0], [3.0, 2.0], [3.0, 3.0]]
var y_train:Tensor<Float> = [[1.0], [2.0], [3.0], [2.0], [4.0], [6.0], [3.0], [6.0], [9.0]]
let start = clock()
train(model:&neuralNetwork, x:&x_train, y:&y_train, epochs:10000)
let stop = clock()
print("\(String(format:"%.3f", 0.000001 * Double(stop - start)))sec")
参考記事
- Swift for TensorFlow
- Install Swift for TensorFlow
- Swift for TensorFlow Tutorial:Model Training Walkthrough(CSVを読み込んでTensorにセット)