找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1694|回复: 1

[求助] Python 手写字符识别输出的数组不随输入变化

1

主题

1

帖子

1

积分

贫民

积分
1
zangwen 发表于 2019-11-19 13:04:03 | 显示全部楼层 |阅读模式
按照《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]这个位置输出最大值




回复

使用道具 举报

0

主题

16

帖子

16

积分

贫民

积分
16
edo 发表于 2019-11-21 15:00:06 | 显示全部楼层

回帖奖励 +2 点威望

没训练好
train函数里面每个训练样本只训练了1步
最后一个训练样本learningrate是0.2
前一个的训练样本learningrate是0.2^2
以此类推
最开始的训练样本learningrate就可以忽略不计

解决办法是采用随机批量样本训练
直到某两次训练结束时的参数几乎不变时停止训练
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表