Skip to content

Latest commit

ย 

History

History
133 lines (125 loc) ยท 4.48 KB

File metadata and controls

133 lines (125 loc) ยท 4.48 KB

3 week tensorflow ๊ธฐ์ดˆ :octocat:

Convolution


What is convolution?

  • ํ•„ํ„ฐ์˜ ๊ฐ’์„ ์ด์šฉํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ๊ฒƒ
  • ํ•„ํ„ฐ์˜ ํ•œ ๋ถ€๋ถ„(ex) 2x2, 3x3)์„ ์žก์•„์„œ ํ•„ํ„ฐ์˜ ๊ฐ’ ๊ณฑํ•œ ํ›„ ๋”ํ•ด์„œ New pixel value๋ฅผ ์ƒ์„ฑ
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

Customizing this code with convolution

model = keras.Sequential([
    keras.layers.Conv2D(64, (3,3), activation='relu',
                        input_shape = (28,28,1)), # ๋’ค์˜ 1 ์€ ์ปฌ๋Ÿฌ์ฑ„๋„์ธ๋ฐ ํ‘๋ฐฑ์ด๋ฏ€๋กœ 1 ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค
    tf.keras.layers.MaxPooling2D(2, 2), # 2 x 2 ํ”ฝ์…€์„ ์žก์•„์„œ ์ตœ๋Œ€๊ฐ’์„ ๋ฝ‘์•„๋‚ธ๋‹ค. -> pixel ์ด 1/4์ด ๋จ
    tf.keras.layers.Conv2D(64,(3,3),activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2).
    tf.keras.layers.Flatten(),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])
  • conv2D ์•ž์— ๋“ค์–ด์žˆ๋Š” 64, (3,3) ์€ ๊ฐ๊ฐ€ filter, kernal_size ๋ผ ํ•˜๋Š”๋ฐ, filter์€ convovlution์˜ output ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธ,kernal_size๋Š” ์•ž์˜ 2D convolution window์˜ ๊ฐ€๋กœ ์„ธ๋กœ ๊ธธ์ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ์™œ output์˜ ์ˆ˜๊ฐ€ 64๊ฐœ์ธ์ง€๋Š” ์•„์ง์€ ์•Œ ์ˆ˜ ์—†์Œ...

Compiling & Training

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
model.fit(training_images, training_labels, epochs=5)
test_loss = model.evaluate(test_images, test_labels)

Testing with convolution


f, axarr = plt.subplots(3,5)

3 x 5 ํฌ๊ธฐ์˜ subplot ์ƒ์„ฑ

layer_outputs = [layer.output for layer in model.layers] # ์•„๋งˆ ๋ ˆ์ด์–ด ๊ฐ๊ฐ output ๋ฐ˜ํ™˜..

๋ชจ๋ธ ๊ฐ ๋ ˆ์ด์–ด ๋ณ„ output๊ฐ’์„ layer_outputs์— ์ €์žฅ

activation_model = tf.keras.models.Model(inputs = model.input, outputs =layer_outputs)
for x in range(0,4): 
  f1 = activation_model.predict(test_images[0].reshape(1,28,28,1))[x] # ์ฒซ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ ์ด๋ฏธ์ง€๊ฐ€ ๋ณ€ํ™˜๋ผ์„œ ๋“ค์–ด๊ฐ„๋‹ค,
  # ๋ฆฌํ„ด์€ 4๋ฒˆ์˜ ๋ ˆ์ด์–ด ํ†ต๊ณผ์— ๋”ฐ๋ฅธ output ์ด๋ฏธ์ง€
  axarr[0,x].imshow(f1[0,:,:,1])
  f2 = activation_model.predict(test_images[3].reshape(1,28,28,1))[x]
  axarr[1,x].imshow(f2[0,:,:,1])
  f3 = activation_model.predict(test_images[6].reshape(1,28,28,1))[x]
  axarr[2,x].imshow(f3[0,:,:,1])

axarr[0,4].imshow(test_images[0])
axarr[1,4].imshow(test_images[3])
axarr[2,4].imshow(test_images[6])
plt.show()

์œ„์—์„œ ๋งŒ๋“  subplot ์—๋‹ค ๊ณผ์ •๋ณ„ layer output ์ด๋ฏธ์ง€ ์ €์žฅ

Image filtering


Importing

import cv2
import numpy as np
from scipy import misc
import matplotlib.pyplot as plt
i = misc.ascent()

์ด๋ฏธ์ง€ ๋ถˆ๋Ÿฌ์˜ด

plt.subplot(1,4,1)
plt.gray()
plt.axis('off')
plt.imshow(i)

์ฒซ๋ฒˆ์จฐ subplot ์—๋‹ค๊ฐ€ misc.ascent()์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€ ๋„ฃ์–ด์ค€๋‹ค

i_transformed = np.copy(i)
size_x = i_transformed.shape[0]
size_y = i_transformed.shape[1]
  • i_transformed ์— ๊ทธ๋ฆผ ๋ณต์‚ฌํ•ด์„œ ์ €์žฅ
  • ๊ทธ๋ฆผ์˜ ๊ฐ€๋กœ ์„ธ๋กœ ์ €์žฅํ•ด๋‘ 
filter = [[[-1, -2, -1], [0, 0, 0], [1, 2, 1]],
          [[0, 1, 0], [1, -4, 1], [0, 1, 0]],
          [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]]

ํ•„ํ„ฐ๋งํ• ๋•Œ ๋“ค์–ด๊ฐˆ ๊ฐ์ข… ํ•„ํ„ฐ 3์ข…๋ฅ˜

weight = 1

์ด ์˜ˆ์‹œ์—์„œ๋Š” weight๋Š” ์ƒ๊ด€์—†์œผ๋ฏ€๋กœ 1๋กœ ๋‘ 

for k in range(3):
    plt.subplot(1, 4, k+2)
    i_transformed = np.copy(i)
    for x in range(1,size_x-1):
        for y in range(1,size_y-1):
            convolution =0.0
            convolution = convolution + (i[x - 1, y-1] * filter[k][0][0])
            convolution = convolution + (i[x, y-1] * filter[k][0][1])
            convolution = convolution + (i[x + 1, y-1] * filter[k][0][2])
            convolution = convolution + (i[x-1, y] * filter[k][1][0])
            convolution = convolution + (i[x, y] * filter[k][1][1])
            convolution = convolution + (i[x+1, y] * filter[k][1][2])
            convolution = convolution + (i[x-1, y+1] * filter[k][2][0])
            convolution = convolution + (i[x, y+1] * filter[k][2][1])
            convolution = convolution + (i[x+1, y+1] * filter[k][2][2])
            convolution = convolution * weight
            if(convolution<0):
                convolution = 0
            if(convolution>255):
                couvolution = 255
            i_transformed[x,y] = convolution

    plt.imshow(i_transformed)

plt.show()

image_filter