声明:代码和数据集均来自网络,仅供自己学习。侵删。
上次学习了一般的神经网络。这次找个实际的操刀,学习一下。
数据库来源:
http://pjreddie.com/projects/mnist-in-csv/
我们可以从中获得我们想要的数据集和测试集
data_file = open("train_100.csv",'r')
data_list = data_file.readlines()
data_file.close()
一行一行来看,
open()
此函数能打开一个文件,“r”表示只读(read)
readline()
将文件中的所有行读入变量data_list.但是要注意,此函数会将所有文件读入到内存中,在文件内容过大的情况下,不宜使用。一次在一行上使用更有效率。
最后一行close()
函数关闭文件,让计算机释放用于保存文件的部分内存。
在使用python之前,千万要记得,装一些常用库。代码里也要用import导入。
scaled_input=(numpy.asfarray(all_values[1:])/255.0*0.99)+0.01
print(scaled_input)
我们知道颜色值的范围是[255,0],我们需要将此范围缩小到[0.01,1]的范围里,以上代码就是为了调整范围
由于手写数字一共有十个且防止输出为0或者1所以构建的目标矩阵为
onodes=10
target=numpy.zeros(onodes)+0.01
targets[int(all_values[0])]=0.99
最后我们可以写出完整的代码。
import numpy
class neuralNetwork:
def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate):
self.inodes=inputnodes
self.hnodes=hiddennodes
self.onodes=outputnodes
self.wih=numpy.random.normal(0.0,pow(self.hnodes,-0.5),(self.hnodes,slef.inodes))
self.who=numpy.random.normal(0.0,pow(self.onodes,-0.5),(self.onodes,slef.hnodes))
self.lr=learningrate
self.activation_function=lambda x:scipy.special.expit(x)
pass
def train(self, inputs_list, targets_list):
inputs = numpy.array(inputs_list, ndmin=2).T
targets = numpy.array(targets_list, ndmin=2).T
hidden_inputs = numpy.dot(self.wih, inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = numpy.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)\n",
output_errors = targets - final_outputs
hidden_errors = numpy.dot(self.who.T, output_errors)
self.who += self.lr * numpy.dot((output_errors * final_outputs * (1.0 - final_outputs)), numpy.transpose(hidden_outputs))
self.wih += self.lr * numpy.dot((hidden_errors * hidden_outputs * (1.0 - hidden_outputs)), numpy.transpose(inputs))
pass
def query(self, inputs_list):\n",
inputs = numpy.array(inputs_list, ndmin=2).T
hidden_inputs = numpy.dot(self.wih, inputs)\n",
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = numpy.dot(self.who, hidden_outputs)
final_outputs = self.activation_function(final_inputs)
return final_outputs"
input_nodes = 784
hidden_nodes = 200
output_nodes = 10
learning_rate = 0.1
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes, learning_rate)
training_data_file = open(\"mnist_dataset/mnist_train.csv\", 'r')
training_data_list = training_data_file.readlines()
training_data_file.close()
for record in training_data_list:
all_values = record.split(',')\n",
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
targets = numpy.zeros(output_nodes) + 0.01
targets[int(all_values[0])] = 0.99
n.train(inputs, targets)\n",
pass
test_data_file = open(\"mnist_dataset/mnist_test.csv\", 'r')
test_data_list = test_data_file.readlines()
test_data_file.close()
我们发现,通过简单的几行代码,就可以正确区分没有见过的图片。并且训练的个数其实还是很少的。
如果我们改进了网络,那么会提高么?
所以我们需要用一个分数去衡量网络的学习能力,我们称之为记分卡(scorecard)这个模块在每次测试每条数据后都会更新
for record in test_data_list:
all_values = record.split(',')
correct_label = int(all_values[0])
inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
outputs = n.query(inputs)
label = numpy.argmax(outputs)
if (label == correct_label):
scorecard.append(1)
else:
scorecard.append(0)
pass
然后我们需要计算正确率
scorecard_array = numpy.asarray(scorecard)
print (\"performance = \", scorecard_array.sum() / scorecard_array.size)
到这里,利用少量数据训练的工作就完成了。有精力的话,我们可以使用完整的数据来训练和测试。