CNN中的尺寸误差

时间:2017-08-21 10:12:51

标签: python python-3.x tensorflow deep-learning

我试图建立一个CNN来区分猫狗 我从Kaggle获取的数据 在展平图层后我遇到了错误。

模型参数如下:



IMG_SIZE=55

filter_size = 5;
no_of_filters1 = 16;
no_of_filters2 = 32;
no_of_filters3 = 64;
classes=2
x=tf.placeholder(tf.float32,[None,IMG_SIZE,IMG_SIZE,1])
y=tf.placeholder(tf.float32,[None,classes])

w1= weights([filter_size,filter_size,1,no_of_filters1])
w2= weights([filter_size,filter_size,no_of_filters1,no_of_filters2])
w3= weights([filter_size,filter_size,no_of_filters2,no_of_filters3])
wfc=weights([no_of_filters3,625])-ERROR
w_0=weights([625,classes])




我的CNN模型:



def model(x,w1,w2,w3,w4,w_o):

    #Layer1
    layer1= tf.nn.conv2d(x,w1,strides=[1,1,1,1],padding='SAME')
    layer1= tf.nn.relu(layer1)
    layer1=tf.nn.max_pool(layer1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')

    # Layer2
    layer2 = tf.nn.conv2d(layer1,w2, strides=[1, 1, 1, 1],
                          padding='SAME')
    layer2 = tf.nn.relu(layer2)
    layer2 = tf.nn.max_pool(layer2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1],padding='SAME')

    layer3 = tf.nn.conv2d(layer2,w3,
                          strides=[1, 1, 1, 1],
                          padding='SAME')
    layer3 = tf.nn.relu(layer3)
    layer3 = tf.nn.max_pool(layer3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1],padding='SAME')

    layer_shape= layer3.get_shape()
    num_features = layer_shape[1:4].num_elements()

    fc_layer=tf.reshape(layer3,[-1,num_features])
    fc_layer=tf.nn.relu(fc_layer)

    ouput_layer= tf.nn.relu(tf.matmul(fc_layer,w4))
    logits= tf.matmul(ouput_layer,w_o)

    return logits




被提升的错误是:

  

ValueError:尺寸必须相等,但对于' MatMul'是1024和64。 (op:' MatMul')输入形状:[?,1024],[64,625]。

请指导我。

2 个答案:

答案 0 :(得分:1)

对于Fc图层,您需要将weights第一维与输入的最后一维相匹配,在本例中为1024

no_filters_in = 1024
wfc=weights([no_filters_in, no_of_filters3])

答案 1 :(得分:0)

您需要考虑要素地图的大小。假设layer3的形状为(4,4,no_of_filters3),其中4x4是要素图大小。那么fc_layer的形状为(4x4xno_of_filters3,1)。执行“ tf.matmul(fc_layer,w4)”时,w4的正确形状应为(4x4xno_of_filters3,625)。