|
按照《Python神经网络编程》一书中写的代码,用训练集训练完之后,用test数据集query时,输出的数组,最大值的位置总是和train集最后一个样本相同,不随输入的变化而变化
代码如下:
import numpy as np
import scipy.special as sig
import matplotlib.pyplot as plt
class neuralNetwork :
#initialse the neural network
def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate) :
#set number of nodes in each input,hidden,outpue layer
self.inodes = inputnodes
self.hnodes = hiddennodes
self.onodes = outputnodes
#set learningrate
self.lr = learningrate
#link weight matrices,w_ih and w_ho
# self.w_ih = np.random.rand(self.hnodes,self.inodes) - 0.5
# self.w_ho = np.random.rand(self.onodes,self.hnodes) - 0.5
self.w_ih = np.random.normal(0.0,pow(self.hnodes,-0.5),(self.hnodes,self.inodes))
self.w_ho = np.random.normal(0.0,pow(self.onodes,-0.5),(self.onodes,self.hnodes))
#activation function is the sigmoid function
self.activation_function = lambda x : sig.expit(x)
pass
#train the neural network
def train(self,input_list,target_list) :
#convert inputs list to 2d array
inputs = np.array(input_list,ndmin = 2).T
targets = np.array(target_list,ndmin = 2).T
hidden_inputs = np.dot(self.w_ih, inputs)
hidden_outputs = self.activation_function(hidden_inputs)
final_inputs = np.dot(self.w_ho,hidden_outputs)
final_outputs = self.activation_function(final_inputs)
output_errors = targets - final_outputs
hidden_errors = np.dot(self.w_ho.T,output_errors)
#update the weights for the links between the input and hidden layers
self.w_ho += self.lr * np.dot((output_errors * final_outputs * (1.0- final_outputs)) , np.transpose(hidden_outputs))
self.w_ih += self.lr * np.dot((hidden_errors * hidden_outputs * (1.0- hidden_outputs)) , np.transpose(inputs))
return self.w_ho,self.w_ih
pass
#query the neural nerwork
def query(self,test_data) :
# convert inputs list to 2d array
inputs_query = np.array(test_data,ndmin = 2).T
#calculate signals into hidden layer
hidden_inputs_query = np.dot(self.w_ih, inputs_query)
#calculate the signals emerging from hidden layer
hidden_outputs_query = self.activation_function(hidden_inputs_query)
#calculate signals into final output layer
final_inputs_query = np.dot(self.w_ho,hidden_outputs_query)
#calculate the signals emerging from final output layer
final_outputs_query = self.activation_function(final_inputs_query)
return final_outputs_query
pass
# number of input,hidden,output nodes and learningrate
input_nodes = 784
hidden_nodes = 100
output_nodes = 10
learning_rate = 0.2
#create instance of neural network
n = neuralNetwork(input_nodes,hidden_nodes,output_nodes,learning_rate)
train_data_file = open('E:\Python\minist_database\minist_data\mini_train_data_500_copy.csv','r')
train_data_list = train_data_file.readlines()
train_data_file.close
for record in train_data_list[1:4500] :
all_values = record.split(',')
#scale and shift the input
input_data = ((np.asfarray(all_values[1:])) / 255.0 * 0.99) + 0.01
#create the target output values (all 0.01,excepe the desired label which is 0.99)
target_data = np.zeros(output_nodes) + 0.01
#all_values[0] is the target label fot this record
target_data[int(all_values[0])] = 0.99 #这个位置将0.99赋值给那个位置就会输出那个位置
# target_data[5] = 0.99
n.train(input_data,target_data)
pass
test_data_file = open('E:\Python\minist_database\minist_data\mini_test_data_100.csv','r')
test_data_list = test_data_file.readlines()
test_data_file.close
all_values_test = test_data_list[380].split(',')
print(all_values_test[0])
image_array = np.asfarray(all_values_test[1:]).reshape((28,28))
plt.imshow(image_array,cmap = 'Greys',interpolation = 'None')
output_array = n.query((np.asfarray(all_values_test[1:]) / 255.0 * 0.99) + 0.01)
print('输出结果为:',output_array)
如下图所示,训练样本最后一个是8,则用测试样本检测时,不论测试样本是多少,只在output_array[8]这个位置输出最大值
|
|