In [90]:
# -*-coding:utf-8-*-

import numpy as np


class ConvolutionNetwork:
    """
    simple convolutional network
    """

    def __init__(self, kernalSize=(1, 1), kernalShape=(3, 3), kernalStep=1):
        self.__kernalSize = kernalSize
        self.__kernalShape = kernalShape
        self.__kernalStep = kernalStep
        #self.__kernals = np.random.randn(kernalSize[0], kernalSize[1], kernalShape[0], kernalShape[1])
        self.__kernals = np.array([[[[1,2,3],[4,5,6],[7,8,9]]]])

    def __convolute(self, data):
        dm, dn = data.shape
        km, kn = self.__kernalShape
        kernalMapShape = (dm - km) / self.__kernalStep + 1, (dn - kn) / self.__kernalStep + 1
        kernalMaps = []
        for k in range(self.__kernalSize[1]):
            kernalGroup = self.__kernals[:, k]
            
            # TODO: change np.sum to convoluteFunction such sum, mean etc.
            kernalMap = sum([np.array([np.sum(data[i:i + km, j:j + kn] * kernal)
                                       for i in range(0, dm - km + 1, self.__kernalStep)
                                       for j in range(0, dn - kn + 1, self.__kernalStep)
                                       ]).reshape(kernalMapShape) for kernal in kernalGroup])
            kernalMaps.append(kernalMap)
        self.__kernalMaps = np.array(kernalMaps)

        print self.__kernalMaps
    def fit(self, data):
        self.__convolute(data)


if __name__ == '__main__':
    # data = np.random.rand(4, 4)
    data = np.array([
        [1,2,3,4],
        [5,6,7,8],
        [9,10,11,12],
        [13,14,15,16]
    ])
    cnn = ConvolutionNetwork()
    cnn.fit(data)


[[[348 393]
  [528 573]]]

In [99]:
data = np.array([
        [1,2,3,4],
        [5,6,7,8],
        [9,10,11,12],
        [13,14,15,16]
    ])
d1 = data[0:3,0:3]
d2 = data[0:3,1:4]
d3 = data[1:4,0:3]
d4 = data[1:4,1:4]
print d1
print d2
print d3
print d4
kernal = np.array([
        [1,2,3],
        [4,5,6],
        [7,8,9]
    ])
r1 = kernal*d1
print r1
print np.sum(r1)


[[ 1  2  3]
 [ 5  6  7]
 [ 9 10 11]]
[[ 2  3  4]
 [ 6  7  8]
 [10 11 12]]
[[ 5  6  7]
 [ 9 10 11]
 [13 14 15]]
[[ 6  7  8]
 [10 11 12]
 [14 15 16]]
[[ 1  4  9]
 [20 30 42]
 [63 80 99]]
348

In [19]:
data = np.random.randn(5,5)
print data[0:3,0:3]


[[-0.13952662  0.1570312  -0.71920374]
 [ 1.24095539  0.9646782   0.25817817]
 [-0.09433619  0.02128432 -0.44333165]]

In [100]:
data = [np.array([1,2,3]), np.array([4,5,6])]
sum(data)


Out[100]:
array([5, 7, 9])

In [ ]: