我试图建立一个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]。
请指导我。
答案 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)。