즐거운프로그래밍

[딥러닝] 딥러닝 모델 학습 후 저장하고 필터 이미지 추출하기

수수께끼 고양이 2023. 11. 2. 10:26
728x90
반응형

 

 

import tensorflow as tf

mnist=tf.keras.datasets.cifar10

(x_train, y_train),(x_test, y_test)=mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 # 모든 픽셀의 숫자를 255.0으로 나누어 각 픽셀을 실수로 바구어 인공신경망에 입력하게 됨

model = tf.keras.Sequential([
    tf.keras.layers.InputLayer(input_shape=(32,32,3)),
    tf.keras.layers.Conv2D(24,(3,3),(1,1),activation='relu'), # 커널5*5 사이즈 -> stride 2,2
    tf.keras.layers.Conv2D(36,(3,3),(1,1),activation='relu'), # 커널7*7 사이즈 -> stride 3,3
    tf.keras.layers.Conv2D(48,(3,3),(1,1),activation='relu'), 
    tf.keras.layers.Conv2D(64,(3,3),(1,1),activation='relu'), # 커널3*3 사이즈 -> stride 1,1
    tf.keras.layers.Conv2D(64,(3,3),activation='relu'),# stride 1,1은 생략해도도 됨
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Flatten(), #납작하게 해주는 것, 주어진 그림(1164)과 달리 12개가 외부에서 들어감
    tf.keras.layers.Dense(100,activation='relu'),
    tf.keras.layers.Dense(50,activation='relu'),
    tf.keras.layers.Dense(10,activation='softmax')
])

model.summary()

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)

model.save('my_model.h5')

'''
model.layers
model.layers[0]
model.layers[0].get_weights()
model.layers[0].get_weights()[0] ->kernel(weights)
model.layers[0].get_weights()[1] ->bias
model.layers[0].get_weights()[0].shape
model.layers[0].get_weights()[0][...,0] -> filter
'''

 

 

 


import tensorflow as tf
import numpy as np

mnist=tf.keras.datasets.cifar10

_,(x_test,y_test)=mnist.load_data()

model=tf.keras.models.load_model('my_model.h5')

y_pred=model.predict(x_test[1:2])
print(y_pred,np.argmax(y_pred), np.argmax(y_test[1:2]))

import matplotlib.pyplot as plt
# plt.imshow(x_test[1])
# plt.show()

image=x_test[2]
filter=model.layers[0].get_weights()[1][...,4]
# filters=model.layers[0].get_weight()[0]

image_pad=np.pad(image,((1,1),(1,1),(0,0)))

H,W,C=image.shape

convolution=np.zeros((H,W,1))

for row in range(H):
    for col in range(W):
        window=image_pad[row:row+3, col:col+3]
        convolution[row,col]=np.clip(np.sum(window*filter),0,255)

images=[image,convolution]

plt.figure(figsize=(4,2))
for i in range(len(images)):
    plt.subplot(1,2,i+1) # 세로, 가로, 위치 순
    plt.xticks([])
    plt.yticks([])
    plt.imshow(images[i])
plt.show()
            

'''
model.layers
model.layers[0]
model.layers[0].get_weights()
model.layers[0].get_weights()[0]
model.layers[0].get_weights()[1]
model.layers[0].get_weights()[0].shape
model.layers[0].get_weights()[0][...,0]

image.shape
filter.shape # filter=filt
'''

 

원본 사진, 필터 사진

 

 

 


import tensorflow as tf
import numpy as np

mnist=tf.keras.datasets.cifar10

_,(x_test,y_test)=mnist.load_data()

model=tf.keras.models.load_model('my_model.h5')

y_pred=model.predict(x_test[1:2])
print(y_pred, np.argmax(y_pred), np.argmax(y_test[1:2]))

import matplotlib.pyplot as plt

image=x_test[2]
filt=model.layers[0].get_weights()[0][...,-1]
filts=model.layers[0].get_weights()[0]
print(filts.shape) # 1번

image_pad=np.pad(image,((1,1),(1,1),(0,0)))

H,W,C=image.shape

convolution=np.zeros((H,W,24)) # 2번
print(convolution.shape)

for fn in range(24): # 3번
    for row in range(H):
        for col in range(W):
            window=image_pad[row:row+3,col:col+3]
            convolution[row,col,fn]=np.sum(window*filts[...,fn]) # 4

images=[]
for idx in range(24):
    images.append(convolution[...,idx])
#     images.extend([convolution[...,idx]])
#     images += [convolution[...,idx]]
    
# plt.imshow(images[0])
# plt.show()

plt.figure(figsize=(10,5)) #4x6
for i in range(24):
    plt.subplot(4,6,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.imshow(images[i], cmap=plt.cm.gray)
plt.show()

 

24장 이미지 출력

 

 

 

 

 

728x90
반응형