๋”ฅ๋Ÿฌ๋‹/Today I learned :

ํŒŒ์ดํ† ์น˜ ํŒจํ‚ค์ง€ ๊ธฐ๋ณธ ์กฐ์ž‘๋ฒ• ์ตํžˆ๊ธฐ 3 - python ํ–‰๋ ฌ, ํ…์„œ

์ฃผ์˜ ๐Ÿฑ 2022. 12. 26. 13:55
728x90

view - ์›์†Œ์˜ ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ํ…์„œ์˜ ํฌ๊ธฐ ๋ณ€๊ฒฝ

t = np.array([[[0, 1, 2],
               [3, 4, 5]],
              [[6, 7, 8],
               [9, 10, 11]]])
ft = torch.FloatTensor(t)

ft๋ผ๋Š” ์ด๋ฆ„์˜ 3์ฐจ์› ํ…์„œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํฌ๊ธฐ(shape)๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

print(ft.shape)
torch.Size([2, 2, 3])

4-1) 3์ฐจ์› ํ…์„œ์—์„œ 2์ฐจ์› ํ…์„œ๋กœ ๋ณ€๊ฒฝ

์ด์ œ ft ํ…์„œ๋ฅผ view๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๊ธฐ(shape)๋ฅผ 2์ฐจ์› ํ…์„œ๋กœ ๋ณ€๊ฒฝํ•ด๋ด…์‹œ๋‹ค.

print(ft.view([-1, 3])) # ft๋ผ๋Š” ํ…์„œ๋ฅผ (?, 3)์˜ ํฌ๊ธฐ๋กœ ๋ณ€๊ฒฝ
print(ft.view([-1, 3]).shape)
tensor([[ 0.,  1.,  2.],
        [ 3.,  4.,  5.],
        [ 6.,  7.,  8.],
        [ 9., 10., 11.]])
torch.Size([4, 3])

view([-1, 3])์ด ๊ฐ€์ง€๋Š” ์˜๋ฏธ๋Š” ์ด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. -1์€ ์ฒซ๋ฒˆ์งธ ์ฐจ์›์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์œผ๋‹ˆ ํŒŒ์ดํ† ์น˜์— ๋งก๊ธฐ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , 3์€ ๋‘๋ฒˆ์งธ ์ฐจ์›์˜ ๊ธธ์ด๋Š” 3์„ ๊ฐ€์ง€๋„๋ก ํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํ˜„์žฌ 3์ฐจ์› ํ…์„œ๋ฅผ 2์ฐจ์› ํ…์„œ๋กœ ๋ณ€๊ฒฝํ•˜๋˜ (?, 3)์˜ ํฌ๊ธฐ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ (4, 3)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ํ…์„œ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ํฌ๊ธฐ ๋ณ€ํ™˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. (2, 2, 3) -> (2 × 2, 3) -> (4, 3)

๊ทœ์น™์„ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค.

  • view๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝ ์ „๊ณผ ๋ณ€๊ฒฝ ํ›„์˜ ํ…์„œ ์•ˆ์˜ ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ† ์น˜์˜ view๋Š” ์‚ฌ์ด์ฆˆ๊ฐ€ -1๋กœ ์„ค์ •๋˜๋ฉด ๋‹ค๋ฅธ ์ฐจ์›์œผ๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฐ’์„ ์œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์ „ ํ…์„œ์˜ ์›์†Œ์˜ ์ˆ˜๋Š” (2 × 2 × 3) = 12๊ฐœ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ ํ›„ ํ…์„œ์˜ ์›์†Œ์˜ ๊ฐœ์ˆ˜ ๋˜ํ•œ (4 × 3) = 12๊ฐœ์˜€์Šต๋‹ˆ๋‹ค.๋‚ด๋ถ€์ ์œผ๋กœ ํฌ๊ธฐ ๋ณ€ํ™˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. (2, 2, 3) -> (2 × 2, 3) -> (4, 3)

๊ทœ์น™์„ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค.

  • view๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝ ์ „๊ณผ ๋ณ€๊ฒฝ ํ›„์˜ ํ…์„œ ์•ˆ์˜ ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ดํ† ์น˜์˜ view๋Š” ์‚ฌ์ด์ฆˆ๊ฐ€ -1๋กœ ์„ค์ •๋˜๋ฉด ๋‹ค๋ฅธ ์ฐจ์›์œผ๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฐ’์„ ์œ ์ถ”ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์ „ ํ…์„œ์˜ ์›์†Œ์˜ ์ˆ˜๋Š” (2 × 2 × 3) = 12๊ฐœ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ€๊ฒฝ ํ›„ ํ…์„œ์˜ ์›์†Œ์˜ ๊ฐœ์ˆ˜ ๋˜ํ•œ (4 × 3) = 12๊ฐœ์˜€์Šต๋‹ˆ๋‹ค.

 

4-2) 3์ฐจ์› ํ…์„œ์˜ ํฌ๊ธฐ ๋ณ€๊ฒฝ

์ด๋ฒˆ์—๋Š” 3์ฐจ์› ํ…์„œ์—์„œ 3์ฐจ์› ํ…์„œ๋กœ ์ฐจ์›์€ ์œ ์ง€ํ•˜๋˜, ํฌ๊ธฐ(shape)๋ฅผ ๋ฐ”๊พธ๋Š” ์ž‘์—…์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. view๋กœ ํ…์„œ์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ์›์†Œ์˜ ์ˆ˜๋Š” ์œ ์ง€๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•œ ๋ฐ” ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด (2 × 2 × 3) ํ…์„œ๋ฅผ (? × 1 × 3) ํ…์„œ๋กœ ๋ณ€๊ฒฝํ•˜๋ผ๊ณ  ํ•˜๋ฉด ?๋Š” ๋ช‡ ์ฐจ์›์ธ๊ฐ€์š”?

(2 × 2 × 3) = (? × 1 × 3) = 12๋ฅผ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ?๋Š” 4๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์‹ค์Šต์œผ๋กœ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

print(ft.view([-1, 1, 3]))
print(ft.view([-1, 1, 3]).shape)
tensor([[[ 0.,  1.,  2.]],

        [[ 3.,  4.,  5.]],

        [[ 6.,  7.,  8.]],

        [[ 9., 10., 11.]]])
torch.Size([4, 1, 3])

5) ์Šคํ€ด์ฆˆ(Squeeze) - 1์ธ ์ฐจ์›์„ ์ œ๊ฑฐํ•œ๋‹ค.

์Šคํ€ด์ฆˆ๋Š” ์ฐจ์›์ด 1์ธ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ์ฐจ์›์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
์‹ค์Šต์„ ์œ„ํ•ด ์ž„์˜๋กœ (3 × 1)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” 2์ฐจ์› ํ…์„œ๋ฅผ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

ft = torch.FloatTensor([[0], [1], [2]])
print(ft)
print(ft.shape)
tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])

ํ•ด๋‹น ํ…์„œ๋Š” (3 × 1)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ ์ฐจ์›์ด 1์ด๋ฏ€๋กœ squeeze๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด (3,)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ํ…์„œ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

print(ft.squeeze())
print(ft.squeeze().shape)
tensor([0., 1., 2.])
torch.Size([3])

์œ„์˜ ๊ฒฐ๊ณผ๋Š” 1์ด์—ˆ๋˜ ๋‘๋ฒˆ์งธ ์ฐจ์›์ด ์ œ๊ฑฐ๋˜๋ฉด์„œ (3,)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ํ…์„œ๋กœ ๋ณ€๊ฒฝ๋˜์–ด 1์ฐจ์› ๋ฒกํ„ฐ๊ฐ€ ๋œ ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

6) ์–ธ์Šคํ€ด์ฆˆ(Unsqueeze) - ํŠน์ • ์œ„์น˜์— 1์ธ ์ฐจ์›์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

์–ธ์Šคํ€ด์ฆˆ๋Š” ์Šคํ€ด์ฆˆ์™€ ์ •๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ํŠน์ • ์œ„์น˜์— 1์ธ ์ฐจ์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‹ค์Šต์„ ์œ„ํ•ด ์ž„์˜๋กœ (3,)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” 1์ธ ์ฐจ์› ํ…์„œ๋ฅผ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

ft = torch.Tensor([0, 1, 2])
print(ft.shape)
torch.Size([3])

ํ˜„์žฌ๋Š” ์ฐจ์›์ด 1๊ฐœ์ธ 1์ฐจ์› ๋ฒกํ„ฐ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ฒซ๋ฒˆ์งธ ์ฐจ์›์— 1์ธ ์ฐจ์›์„ ์ถ”๊ฐ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์ฐจ์›์˜ ์ธ๋ฑ์Šค๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ˆซ์ž 0์„ ์ธ์ž๋กœ ๋„ฃ์œผ๋ฉด ์ฒซ๋ฒˆ์งธ ์ฐจ์›์— 1์ธ ์ฐจ์›์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

print(ft.unsqueeze(0)) # ์ธ๋ฑ์Šค๊ฐ€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ 0์€ ์ฒซ๋ฒˆ์งธ ์ฐจ์›์„ ์˜๋ฏธํ•œ๋‹ค.
print(ft.unsqueeze(0).shape)
tensor([[0., 1., 2.]])
torch.Size([1, 3])

์œ„ ๊ฒฐ๊ณผ๋Š” (3,)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์กŒ๋˜ 1์ฐจ์› ๋ฒกํ„ฐ๊ฐ€ (1, 3)์˜ 2์ฐจ์› ํ…์„œ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ํ•œ ์—ฐ์‚ฐ์„ ์•ž์„œ ๋ฐฐ์šด view๋กœ๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 2์ฐจ์›์œผ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์œผ๋ฉด์„œ ์ฒซ๋ฒˆ์งธ ์ฐจ์›์€ 1์ด๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด view์—์„œ (1, -1)์„ ์ธ์ž๋กœ ์‚ฌ์šฉํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

print(ft.view(1, -1))
print(ft.view(1, -1).shape)
tensor([[0., 1., 2.]])
torch.Size([1, 3])

์œ„์˜ ๊ฒฐ๊ณผ๋Š” unsqueeze์™€ view๊ฐ€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“  ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” unsqueeze์˜ ์ธ์ž๋กœ 1์„ ๋„ฃ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ์ด๋Š” ๋‘๋ฒˆ์งธ ์ฐจ์›์— 1์„ ์ถ”๊ฐ€ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํฌ๊ธฐ๋Š” (3,)์ด์—ˆ์œผ๋ฏ€๋กœ ๋‘๋ฒˆ์งธ ์ฐจ์›์— 1์ธ ์ฐจ์›์„ ์ถ”๊ฐ€ํ•˜๋ฉด (3, 1)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

print(ft.unsqueeze(1))
print(ft.unsqueeze(1).shape)
tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])

์ด๋ฒˆ์—๋Š” unsqueeze์˜ ์ธ์ž๋กœ -1์„ ๋„ฃ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -1์€ ์ธ๋ฑ์Šค ์ƒ์œผ๋กœ ๋งˆ์ง€๋ง‰ ์ฐจ์›์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ํฌ๊ธฐ๋Š” (3,)์ด์—ˆ์œผ๋ฏ€๋กœ ๋งˆ์ง€๋ง‰ ์ฐจ์›์— 1์ธ ์ฐจ์›์„ ์ถ”๊ฐ€ํ•˜๋ฉด (3, 1)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํ˜„์žฌ ํ…์„œ์˜ ๊ฒฝ์šฐ์—๋Š” 1์„ ๋„ฃ์€ ๊ฒฝ์šฐ์™€ -1์„ ๋„ฃ์€ ๊ฒฝ์šฐ๊ฐ€ ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

print(ft.unsqueeze(-1))
print(ft.unsqueeze(-1).shape)
tensor([[0.],
        [1.],
        [2.]])
torch.Size([3, 1])

๋งจ ๋’ค์— 1์ธ ์ฐจ์›์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ 1์ฐจ์› ๋ฒกํ„ฐ๊ฐ€ (3, 1)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” 2์ฐจ์› ํ…์„œ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • view(), squeeze(), unsqueeze()๋Š” ํ…์„œ์˜ ์›์†Œ ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ชจ์–‘๊ณผ ์ฐจ์›์„ ์กฐ์ ˆํ•ฉ๋‹ˆ๋‹ค.

 

 

7) ํƒ€์ž… ์บ์ŠคํŒ…(Type Casting)

ํ…์„œ์—๋Š” ์ž๋ฃŒํ˜•์ด๋ผ๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ฐ์ดํ„ฐํ˜•๋ณ„๋กœ ์ •์˜๋˜์–ด์ ธ ์žˆ๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด 32๋น„ํŠธ์˜ ๋ถ€๋™ ์†Œ์ˆ˜์ ์€ torch.FloatTensor๋ฅผ, 64๋น„ํŠธ์˜ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜๋Š” torch.LongTensor๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. GPU ์—ฐ์‚ฐ์„ ์œ„ํ•œ ์ž๋ฃŒํ˜•๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด torch.cuda.FloatTensor๊ฐ€ ๊ทธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ์ž๋ฃŒํ˜•์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ํƒ€์ž… ์บ์ŠคํŒ…์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„  ์‹ค์Šต์„ ์œ„ํ•ด long ํƒ€์ž…์˜ lt๋ผ๋Š” ํ…์„œ๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

lt = torch.LongTensor([1, 2, 3, 4])
print(lt)

ํ…์„œ์—๋‹ค๊ฐ€ .float()๋ฅผ ๋ถ™์ด๋ฉด ๋ฐ”๋กœ floatํ˜•์œผ๋กœ ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

print(lt.float())
tensor([1., 2., 3., 4.])

์ด๋ฒˆ์—๋Š” Byte ํƒ€์ž…์˜ bt๋ผ๋Š” ํ…์„œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

bt = torch.ByteTensor([True, False, False, True])
print(bt)
tensor([1, 0, 0, 1], dtype=torch.uint8)

์—ฌ๊ธฐ์— .long()์ด๋ผ๊ณ ํ•˜๋ฉด long ํƒ€์ž…์˜ ํ…์„œ๋กœ ๋ณ€๊ฒฝ๋˜๊ณ  .float()์ด๋ผ๊ณ  ํ•˜๋ฉด float ํƒ€์ž…์˜ ํ…์„œ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

print(bt.long())
print(bt.float())
tensor([1, 0, 0, 1])
tensor([1., 0., 0., 1.])

8) ์—ฐ๊ฒฐํ•˜๊ธฐ(concatenate)

์ด๋ฒˆ์—๋Š” ๋‘ ํ…์„œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์šฐ์„  (2 × 2) ํฌ๊ธฐ์˜ ํ…์„œ๋ฅผ ๋‘ ๊ฐœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

x = torch.FloatTensor([[1, 2], [3, 4]])
y = torch.FloatTensor([[5, 6], [7, 8]])

์ด์ œ ๋‘ ํ…์„œ๋ฅผ torch.cat([ ])๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์€ ํ•œ ๊ฐ€์ง€๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. torch.cat์€ ์–ด๋Š ์ฐจ์›์„ ๋Š˜๋ฆด ๊ฒƒ์ธ์ง€๋ฅผ ์ธ์ž๋กœ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด dim=0์€ ์ฒซ๋ฒˆ์งธ ์ฐจ์›์„ ๋Š˜๋ฆฌ๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.

print(torch.cat([x, y], dim=0))
tensor([[1., 2.],
        [3., 4.],
        [5., 6.],
        [7., 8.]])

dim=0์„ ์ธ์ž๋กœ ํ–ˆ๋”๋‹ˆ ๋‘ ๊ฐœ์˜ (2 × 2) ํ…์„œ๊ฐ€ (4 × 2) ํ…์„œ๊ฐ€ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” dim=1์„ ์ธ์ž๋กœ ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.

print(torch.cat([x, y], dim=1))
tensor([[1., 2., 5., 6.],
        [3., 4., 7., 8.]])

dim=1์„ ์ธ์ž๋กœ ํ–ˆ๋”๋‹ˆ ๋‘ ๊ฐœ์˜ (2 × 2) ํ…์„œ๊ฐ€ (2 × 4) ํ…์„œ๊ฐ€ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋”ฅ ๋Ÿฌ๋‹์—์„œ๋Š” ์ฃผ๋กœ ๋ชจ๋ธ์˜ ์ž…๋ ฅ ๋˜๋Š” ์ค‘๊ฐ„ ์—ฐ์‚ฐ์—์„œ ๋‘ ๊ฐœ์˜ ํ…์„œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋‘ ํ…์„œ๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‘ ๊ฐ€์ง€์˜ ์ •๋ณด๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

9) ์Šคํƒํ‚น(Stacking)

์—ฐ๊ฒฐ(concatenate)์„ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์Šคํƒํ‚น(Stacking)์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒํ‚น์€ ์˜์–ด๋กœ ์Œ“๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์—ฐ๊ฒฐ์„ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์Šคํƒํ‚น์ด ๋” ํŽธ๋ฆฌํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์Šคํƒํ‚น์ด ๋งŽ์€ ์—ฐ์‚ฐ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์‹ค์Šต์„ ์œ„ํ•ด ํฌ๊ธฐ๊ฐ€ (2,)๋กœ ๋ชจ๋‘ ๋™์ผํ•œ 3๊ฐœ์˜ ๋ฒกํ„ฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

x = torch.FloatTensor([1, 4])
y = torch.FloatTensor([2, 5])
z = torch.FloatTensor([3, 6])

์ด์ œ torch.stack์„ ํ†ตํ•ด์„œ 3๊ฐœ์˜ ๋ฒกํ„ฐ๋ฅผ ๋ชจ๋‘ ์Šคํƒํ‚นํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

print(torch.stack([x, y, z]))
tensor([[1., 4.],
        [2., 5.],
        [3., 6.]])

์œ„ ๊ฒฐ๊ณผ๋Š” 3๊ฐœ์˜ ๋ฒกํ„ฐ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์Œ“์—ฌ (3 × 2) ํ…์„œ๊ฐ€ ๋œ ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์Šคํƒํ‚น์€ ์‚ฌ์‹ค ๋งŽ์€ ์—ฐ์‚ฐ์„ ํ•œ ๋ฒˆ์— ์ถ•์•ฝํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ์ž‘์—…์€ ์•„๋ž˜์˜ ์ฝ”๋“œ์™€ ๋™์ผํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

print(torch.cat([x.unsqueeze(0), y.unsqueeze(0), z.unsqueeze(0)], dim=0))

x, y, z๋Š” ๊ธฐ์กด์—๋Š” ์ „๋ถ€ (2,)์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ .unsqueeze(0)์„ ํ•˜๋ฏ€๋กœ์„œ 3๊ฐœ์˜ ๋ฒกํ„ฐ๋Š” ์ „๋ถ€ (1, 2)์˜ ํฌ๊ธฐ์˜ 2์ฐจ์› ํ…์„œ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์—ฐ๊ฒฐ(concatenate)๋ฅผ ์˜๋ฏธํ•˜๋Š” cat์„ ์‚ฌ์šฉํ•˜๋ฉด (3 x 2) ํ…์„œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

tensor([[1., 4.],
        [2., 5.],
        [3., 6.]])

์œ„์—์„œ๋Š” torch.stack([x, y, z])๋ผ๋Š” ํ•œ ๋ฒˆ์˜ ์ปค๋งจ๋“œ๋กœ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ, ์—ฐ๊ฒฐ(concatenate)๋กœ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ๋”๋‹ˆ ๊ฝค ๋ณต์žกํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์Šคํƒํ‚น์— ์ถ”๊ฐ€์ ์œผ๋กœ dim์„ ์ธ์ž๋กœ ์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” dim=1 ์ธ์ž๋ฅผ ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ๋‘๋ฒˆ์งธ ์ฐจ์›์ด ์ฆ๊ฐ€ํ•˜๋„๋ก ์Œ“์œผ๋ผ๋Š” ์˜๋ฏธ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

print(torch.stack([x, y, z], dim=1))
tensor([[1., 2., 3.],
        [4., 5., 6.]])

์œ„์˜ ๊ฒฐ๊ณผ๋Š” ๋‘๋ฒˆ์งธ ์ฐจ์›์ด ์ฆ๊ฐ€ํ•˜๋„๋ก ์Šคํƒํ‚น์ด ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ (2 × 3) ํ…์„œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

10) ones_like์™€ zeros_like - 0์œผ๋กœ ์ฑ„์›Œ์ง„ ํ…์„œ์™€ 1๋กœ ์ฑ„์›Œ์ง„ ํ…์„œ

์‹ค์Šต์„ ์œ„ํ•ด (2 × 3) ํ…์„œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

x = torch.FloatTensor([[0, 1, 2], [2, 1, 0]])
print(x)
tensor([[0., 1., 2.],
        [2., 1., 0.]])

์œ„ ํ…์„œ์— ones_like๋ฅผ ํ•˜๋ฉด ๋™์ผํ•œ ํฌ๊ธฐ(shape)์ง€๋งŒ 1์œผ๋กœ๋งŒ ๊ฐ’์ด ์ฑ„์›Œ์ง„ ํ…์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

print(torch.ones_like(x)) # ์ž…๋ ฅ ํ…์„œ์™€ ํฌ๊ธฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ํ•˜๋ฉด์„œ ๊ฐ’์„ 1๋กœ ์ฑ„์šฐ๊ธฐ
tensor([[1., 1., 1.],
        [1., 1., 1.]])

์œ„ ํ…์„œ์— zeros_like๋ฅผ ํ•˜๋ฉด ๋™์ผํ•œ ํฌ๊ธฐ(shape)์ง€๋งŒ 0์œผ๋กœ๋งŒ ๊ฐ’์ด ์ฑ„์›Œ์ง„ ํ…์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

print(torch.zeros_like(x)) # ์ž…๋ ฅ ํ…์„œ์™€ ํฌ๊ธฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ํ•˜๋ฉด์„œ ๊ฐ’์„ 0์œผ๋กœ ์ฑ„์šฐ๊ธฐ
tensor([[0., 0., 0.],
        [0., 0., 0.]])

11) In-place Operation (๋ฎ์–ด์“ฐ๊ธฐ ์—ฐ์‚ฐ)

์‹ค์Šต์„ ์œ„ํ•ด (2 × 2) ํ…์„œ๋ฅผ ๋งŒ๋“ค๊ณ  x์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

x = torch.FloatTensor([[1, 2], [3, 4]])

๊ณฑํ•˜๊ธฐ ์—ฐ์‚ฐ์„ ํ•œ ๊ฐ’๊ณผ ๊ธฐ์กด์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

print(x.mul(2.)) # ๊ณฑํ•˜๊ธฐ 2๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
print(x) # ๊ธฐ์กด์˜ ๊ฐ’ ์ถœ๋ ฅ
tensor([[2., 4.],
        [6., 8.]])
tensor([[1., 2.],
        [3., 4.]])

์ฒซ๋ฒˆ์งธ ์ถœ๋ ฅ์€ ๊ณฑํ•˜๊ธฐ 2๊ฐ€ ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ , ๋‘๋ฒˆ์งธ ์ถœ๋ ฅ์€ ๊ธฐ์กด์˜ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณฑํ•˜๊ธฐ 2๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ์ด๋ฅผ x์—๋‹ค๊ฐ€ ๋‹ค์‹œ ์ €์žฅํ•˜์ง€ ์•Š์•˜์œผ๋‹ˆ, ๊ณฑํ•˜๊ธฐ ์—ฐ์‚ฐ์„ ํ•˜๋”๋ผ๋„ ๊ธฐ์กด์˜ ๊ฐ’ x๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์—ฐ์‚ฐ ๋’ค์— _๋ฅผ ๋ถ™์ด๋ฉด ๊ธฐ์กด์˜ ๊ฐ’์„ ๋ฎ์–ด์“ฐ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค.

print(x.mul_(2.))  # ๊ณฑํ•˜๊ธฐ 2๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜ x์— ๊ฐ’์„ ์ €์žฅํ•˜๋ฉด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
print(x) # ๊ธฐ์กด์˜ ๊ฐ’ ์ถœ๋ ฅ
tensor([[2., 4.],
        [6., 8.]])
tensor([[2., 4.],
        [6., 8.]])

์ด๋ฒˆ์—๋Š” x์˜ ๊ฐ’์ด ๋ฎ์–ด์“ฐ๊ธฐ ๋˜์–ด 2 ๊ณฑํ•˜๊ธฐ ์—ฐ์‚ฐ์ด ๋œ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•