我目前正在尝试在TensorFlow中为Cifar10数据集开发CNN。
到目前为止,我发现CNN的最佳设置为:
Conv1,补丁3x3,32输出
最大池2x2
Conv2,补丁3x3,32输出
最大合并2x2
Conv3,补丁3x3,64输出
最大合并2x2
平到阵列
完全连接1024输出
SOFTMAX
这是代码版本:
W_conv1 = weight_variable([3, 3, 3, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([3, 3, 32, 32])
b_conv2 = bias_variable([32])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_conv3 = weight_variable([3, 3, 32, 64])
b_conv3 = bias_variable([64])
h_conv3 = tf.nn.relu(conv2d(h_pool2, W_conv3) + b_conv3)
h_pool3 = max_pool_2x2(h_conv3)
h_flat1 = tf.reshape(h_pool3, [-1, 4 * 4 * 64])
W_fc1 = weight_variable([4 * 4 * 64, 1024])
b_fc1 = bias_variable([1024])
h_fc1 = tf.nn.relu(tf.matmul(h_flat1, W_fc1) + b_fc1)
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
h_fc2 = tf.matmul(h_fc1, W_fc2) + b_fc2
我使用RMSProp来最小化交叉熵,学习率为1e-4,批量大小为128,500个时期。我还通过减去平均值来对图像进行归一化,并在每个时期对数据进行洗牌
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
train_step = tf.train.RMSPropOptimizer(1e-4).minimize(cross_entropy)
sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
sess.run(tf.global_variables_initializer())
i=0
j=0
offset=128
loop=int(50000/offset)
for k in range(500):
i=0
j=0
datatotal,datalabel=unison_shuffled_copies(datatotal,datalabel)
for j in range(loop):
batch_xs = datatotal[i:i+offset]
batch_ys = datalabel[i:i+offset]
i=i+offset
train_step.run(feed_dict={x: batch_xs, y_: batch_ys})
print(k,"test accuracy %g"%accuracy.eval(feed_dict={x: testdata, y_: testlabels}))
我尝试了许多不同的优化器(adam,adadelta,SGD,RMS),并尝试添加或删除各种层,包括FC,dropout和convolutional。
我最好的结果之一就是之前的设置,在大约20世纪时,测试数据的准确度达到了42%。
我甚至尝试在本网站上实现完全相同的网络:http://nghiaho.com/?p=1913,但没有相同的结果。 还尝试从其他网站实施其他网络,但效果也很差。
如何改善我的成绩?
编辑:将最大合并更改为平均合并,在第25个时期获得55%的准确率。更好,但不太正确。