TensorFlow.org पर देखें | GitHub पर स्रोत देखें |
TensorFlow पर निर्माण, TensorFlow के लिए स्विफ्ट एपीआई डिजाइन के लिए एक नया दृष्टिकोण लेता है। एपीआई को स्थापित पुस्तकालयों से सावधानीपूर्वक तैयार किया जाता है और नए भाषा मुहावरों के साथ जोड़ा जाता है। इसका मतलब यह है कि सभी TensorFlow API सीधे स्विफ्ट API के रूप में उपलब्ध नहीं होंगे, और हमारे API क्यूरेशन को विकसित करने के लिए समय और समर्पित प्रयास की आवश्यकता है। हालाँकि, यदि आपका पसंदीदा TensorFlow ऑपरेटर स्विफ्ट में उपलब्ध नहीं है, तो चिंता न करें - TensorFlow स्विफ्ट लाइब्रेरी आपको _Raw
नेमस्पेस के तहत अधिकांश TensorFlow ऑपरेटरों तक पारदर्शी पहुंच प्रदान करती है।
आरंभ करने के लिए TensorFlow
आयात करें।
import TensorFlow
कच्चे ऑपरेटरों को कॉल करना
कोड पूर्णता के माध्यम से _Raw
नेमस्पेस के अंतर्गत आपको जिस फ़ंक्शन की आवश्यकता है उसे ढूंढें।
print(_Raw.mul(Tensor([2.0, 3.0]), Tensor([5.0, 6.0])))
[10.0, 18.0]
एक नए मल्टीप्ल ऑपरेटर को परिभाषित करना
मल्टीप्लाई पहले से ही Tensor
पर ऑपरेटर *
के रूप में उपलब्ध है, लेकिन आइए मान लें कि हम इसे .*
के रूप में एक नए नाम के तहत उपलब्ध कराना चाहते थे। स्विफ्ट आपको extension
घोषणाओं का उपयोग करके मौजूदा प्रकारों में विधियों या गणना की गई संपत्तियों को पूर्वव्यापी रूप से जोड़ने की अनुमति देता है।
अब, आइए एक एक्सटेंशन घोषित करके Tensor
में .*
जोड़ें और इसे तब उपलब्ध कराएं जब टेंसर का Scalar
प्रकार Numeric
के अनुरूप हो।
infix operator .* : MultiplicationPrecedence
extension Tensor where Scalar: Numeric {
static func .* (_ lhs: Tensor, _ rhs: Tensor) -> Tensor {
return _Raw.mul(lhs, rhs)
}
}
let x: Tensor<Double> = [[1.0, 2.0], [3.0, 4.0]]
let y: Tensor<Double> = [[8.0, 7.0], [6.0, 5.0]]
print(x .* y)
[[ 8.0, 14.0], [18.0, 20.0]]
लपेटे गए फ़ंक्शन के व्युत्पन्न को परिभाषित करना
न केवल आप कच्चे टेन्सरफ्लो ऑपरेटर के लिए स्विफ्ट एपीआई को आसानी से परिभाषित कर सकते हैं, बल्कि आप इसे स्विफ्ट के प्रथम श्रेणी स्वचालित भेदभाव के साथ काम करने के लिए अलग-अलग भी बना सकते हैं।
.*
को भिन्न बनाने के लिए, व्युत्पन्न फ़ंक्शन पर @derivative
विशेषता का उपयोग करें और मूल फ़ंक्शन को of:
लेबल के तहत एक विशेषता तर्क के रूप में निर्दिष्ट करें। चूंकि .*
ऑपरेटर को तब परिभाषित किया जाता है जब सामान्य प्रकार Scalar
Numeric
के अनुरूप होता है, यह Tensor<Scalar>
Differentiable
प्रोटोकॉल के अनुरूप बनाने के लिए पर्याप्त नहीं है। प्रकार की सुरक्षा के साथ जन्मी, स्विफ्ट हमें Scalar
TensorFlowFloatingPoint
प्रोटोकॉल के अनुरूप बनाने के लिए @differentiable
विशेषता पर एक सामान्य बाधा जोड़ने की याद दिलाएगी, जो Tensor<Scalar>
को Differentiable
के अनुरूप बनाएगी।
@differentiable(where Scalar: TensorFlowFloatingPoint)
infix operator .* : MultiplicationPrecedence
extension Tensor where Scalar: Numeric {
@differentiable(where Scalar: TensorFlowFloatingPoint)
static func .* (_ lhs: Tensor, _ rhs: Tensor) -> Tensor {
return _Raw.mul(lhs, rhs)
}
}
extension Tensor where Scalar : TensorFlowFloatingPoint {
@derivative(of: .*)
static func multiplyDerivative(
_ lhs: Tensor, _ rhs: Tensor
) -> (value: Tensor, pullback: (Tensor) -> (Tensor, Tensor)) {
return (lhs * rhs, { v in
((rhs * v).unbroadcasted(to: lhs.shape),
(lhs * v).unbroadcasted(to: rhs.shape))
})
}
}
// Now, we can take the derivative of a function that calls `.*` that we just defined.
print(gradient(at: x, y) { x, y in
(x .* y).sum()
})
(0.0, 0.0)
और ज्यादा उदाहरण
let matrix = Tensor<Float>([[1, 2], [3, 4]])
print(_Raw.matMul(matrix, matrix, transposeA: true, transposeB: true))
print(_Raw.matMul(matrix, matrix, transposeA: true, transposeB: false))
print(_Raw.matMul(matrix, matrix, transposeA: false, transposeB: true))
print(_Raw.matMul(matrix, matrix, transposeA: false, transposeB: false))
[[ 7.0, 15.0], [10.0, 22.0]] [[10.0, 14.0], [14.0, 20.0]] [[ 5.0, 11.0], [11.0, 25.0]] [[ 7.0, 10.0], [15.0, 22.0]]