こちら*1と併せて、アップしています
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import numpy as np
TEST_DATA_SIZE = 500
IMG_SIZE = 28
FILTER_SIZE = 32
IMG_SIZE_2 = 14
FILTER_SIZE_2 = 64
HIDEN_SIZE = 1024
OUTPUT_SIZE = 10
testImages = np.zeros((TEST_DATA_SIZE, IMG_SIZE*IMG_SIZE))
def read_test_data():
fileImg = open('./data/testImage.txt', 'r')
for i in range(TEST_DATA_SIZE):
line = fileImg.readline()
val = line.split(',')
testImages[i, :] = val[1:IMG_SIZE*IMG_SIZE + 1]
def conv2d(x, flr):
# padding='SAME'、stride=1を想定
H = x.shape[0] + flr.shape[0] - 1
W = x.shape[1] + flr.shape[1] - 1
D = x.shape[2]
layer = np.zeros([H, W, D])
offset = round(flr.shape[0] / 2)
for h in range(offset, H - offset): # height
for w in range(offset, H - offset): # width
for d in range(0, flr.shape[2]): # Depth
layer[h, w, d] = x[h - offset, w - offset, d]
tmp = 0.0
output = np.zeros([x.shape[0], x.shape[0], flr.shape[3]])
for k in range(0, flr.shape[3]): # number of filter
for h in range(offset, H - offset): # height
for w in range(offset, W - offset): # weight
tmp = 0.0
for i in range(-offset, offset + 1): # filter height
for j in range(-offset, offset + 1): # filter width
for l in range(0, flr.shape[2]): # filter depth
tmp += layer[h + i, w + j, l] * flr[i + offset, j + offset, l, k]
output[h - offset, w - offset, k] = tmp
return output
def relu3(input):
output = np.zeros([input.shape[0], input.shape[1], input.shape[2]])
for h in range(input.shape[0]):
for w in range(input.shape[1]):
for k in range(input.shape[2]):
if (input[h, w, k] > 0):
output[h, w, k] = input[h, w, k]
else:
output[h, w, k] = 0.0
return output
def relu2(input):
output = np.zeros([input.shape[0], input.shape[1]])
for h in range(input.shape[0]):
for w in range(input.shape[1]):
if (input[h, w] > 0):
output[h, w] = input[h, w]
else:
output[h, w] = 0.0
return output
def maxpool22(input):
output = np.zeros([input.shape[0], input.shape[1], input.shape[2]])
for k in range(input.shape[2]):
h = 0
H = 0
while True: # height
if (h + 1 >= input.shape[0]):
break
w = 0
W = 0
while True: # width
if (w + 1 >= input.shape[1]):
break
val = np.zeros(4)
val[0] = input[h, w, k]
val[1] = input[h + 1, w, k]
val[2] = input[h, w + 1, k]
val[3] = input[h + 1, w + 1, k]
output[H, W, k] = max(val)
w += 2
W += 1
h += 2
H += 1
return output
def ConnectFull(input, W, b):
output = np.zeros([input.shape[0], W.shape[1]])
for i in range(input.shape[0]):
for j in range(W.shape[1]):
output[i, j] = 0.0
for k in range(input.shape[1]):
output[i, j] += input[i, k] * W[k, j]
output[i, j] += b[j]
return output
def softmax(input):
c = np.max(input)
exp_a = np.exp(input - c)
sum_exp_a = np.sum(exp_a)
return exp_a / sum_exp_a
def reshape4(W, I, J, K, L):
i = 0
j = 0
k = 0
l = 0
counter = 0
reshaped = np.zeros([I, J, K, L])
while True:
reshaped[i, j, k, l] = W[counter]
if (counter % (I*J*K) == (I*J*K - 1)):
j = 0
i = 0
k = 0
l += 1
elif (counter % (I*J) == (I*J - 1)):
j = 0
i = 0
k += 1
elif (counter % J == (J - 1)):
j = 0
i += 1
else:
j += 1
counter += 1
if(counter == I*J*K*L):
break
return reshaped
if __name__=='__main__':
# read image
read_test_data()
# read model
W_conv1 = np.loadtxt('./model/W_conv1.txt')
W_conv1 = reshape4(W_conv1, 5, 5, 1, FILTER_SIZE)
b_conv1 = np.loadtxt('./model/b_conv1.txt')
W_conv2 = np.loadtxt('./model/W_conv2.txt')
W_conv2 = reshape4(W_conv2, 5, 5, FILTER_SIZE, FILTER_SIZE_2)
b_conv2 = np.loadtxt('./model/b_conv2.txt')
W_fc1 = np.loadtxt('./model/W_fc1.txt')
W_fc1 = W_fc1.reshape([int(IMG_SIZE_2/2)*int(IMG_SIZE_2/2)*FILTER_SIZE_2, HIDEN_SIZE])
b_fc1 = np.loadtxt('./model/b_fc1.txt')
W_fc2 = np.loadtxt('./model/W_fc2.txt')
W_fc2 = W_fc2.reshape([HIDEN_SIZE, OUTPUT_SIZE])
b_fc2 = np.loadtxt('./model/b_fc2.txt')
# convolution layer 1
x = np.zeros([IMG_SIZE, IMG_SIZE, 1])
for i in range(IMG_SIZE):
for j in range(IMG_SIZE):
x[i, j, 0] = testImages[0, i*IMG_SIZE + j]/255.0
temp = conv2d(x, W_conv1)
for k in range(FILTER_SIZE):
for h in range(IMG_SIZE):
for w in range(IMG_SIZE):
temp[h, w, k] += b_conv1[k]
h_conv1 = relu3(temp)
plt.figure(figsize=(5, 10))
for k in range(FILTER_SIZE):
plt.subplot(8, 4, k + 1)
print("conv1 " + str(k))
for i in range(IMG_SIZE):
for j in range(IMG_SIZE):
plt.plot(j, IMG_SIZE - i, '.', color=cm.jet(h_conv1[i, j, k]))
plt.xlim(0, IMG_SIZE)
plt.ylim(0, IMG_SIZE)
plt.xticks(color='None')
plt.yticks(color='None')
plt.savefig('./model/conv1.png')
h_pool1 = maxpool22(h_conv1)
plt.figure(figsize=(3, 6))
for k in range(FILTER_SIZE):
plt.subplot(8, 4, k + 1)
print("pool2 " + str(k))
for i in range(int(IMG_SIZE/2)):
for j in range(int(IMG_SIZE/2)):
plt.plot(j, int(IMG_SIZE/2) - i, '.', color=cm.jet(h_pool1[i, j, k]))
plt.xlim(0, IMG_SIZE/2)
plt.ylim(0, IMG_SIZE/2)
plt.xticks(color='None')
plt.yticks(color='None')
plt.savefig('./model/pool1.png')
# convolution layer 2
temp2 = conv2d(h_pool1, W_conv2)
for k in range(FILTER_SIZE_2):
for h in range(IMG_SIZE_2):
for w in range(IMG_SIZE_2):
temp2[h, w, k] += b_conv2[k]
h_conv2 = relu3(temp2)
plt.figure(figsize=(10, 10))
for k in range(FILTER_SIZE_2):
plt.subplot(8, 8, k + 1)
print("conv2 " + str(k))
for i in range(IMG_SIZE_2):
for j in range(IMG_SIZE_2):
plt.plot(j, IMG_SIZE_2 - i, '.', color=cm.jet(h_conv2[i, j, k]))
plt.xlim(0, IMG_SIZE_2)
plt.ylim(0, IMG_SIZE_2)
plt.xticks(color='None')
plt.yticks(color='None')
plt.savefig('./model/conv2.png')
h_pool2 = maxpool22(h_conv2)
plt.figure(figsize=(5, 5))
for k in range(FILTER_SIZE_2):
plt.subplot(8, 8, k + 1)
print("pool2 " + str(k))
for i in range(int(IMG_SIZE_2/2)):
for j in range(int(IMG_SIZE_2/2)):
plt.plot(j, int(IMG_SIZE_2/2) - i, '.', color=cm.jet(h_pool2[i, j, k]))
plt.xlim(0, IMG_SIZE_2/2)
plt.ylim(0, IMG_SIZE_2/2)
plt.xticks(color='None')
plt.yticks(color='None')
plt.savefig('./model/pool2.png')
# Fully connecte layer
h_pool2_flat = np.zeros([1, int(IMG_SIZE_2/2) * int(IMG_SIZE_2/2) * FILTER_SIZE_2])
for i in range(int(IMG_SIZE_2/2)):
for j in range(int(IMG_SIZE_2/2)):
for k in range(FILTER_SIZE_2):
h_pool2_flat[0, i*int(IMG_SIZE_2/2)*FILTER_SIZE_2 + j*FILTER_SIZE_2 + k] = h_pool2[i, j, k]
temp3 = ConnectFull(h_pool2_flat, W_fc1, b_fc1)
h_fc1 = relu2(temp3)
plt.figure(figsize=(5, 2))
t = np.linspace(0, 1023, 1024)
plt.plot(t, h_fc1.reshape([1024]))
plt.savefig('./model/fc1.png')
# output
temp4 = ConnectFull(h_fc1, W_fc2, b_fc2)
y_conv = softmax(temp4.reshape([10]))
plt.figure(figsize=(5, 2))
t = np.linspace(0, 9, 10)
plt.plot(t, y_conv.reshape([10]))
plt.savefig('./model/fc2.png')