我一直在尝试构建一个简单的卷积网络来对CIFAR图像进行分类,无论出于什么原因,我都无法表现得比偶然。这是相关的代码位(x是形状(n,32,32,3)的cifar图像数据):
正如您所看到的,它是一个非常基本的设置 - 我知道它不是一个非常精细的网络,但我只想在转向更复杂的架构之前先测试它。但是,无论我尝试什么,我都无法达到预测准确度超过"机会猜测"。当我训练它时,损失会稳定地(或多或少地)下降,但逐渐逐渐减少并在随机猜测的水平上饱和(即CIFAR-10的准确度为10%)。
我尝试了各种不同的参数,例如不同的内核大小,步幅,不同的最大池大小,没有规范化等等但它似乎没有让步。我只是觉得我一定错过了一些关键的预处理步骤,因为即使是一个相对简单/调整不佳的网络,至少应该能够比机会更好地管理,当然......?请思考; - )
# First conv layer with max pooling
# (x is in the input CIFAR data, (n,32,32,3)
normx=tf.nn.lrn(x)
w1=tf.Variable(tf.truncated_normal((5,5,3,depth1),stddev=0.05))
b1=tf.Variable(tf.zeros([depth1]))
act1_=tf.nn.relu(tf.nn.conv2d(normx,w1,[1,1,1,1],padding='VALID')+b1)
act1=tf.nn.max_pool(act1_,[1,3,3,1],[1,2,2,1],padding='VALID')
# Second conv layer with max pooling
w2=tf.Variable(tf.truncated_normal((5,5,depth1,depth2),stddev=0.05))
b2=tf.Variable(tf.zeros([depth2]))
act2_=tf.nn.relu(tf.nn.conv2d(act1,w2,[1,1,1,1],padding='VALID')+b2)
act2=tf.nn.max_pool(act2_,[1,3,3,1],[1,2,2,1],padding='VALID')
# fully connected
d=np.prod(act2.get_shape()[1:].as_list())
wfull=tf.Variable(tf.truncated_normal((d,nhidden),stddev=0.05))
bfull=tf.Variable(tf.zeros([nhidden]))
reshaped=tf.reshape(act2,(-1,d))
actfull=tf.nn.dropout(tf.nn.relu(tf.matmul(reshaped,wfull)+bfull),0.6)
# Output
wout=tf.Variable(tf.truncated_normal((nhidden,nclasses),stddev=0.05))
bout=tf.Variable(tf.zeros([nclasses]))
logits=tf.matmul(actfull,wout)+bout
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits))
opt=tf.train.AdagradOptimizer(0.2).minimize(loss)