我想知道的:
我已经在keras中建立并训练了一个CNN模型,并且已经能够计算预测,但是我想知道在预测步骤中数字上发生的过程的细节。
What I tried:
(1)使用训练好的Keras模型计算得分。
(2)对我的CNN进行编码,计算得分并与(1)进行比较(→差异)。
(3)在GitHub上查看Keras和Tensorflow的源代码,并研究Keras的predict()与我的CNN在数值处理方面的差异。
我在keras中建立了这样一个模型。
model = Sequential()
mode.add(Conv2D(20,kernel_size=(1,5), strides=(1,1), padding='valid', input_shape=(24,13,1), activation='relu'))
mode.add(Conv2D(20,kernel_size=(1,9), strides=(1,1), padding='valid', activation='relu'))
mode.add(Conv2D(20,kernel_size=(24,1), strides=(1,1), padding='valid', activation='relu'))
mode.add(Flatten())
mode.add(Dense(20,activation='relu'))
mode.add(Dense(2,activation='sigmoid'))
model.load_weights(model_path / '[model_filename].h5')
model.summary()
另一方面,我用这种方式创建了我的预测CNN代码。我省略了代码,但我已经成功地获得了内核和偏差的值。
我的CNN代码(只有密集和卷积)
def mydense(ind, ker, bia, func):
tem_dense = np.dot(ker.T, ind) + bia
return func(tem_dense)
def myconv(ind, ker, bia, func):
# input sample data's shape
H = ind.shape[0]
W = ind.shape[1]
# kernel' shape
Hf = ker.shape[0]
Wf = ker.shape[1]
K = ker.shape[3]
# result of convolution
u = np.zeros((H - Hf + 1, W - Wf + 1, K))
# output
z = np.zeros((u.shape))
for k in range(0,K):
for n in range(0,W - Wf + 1):
for m in range(0, H - Hf + 1):
u[m,n,k] = (ind[m:m+Hf, n:n+Wf, :] * ker[:,:,:,k] + bia[k]).sum()
z = np.array([func(i) for i in u])
return z
结果与model.predict()非常不同。
我已经看过的:
我已经进一步研究了predict()和其他源代码,但我需要那些知情人士的帮助。
与卷积过程(Conv2D或Conv)一样,我想详细了解稠密过程中数字上发生的情况。
如有任何帮助,不胜感激。
我自己解决了。我错了,按照文本处理了。看起来keras没有做任何其他事情。