কাঁচা TensorFlow অপারেটর

TensorFlow.org এ দেখুন 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]]