神经网络入门——16实现一个反向传播
Posted 一起来看流星雨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神经网络入门——16实现一个反向传播相关的知识,希望对你有一定的参考价值。
反向传播练习
现在你来实现一个通过反向传播训练的神经网络,数据集就是之前的研究生院录取数据。通过前面所学你现在有能力完成这个练习:
你的目标是:
- 实现一个正向传播
- 实现反向传播算法
- 更新权重
import numpy as np from data_prep import features, targets, features_test, targets_test np.random.seed(21) def sigmoid(x): """ Calculate sigmoid """ return 1 / (1 + np.exp(-x)) # Hyperparameters n_hidden = 2 # number of hidden units epochs = 900 learnrate = 0.005 n_records, n_features = features.shape last_loss = None # Initialize weights weights_input_hidden = np.random.normal(scale=1 / n_features ** .5, size=(n_features, n_hidden)) weights_hidden_output = np.random.normal(scale=1 / n_features ** .5, size=n_hidden) for e in range(epochs): del_w_input_hidden = np.zeros(weights_input_hidden.shape) del_w_hidden_output = np.zeros(weights_hidden_output.shape) for x, y in zip(features.values, targets): ## Forward pass ## # TODO: Calculate the output hidden_input = np.dot(x, weights_input_hidden) hidden_output = sigmoid(hidden_input) output = sigmoid(np.dot(hidden_output, weights_hidden_output)) ## Backward pass ## # TODO: Calculate the network\'s prediction error error = y - output # TODO: Calculate error term for the output unit output_error_term = error * output * (1 - output) ## propagate errors to hidden layer # TODO: Calculate the hidden layer\'s contribution to the error hidden_error = np.dot(output_error_term, weights_hidden_output) # TODO: Calculate the error term for the hidden layer hidden_error_term = hidden_error * hidden_output * (1 - hidden_output) # TODO: Update the change in weights del_w_hidden_output += output_error_term * hidden_output del_w_input_hidden += hidden_error_term * x[:, None] # TODO: Update weights weights_input_hidden += learnrate * del_w_input_hidden / n_records weights_hidden_output += learnrate * del_w_hidden_output / n_records # Printing out the mean square error on the training set if e % (epochs / 10) == 0: hidden_output = sigmoid(np.dot(x, weights_input_hidden)) out = sigmoid(np.dot(hidden_output, weights_hidden_output)) loss = np.mean((out - targets) ** 2) if last_loss and last_loss < loss: print("Train loss: ", loss, " WARNING - Loss Increasing") else: print("Train loss: ", loss) last_loss = loss # Calculate accuracy on test data hidden = sigmoid(np.dot(features_test, weights_input_hidden)) out = sigmoid(np.dot(hidden, weights_hidden_output)) predictions = out > 0.5 accuracy = np.mean(predictions == targets_test) print("Prediction accuracy: {:.3f}".format(accuracy))
import numpy as np import pandas as pd admissions = pd.read_csv(\'binary.csv\') # Make dummy variables for rank data = pd.concat([admissions, pd.get_dummies(admissions[\'rank\'], prefix=\'rank\')], axis=1) data = data.drop(\'rank\', axis=1) # Standarize features for field in [\'gre\', \'gpa\']: mean, std = data[field].mean(), data[field].std() data.loc[:,field] = (data[field]-mean)/std # Split off random 10% of the data for testing np.random.seed(21) sample = np.random.choice(data.index, size=int(len(data)*0.9), replace=False) data, test_data = data.ix[sample], data.drop(sample) # Split into features and targets features, targets = data.drop(\'admit\', axis=1), data[\'admit\'] features_test, targets_test = test_data.drop(\'admit\', axis=1), test_data[\'admit\']
admit,gre,gpa,rank 0,380,3.61,3 1,660,3.67,3 1,800,4,1 1,640,3.19,4 0,520,2.93,4 1,760,3,2 1,560,2.98,1 0,400,3.08,2 1,540,3.39,3 0,700,3.92,2 0,800,4,4 0,440,3.22,1 1,760,4,1 0,700,3.08,2 1,700,4,1 0,480,3.44,3 0,780,3.87,4 0,360,2.56,3 0,800,3.75,2 1,540,3.81,1 0,500,3.17,3 1,660,3.63,2 0,600,2.82,4 0,680,3.19,4 1,760,3.35,2 1,800,3.66,1 1,620,3.61,1 1,520,3.74,4 1,780,3.22,2 0,520,3.29,1 0,540,3.78,4 0,760,3.35,3 0,600,3.4,3 1,800,4,3 0,360,3.14,1 0,400,3.05,2 0,580,3.25,1 0,520,2.9,3 1,500,3.13,2 1,520,2.68,3 0,560,2.42,2 1,580,3.32,2 1,600,3.15,2 0,500,3.31,3 0,700,2.94,2 1,460,3.45,3 1,580,3.46,2 0,500,2.97,4 0,440,2.48,4 0,400,3.35,3 0,640,3.86,3 0,440,3.13,4 0,740,3.37,4 1,680,3.27,2 0,660,3.34,3 1,740,4,3 0,560,3.19,3 0,380,2.94,3 0,400,3.65,2 0,600,2.82,4 1,620,3.18,2 0,560,3.32,4 0,640,3.67,3 1,680,3.85,3 0,580,4,3 0,600,3.59,2 0,740,3.62,4 0,620,3.3,1 0,580,3.69,1 0,800,3.73,1 0,640,4,3 0,300,2.92,4 0,480,3.39,4 0,580,4,2 0,720,3.45,4 0,720,4,3 0,560,3.36,3 1,800,4,3 0,540,3.12,1 1,620,4,1 0,700,2.9,4 0,620,3.07,2 0,500,2.71,2 0,380,2.91,4 1,500,3.6,3 0,520,2.98,2 0,600,3.32,2 0,600,3.48,2 0,700,3.28,1 1,660,4,2 0,700,3.83,2 1,720,3.64,1 0,800,3.9,2 0,580,2.93,2 1,660,3.44,2 0,660,3.33,2 0,640,3.52,4 0,480,3.57,2 0,700,2.88,2 0,400,3.31,3 0,340,3.15,3 0,580,3.57,3 0,380,3.33,4 0,540,3.94,3 1,660,3.95,2 1,740,2.97,2 1,700,3.56,1 0,480,3.13,2 0,400,2.93,3 0,480,3.45,2 0,680,3.08,4 0,420,3.41,4 0,360,3,3 0,600,3.22,1 0,720,3.84,3 0,620,3.99,3 1,440,3.45,2 0,700,3.72,2 1,800,3.7,1 0,340,2.92,3 1,520,3.74,2 1,480,2.67,2 0,520,2.85,3 0,500,2.98,3 0,720,3.88,3 0,540,3.38,4 1,600,3.54,1 0,740,3.74,4 0,540,3.19,2 0,460,3.15,4 1,620,3.17,2 0,640,2.79,2 0,580,3.4,2 0,500,3.08,3 0,560,2.95,2 0,500,3.57,3 0,560,3.33,4 0,700,4,3 0,620,3.4,2 1,600,3.58,1 0,640,3.93,2 1,700,3.52,4 0,620,3.94,4 0,580,3.4,3 0,580,3.4,4 0,380,3.43,3 0,480,3.4,2 0,560,2.71,3 1,480,2.91,1 0,740,3.31,1 1,800,3.74,1 0,400,3.38,2 1,640,3.94,2 0,580,3.46,3 0,620,3.69,3 1,580,2.86,4 0,560,2.52,2 1,480,3.58,1 0,660,3.49,2 0,700,3.82,3 0,600,3.13,2 0,640,3.5,2 1,700,3.56,2 0,520,2.73,2 0,580,3.3,2 0,700,4,1 0,440,3.24,4 0,720,3.77,3 0,500,4,3 0,600,3.62,3 0,400,3.51,3 0,540,2.81,3 0,680,3.48,3 1,800,3.43,2 0,500,3.53,4 1,620,3.37,2 0,520,2.62,2 1,620,3.23,3 0,620,3.33,3 0,300,3.01,3 0,620,3.78,3 0,500,3.88,4 0,700,4,2 1,540,3.84,2 0,500,2.79,4 0,800,3.6,2 0,560,3.61,3 0,580,2.88,2 0,560,3.07,2 0,500,3.35,2 1,640,2.94,2 0,800,3.54,3 0,640,3.76,3 0,380,3.59,4 1,600,3.47,2 0,560,3.59,2 0,660,3.07,3 1,400,3.23,4 0,600,3.63,3 0,580,3.77,4 0,800,3.31,3 1,580,3.2,2 1,700,4,1 0,420,3.92,4 1,600,3.89,1 1,780,3.8,3 0,740,3.54,1 1,640,3.63,1 0,540,3.16,3 0,580,3.5,2 0,740,3.34,4 0,580,3.02,2 0,460,2.87,2 0,640,3.38,3 1,600,3.56,2 1,660,2.91,3 0,340,2.9,1 1,460,3.64,1 0,460,2.98,1 1,560,3.59,2 0,540,3.28,3 0,680,3.99,3 1,480,3.02,1 0,800,3.47,3 0,800,2.9,2 1,720,3.5,3 0,620,3.58,2 0,540,3.02,4 0,480,3.43,2 1,720,3.42,2 0,580,3.29,4 0,600,3.28,3 0,380,3.38,2 0,420,2.67,3 1,800,3.53,1 0,620,3.05,2 1,660,3.49,2 0,480,4,2 0,500,2.86,4 0,700,3.45,3 0,440,2.76,2 1,520,3.81,1 1,680,2.96,3 0,620,3.22,2 0,540,3.04,1 0,800,3.91,3 0,680,3.34,2 0,440,3.17,2 0,680,3.64,3 0,640,3.73,3 0,660,3.31,4 0,620,3.21,4 1,520,4,2 1,540,3.55,4 1,740,3.52,4 0,640,3.35,3 1,520,3.3,2 1,620,3.95,3 0,520,3.51,2 0,
以上是关于神经网络入门——16实现一个反向传播的主要内容,如果未能解决你的问题,请参考以下文章