AI/Machine Learning

[ML] ํ•ธ์ฆˆ์˜จ ๋จธ์‹ ๋Ÿฌ๋‹ - 10(ํ•˜์œ„ ํด๋ž˜์Šค API๋กœ ๋™์  ๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ)

์ดํƒœํ™ 2023. 1. 3. 02:58

๐Ÿ”Ž ํ•˜์œ„ํด๋ž˜์Šค(Subclassing) API๋กœ ๋™์  ๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ

๋ฐ˜๋ณต๋ฌธ์„ ํฌํ•จํ•˜๊ณ  ๋‹ค์–‘ํ•œ ํฌ๊ธฐ๋ฅผ ๋‹ค๋ฃจ์–ด์•ผ ํ•˜๋ฉฐ ์กฐ๊ฑด๋ฌธ์„ ๊ฐ€์ง€๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋™์ ์ธ ๊ตฌ์กฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋žจ์ด ์Šคํƒ€์ผ์ธ ์„œ๋ธŒํด๋ž˜์‹ฑ API๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๊ตฌ์„ฑ

Model ํด๋ž˜์Šค ์ƒ์†

  - ์ดˆ๊ธฐ ์„ค์ • ๋ฉ”์„œ๋“œ __init__()์„ ์ด์šฉํ•˜์—ฌ ์€๋‹‰์ธต๊ณผ ์ถœ๋ ฅ์ธต์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  - call()๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ธต์„ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

๋‹จ์ 

ํ•˜์ง€๋งŒ ๋ชจ๋ธ ๊ตฌ์กฐ๊ฐ€ call()๋ฉ”์„œ๋“œ ์•ˆ์— ์ˆจ๊ฒจ์ ธ ์žˆ์–ด์„œ ์ผ€๋ผ์Šค๊ฐ€ ๋ถ„์„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋ชจ๋ธ ์ €์žฅ ๋ฐ ๋ณต์‚ฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ summary() ๋ฉ”์„œ๋“œ ํ™œ์šฉ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

์ธต์˜ ๋ชฉ๋ก๋งŒ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ธต๊ฐ„์˜ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

์ผ€๋ผ์Šค๊ฐ€ ํƒ€์ž…๊ณผ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ํ™•์ธํ•  ์ˆ˜ ์—†๊ธฐ ๋–„๋ฌธ์— ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์˜ˆ์ œ์ฝ”๋“œ

# WideAndDeepModel ํด๋ž˜์Šค
class WideAndDeepModel(keras.models.Model):
    def __init__(self, units=30, activation="relu", **kwargs):
        super().__init__(**kwargs)
        self.hidden1 = keras.layers.Dense(units, activation=activation)
        self.hidden2 = keras.layers.Dense(units, activation=activation)
        self.main_output = keras.layers.Dense(1)
        self.aux_output = keras.layers.Dense(1)

    def call(self, inputs):
        input_A, input_B = inputs
        hidden1 = self.hidden1(input_B)
        hidden2 = self.hidden2(hidden1)
        concat = keras.layers.concatenate([input_A, hidden2])
        main_output = self.main_output(concat)
        aux_output = self.aux_output(hidden2)
        return main_output, aux_output

model = WideAndDeepModel(30, activation="relu")