我尝试使用深度学习技术构建一个分类器,并使用了CIFAR-10数据集来构建这个分类器。我尝试构建了一个具有1024个隐藏节点的分类器。每张图片的尺寸为32*32*3(R-G-B)。由于我的计算机处理能力有限,我只从数据集的5个文件中加载了3个文件的数据。
from __future__ import print_functionimport matplotlib.pyplot as pltimport numpy as npimport tensorflow as tfimport osimport sysimport tarfileimport randomfrom IPython.display import display, Imagefrom scipy import ndimagefrom sklearn.linear_model import LogisticRegressionfrom six.moves.urllib.request import urlretrievefrom six.moves import cPickle as picklefrom sklearn.preprocessing import MultiLabelBinarizerfolder='/home/cifar-10-batches-py/'training_data=np.ndarray((30000,3072),dtype=np.float32)training_labels=np.ndarray(30000,dtype=np.int32)testing_data=np.ndarray((10000,3072),dtype=np.float32)testing_labels=np.ndarray(10000,dtype=np.int32)no_of_files=3begin=0end=10000for i in range(no_of_files): with open(folder+"data_batch_"+str(i+1),'rb') as f: s=pickle.load(f,encoding='bytes') training_data[begin:end]=s[b'data'] training_labels[begin:end]=s[b'labels'] begin=begin+10000 end=end+10000test_path='/home/cifar-10-batches-py/test_batch'with open(test_path,'rb') as d: s9=pickle.load(d,encoding='bytes') tdata=s9[b'data'] testing_data=tdata tlabels=s9[b'labels'] testing_labels=tlabelstest_data=np.ndarray((5000,3072),dtype=np.float32)test_labels=np.ndarray(5000,dtype=np.int32)valid_data=np.ndarray((5000,3072),dtype=np.float32)valid_labels=np.ndarray(5000,dtype=np.int32)valid_data[:,:]=testing_data[:5000, :]valid_labels[:]=testing_labels[:5000]test_data[:,:]=testing_data[5000:, :]test_labels[:]=testing_labels[5000:]onehot_training_labels=np.eye(10)[training_labels.astype(int)]onehot_test_labels=np.eye(10)[test_labels.astype(int)]onehot_valid_labels=np.eye(10)[valid_labels.astype(int)]image_size=32num_labels=10train_subset = 10000def accuracy(predictions, labels): return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1)) / predictions.shape[0])batch_size = 128relu_count = 1024 #hidden nodes countgraph = tf.Graph()with graph.as_default(): tf_train_dataset = tf.placeholder(tf.float32, shape=(batch_size, image_size * image_size*3)) tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels)) tf_valid_dataset = tf.constant(valid_data) tf_test_dataset = tf.constant(test_data) beta_regul = tf.placeholder(tf.float32) weights1 = tf.Variable( tf.truncated_normal([image_size * image_size*3, relu_count])) biases1 = tf.Variable(tf.zeros([relu_count])) weights2 = tf.Variable( tf.truncated_normal([relu_count, num_labels])) biases2 = tf.Variable(tf.zeros([num_labels])) preds = tf.matmul( tf.nn.relu(tf.matmul(tf_train_dataset, weights1) + biases1), weights2) + biases2 loss = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits=preds, labels=tf_train_labels))+ \ beta_regul * (tf.nn.l2_loss(weights1) + tf.nn.l2_loss(weights2)) optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss) train_prediction = tf.nn.softmax(preds) lay1_valid = tf.nn.relu(tf.matmul(tf_valid_dataset, weights1) + biases1) valid_prediction = tf.nn.softmax(tf.matmul(lay1_valid, weights2) + biases2) lay1_test = tf.nn.relu(tf.matmul(tf_test_dataset, weights1) + biases1) test_prediction = tf.nn.softmax(tf.matmul(lay1_test, weights2) + biases2)num_steps = 5000with tf.Session(graph=graph) as session: tf.initialize_all_variables().run() print("Initialized") for step in range(num_steps): offset = (step * batch_size) % (onehot_training_labels.shape[0] - batch_size) batch_data = training_data[offset:(offset + batch_size), :] batch_labels = onehot_training_labels[offset:(offset + batch_size), :] feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels,beta_regul : 1e-3} _, l, predictions = session.run( [optimizer, loss, train_prediction], feed_dict=feed_dict) if (step % 500 == 0): print("Minibatch loss at step %d: %f" % (step, l)) print("Minibatch accuracy: %.1f%%" % accuracy(predictions, batch_labels)) print("Validation accuracy: %.1f%%" % accuracy( valid_prediction.eval(), onehot_valid_labels)) print("Test accuracy: %.1f%%" % accuracy(test_prediction.eval(), onehot_test_labels))
这段代码的输出结果是:
WARNING:tensorflow:From /usr/local/lib/python3.5/dist-packages/tensorflow/python/util/tf_should_use.py:170: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.Instructions for updating:Use `tf.global_variables_initializer` instead.InitializedMinibatch loss at step 0: 117783.914062Minibatch accuracy: 14.8%Validation accuracy: 10.2%Minibatch loss at step 500: 3632989892247552.000000Minibatch accuracy: 12.5%Validation accuracy: 10.1%Minibatch loss at step 1000: 2203224941527040.000000Minibatch accuracy: 6.2%Validation accuracy: 9.9%Minibatch loss at step 1500: 1336172110413824.000000Minibatch accuracy: 10.9%Validation accuracy: 9.8%Minibatch loss at step 2000: 810328996708352.000000Minibatch accuracy: 8.6%Validation accuracy: 10.1%Minibatch loss at step 2500: 491423044468736.000000Minibatch accuracy: 9.4%Validation accuracy: 10.1%Minibatch loss at step 3000: 298025566076928.000000Minibatch accuracy: 12.5%Validation accuracy: 9.8%Minibatch loss at step 3500: 180741635833856.000000Minibatch accuracy: 10.9%Validation accuracy: 9.8%Minibatch loss at step 4000: 109611013111808.000000Minibatch accuracy: 15.6%Validation accuracy: 10.1%Minibatch loss at step 4500: 66473376612352.000000Minibatch accuracy: 3.9%Validation accuracy: 9.9%Test accuracy: 10.2%
我的代码哪里出错了?我看到准确率非常低。
回答:
-
据我所见,你使用Tensorflow构建了一个简单的两层前馈神经网络。虽然这可以接受,但你不会得到很高的准确率。但是如果你想尝试,你需要仔细调整超参数——学习率、正则化强度、衰减率、隐藏层中的神经元数量。
-
你没有使用所有数据,这肯定会降低预测的质量。虽然它仍然可以工作,但你应该检查训练集、验证集和测试集中的类别分布。有可能某些类别在其中一个数据集中值太少。你至少需要对你的选择进行分层抽样。
-
你确定你对深度学习有深入的理解吗?尝试参加cs231n课程可能是个好主意。