我正在使用现有的神经网络(github上的SimpleHTR) 到目前为止,我试图通过添加下一层(在kernelVals,featureVals和strideVals矩阵中添加下一个值)来使用CNN层。
这次,我只想添加内核,而不是整个层。我试图通过在“ for”循环中添加conv2,conv_norm2和relu2来做到这一点,但是发生了矩阵大小错误。
我不是这个话题的新手,有人可以解释一下如何在层中添加内核吗?
def setupCNN(self):
"create CNN layers and return output of these layers"
cnnIn4d = tf.expand_dims(input=self.inputImgs, axis=3)
# list of parameters for the layers
kernelVals = [5, 5, 3, 3, 3]
featureVals = [1, 32, 64, 128, 128, 256]
strideVals = poolVals = [(2,2), (2,2), (1,2), (1,2), (1,2)]
numLayers = len(strideVals)
# create layers
pool = cnnIn4d # input to first CNN layer
for i in range(numLayers):
kernel = tf.Variable(tf.truncated_normal([kernelVals[i], kernelVals[i], featureVals[i], featureVals[i + 1]], stddev=0.1))
conv = tf.nn.conv2d(pool, kernel, padding='SAME', strides=(1,1,1,1))
conv_norm = tf.layers.batch_normalization(conv, training=self.is_train)
relu = tf.nn.relu(conv_norm)
pool = tf.nn.max_pool(relu, (1, poolVals[i][0], poolVals[i][1], 1), (1, strideVals[i][0], strideVals[i][1], 1), 'VALID')
self.cnnOut4d = pool
答案 0 :(得分:0)
内核(extract certain features from an input image
)是权重矩阵,该权重矩阵与输入值相乘以提取相关特征。请在下面观看此操作
例如,上面使用的内核对于锐化图像很有用。但是这个内核有什么特别之处呢?考虑以下示例中所示的两个输入图像排列。对于第一个图像,中心值为3 * 5 + 2 * -1 + 2 * -1 + 2 * -1 + 2 * -1 =7。值3增加到7。对于第二个图像,输出是1 * 5 + 2 * -1 + 2 * -1 + 2 * -1 + 2 * -1 = -3。值1减少到-3。显然,3和1之间的对比度会增加到7和-3,从而使图像清晰。
为回答您的问题,如何在层中添加内核?
通过CNN,我们可以使用这些可以提取潜在特征的内核值,而不必使用人工制作的内核来进行特征提取。
核矩阵的维数是卷积如何获得其名称。例如,在2D convolutions
中,内核矩阵是2D matrix
。
请参考link,以通过sequential
和Functional
模式在keras中创建模型。