基於神經網路的二分類問題

2021-08-13 02:41:16 字數 3501 閱讀 8123

在之前的文章中,介紹了神經網路的概念和演算法思想,甚至給出了公式推導。但依然沒有掌握神經網路的精髓,於是打算進一步學習就在網上**了吳恩達大佬的《神經網路和深度學習》這門課程,覺得收穫很大。目前只學習了單個神經元的原理及應用,下面簡單總結一下。

1. 損失函式的定義

與之前介紹的單個神經元的工作原理不同之處在於損失函式的定義,這裡把損失函式定義為:

推導思路:利用最大似然估計。先表達出p(y|x),然後求其最大值。大致推導過程如下:

課程中另乙個重點是「消除for迴圈」,也就是說用向量來代替顯示的for迴圈,這樣做的好處是提高計算效率。實驗測試100萬條測試資料,向量化要比迴圈快上300倍。因此在以後的編碼中,盡量把資料初始化成乙個矩陣來處理。在這裡值得注意的是,構造的矩陣應該每一列表示乙個測試樣例。

2. **實現

下面給出基於神經網路的二分類**(python):

import numpy as np

import h5py

import math

def load_dataset():

train_dataset = h5py.file('datasets/train_catvnoncat.h5', "r")

train_set_x_orig = np.array(train_dataset["train_set_x"][:]) # your train set features

train_set_y_orig = np.array(train_dataset["train_set_y"][:]) # your train set labels

test_dataset = h5py.file('datasets/test_catvnoncat.h5', "r")

test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # your test set features

test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # your test set labels

classes = np.array(test_dataset["list_classes"][:]) # the list of classes

train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))

test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))

return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes

def train_model(learning_rate=0.1):

train_data_x, train_data_y, test_data_x, test_data_y, classes = load_dataset() # 獲取資料集

train_data_x = train_data_x.reshape(209, 64*64*3).t # 把訓練資料構造成二維矩陣,行數為x的維度,列值為訓練樣本的個數

row_count = 64*64*3 # 表示乙個樣例的維度

examples_count = 209 # 表示樣例的數量

weight = np.zeros((64*64*3, 1)) # 初始化權值向量為0

b = 0 # 初始化閾值為0

dw = 0

db = 0

for i in range(1000):

z = np.dot(weight.t, train_data_x) + b # 計算z

y_hat = 1.0 / (1 + math.e**(-z)) # 計算**值

result = np.sum(abs(y_hat - train_data_y )) # 以累加y_hat-y的值來表示**效果,result越小越好

if result == 0:

break

print '%d:%d' %(i, result)

dz = y_hat - train_data_y # 計算dl/dz

dw = np.dot(train_data_x, dz.t) # 計算dl/dw

db = np.sum(dz)

dw = dw * 1.0 / examples_count

db = db * 1.0 / examples_count

weight = weight - learning_rate * dw

b = b - learning_rate * db

return weight, b

def predict_data(weight, b):

train_data_x, train_data_y, test_data_x, test_data_y, classes = load_dataset() # 獲取資料集

row_count = 64 * 64 * 3 # 乙個樣例的維度

example_count = 50 # 測試樣例個數

test_data_x = test_data_x.reshape(example_count, row_count).t # 轉換成對應格式的矩陣

z = np.dot(weight.t, test_data_x) + b

predict_y = 1.0 / (1 + math.e**(-z)) # 計算**值

print 'correct rate:',np.sum(predict_y == test_data_y)* 1.0 / example_count

print predict_y

if __name__ == '__main__':

train_data_x, train_data_y, test_data_x, test_data_y, classes = load_dataset() # 獲取資料集

weight, b = train_model(learning_rate = 0.1) # 訓練引數

predict_data(weight, b) # 根據訓練的引數進行**

這裡有一點需要注意,在構造矩陣的時候"test_data_x = test_data_x.reshape(example_count, row_count).t"並不等價於"test_data_x = test_data_x.reshape(row_count,example_count)",如果直接用第二個語句,則會打亂原來每個樣例的資料,構造的矩陣毫無實際意義。

在該測試樣例中,訓練時大概需要迭代600多次即可收斂,最後**的準確率約為:72%。

神經網路解決二分類問題

import tensorflow as tf from numpy.random import randomstate batch size 8 w1 tf.variable tf.random normal 2,3 stddev 1,seed 1 w2 tf.variable tf.random...

tensorflow 神經網路解決二分類問題

import tensorflow as tf from numpy.random import randomstate 定義訓練資料batch大小 batch size 8 定義神經網路的引數 w1 tf.variable tf.random normal 2,3 stddev 1,seed 1 ...

神經網路 非線性問題的處理 二分類

以前我們涉及的都是線性問題 現在我們涉及的是非線性問題 什麼是非線性問題?計算結果是一條直線的問題叫做線性問題,要麼遞增,要麼遞減 而非線性問題不會走這種極端,它是有乙個過程的變化 以三好學生的評選規則來引入非線性問題 1.學校還是要評選三好學生,學校已經頒布了三好學生的評選結果,所有家長已經知道了...