Tensorflows CNN层上的矩阵有问题

时间:2019-12-19 18:03:41

标签: tensorflow neural-network conv-neural-network

我正在使用现有的神经网络(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

1 个答案:

答案 0 :(得分:0)

内核extract certain features from an input image)是权重矩阵,该权重矩阵与输入值相乘以提取相关特征。请在下面观看此操作

enter image description here

例如,上面使用的内核对于锐化图像很有用。但是这个内核有什么特别之处呢?考虑以下示例中所示的两个输入图像排列。对于第一个图像,中心值为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,从而使图像清晰。

enter image description here

为回答您的问题,如何在层中添加内核?

通过CNN,我们可以使用这些可以提取潜在特征的内核值,而不必使用人工制作的内核来进行特征提取。

核矩阵的维数是卷积如何获得其名称。例如,在2D convolutions中,内核矩阵是2D matrix

请参考link,以通过sequentialFunctional模式在keras中创建模型。