TensorFlow.org এ দেখুন | Google Colab-এ চালান | GitHub-এ উৎস দেখুন |
TensorFlow-এর উপর বিল্ডিং, TensorFlow-এর জন্য Swift API ডিজাইনের জন্য একটি নতুন পদ্ধতি গ্রহণ করে। এপিআইগুলি প্রতিষ্ঠিত লাইব্রেরিগুলি থেকে সাবধানে কিউরেট করা হয় এবং নতুন ভাষার ইডিয়মগুলির সাথে মিলিত হয়৷ এর মানে হল যে সমস্ত TensorFlow APIগুলি সরাসরি Swift 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]]
একটি মোড়ানো ফাংশনের একটি ডেরিভেটিভ সংজ্ঞায়িত করা
আপনি শুধুমাত্র একটি কাঁচা টেনসরফ্লো অপারেটরের জন্য একটি সুইফ্ট API সহজেই সংজ্ঞায়িত করতে পারবেন না, আপনি সুইফটের প্রথম-শ্রেণীর স্বয়ংক্রিয় পার্থক্যের সাথে কাজ করার জন্য এটিকে আলাদা করতে পারেন।
.*
ডিফারেনশিয়াবল করতে, ডেরিভেটিভ ফাংশনে @derivative
অ্যাট্রিবিউট ব্যবহার করুন এবং of:
লেবেলের অধীনে অ্যাট্রিবিউট আর্গুমেন্ট হিসেবে মূল ফাংশনটি নির্দিষ্ট করুন। Scalar
.*
Numeric
Tensor<Scalar>
Differentiable
টাইপ সেফটি নিয়ে জন্ম নেওয়া, সুইফট আমাদেরকে @differentiable
অ্যাট্রিবিউটে একটি জেনেরিক সীমাবদ্ধতা যোগ করার কথা মনে করিয়ে দেবে যাতে Scalar
TensorFlowFloatingPoint
প্রোটোকলের সাথে সঙ্গতিপূর্ণ হতে হয়, যা 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]]