Coursera_機器學習_week4&5_神經網絡

神經網絡的表示

52nlp的筆記
52nlp的筆記2

對於有大量特徵的分類問題,除了邏輯迴歸,還可以選擇神經網絡算法,它對於複雜的假設空間和複雜的非線性問題有很好的學習能力。

Model representation 模型

用Logistic unit來模擬大腦中的神經元
這裏寫圖片描述
其中x0 爲偏置單元(bias unit),hθ(x) 稱爲激活函數(activation function),一般採取的形式爲

g(z)=11+ez

e.g.一個三層的神經網絡
這裏寫圖片描述
第一層稱爲輸入層,第二層是隱藏層,第三層是輸出層,其中
aji = j層第i個單元的激活函數
Θj = 從第j層映射到第j+1層的控制函數的權重矩陣
這裏寫圖片描述
如果神經網絡在第j層有sj個單元,在第j+1層有sj+1個單元,那麼權重矩陣Θ(j)的緯度是sj+1×(sj+1)

Note
1)任何的布爾函數都可以由兩層單元的網絡準確表示,但是所需的隱藏層神經元的數量隨網絡輸入數量呈指數級增長;
2)任意連續函數都可由一個兩層的網絡以任意精度逼近。這裏的兩層網絡是指隱藏層使用sigmoid單元、輸出層使用非閾值的線性單元;
3)任意函數都可由一個三層的網絡以任意精度逼近。其兩層隱藏層使用sigmoid單元、輸出層使用非閾值的線性單元。

Cost function(代價函數)

如果是一個二類分類(Binary classification),那麼y = 0 或1,在神經網絡的輸出層上只有一個輸出單元;如果是一個多類分類(Multi-class classification), 那麼在神經網絡的輸出層上有K個輸出單元。代價函數表述爲
這裏寫圖片描述

Backpropagation algorithm(BP算法/反向傳播算法)

其實就是鏈式法則求導
這裏寫圖片描述

Gradient checking(梯度下降算法的驗證)

在實現過程中,可以用改點的近似斜率來驗證梯度下降算法計算結果的正確性,在真正的算法訓練階段注意關閉驗證

Random initialization(隨機初始化)

如果神經網絡的參數全部初始化爲0,那麼會導致同一層的各個單元參數相同,無法訓練出可以輸出多個分類結果的網絡了,這個問題也成爲對稱的權重問題,需要通過對參數隨機初始化來化解,通常可以在[-u,+u]區間隨機取值。

編程練習

課程提供了數據集.mat格式的文件5000*400,是手寫數字
20*20灰度圖像 5000個樣本 灰度用浮點表示
數據集的第二部分是維度5000的y向量
0 被標記爲10 1~9標記1~9
直接用load命令就可以導入octave/matlab
隨機選擇100行畫圖

    load('ex3data1.mat');
m = size(X,1);
rand_indices = randperm(m);
sel = X(rand_indices(1:100),:);
displayData(sel);

以下是display函數定義:

function [h, display_array] = displayData(X, example_width)
if ~exist('example_width', 'var') || isempty(example_width) 
    example_width = round(sqrt(size(X, 2)));
colormap(gray);%返回線性灰度色圖
example_width = round(sqrt(size(X, 2)));%計算圖片像素矩陣寬
[m n] = size(X);
example_height = (n / example_width);%計算圖片像素矩陣高
display_rows = floor(sqrt(m));%樣本個數開根號向下取整
display_cols = ceil(m / display_rows);%向上取整
pad = 1;% 圖片之間的空隙
display_array = - ones(pad + display_rows * (example_height + pad), ...
                       pad + display_cols * (example_width + pad));
%ones 產生全1數組,這裏產生全-1數組 在灰度圖像裏面相當於黑布
curr_ex = 1;
for j = 1:display_rows
    for i = 1:display_cols
        if curr_ex > m, 
            break; 
        end
        max_val = max(abs(X(curr_ex, :)));%記錄一張圖的像素值最大值,用來歸一化
        display_array(pad + (j - 1) * (example_height + pad) + (1:example_height), ...
                      pad + (i - 1) * (example_width + pad) + (1:example_width)) = ...
                        reshape(X(curr_ex, :), example_height, example_width) / max_val;
        % 把x的像素值歸一化,向量變矩陣後,複製給disaplay_array
        curr_ex = curr_ex + 1;
    end
    if curr_ex > m, 
        break; 
    end
end
% 畫圖
h = imagesc(display_array, [-1 1]);
axis image off
drawnow; % 可以理解爲把當前需要畫的東西都畫到屏幕上。一般用於循環內,顯示動畫效果
end

接下來完成多分類的邏輯迴歸問題
回憶一下正規化以後的代價函數
這裏寫圖片描述
這裏需要自己完成,主函數調用代碼爲

lambda = 0.1 正規化參數
[all_theta] = oneVsAll(X, y, num_labels, lambda);

這裏oneVsAll函數是需要自己定義的,輸入的參數num_labels表示標籤的個數,也就是邏輯迴歸分類器的個數,這裏返回的矩陣all_theta的第i行表示對標籤i的分類
代碼如下:

function [all_theta] = oneVsAll(X, y, num_labels, lambda)
m = size(X, 1);%x的行數,樣本個數
n = size(X, 2);%x的列數,特徵個數
all_theta = zeros(num_labels, n + 1);返回num_labels個代價函數的參數
X = [ones(m, 1) X];% 增加x0
%使用fmincg來最優化代價函數
 initial_theta = zeros(n + 1, 1);
 options = optimset('GradObj', 'on', 'MaxIter', 50);
for c = 1: num labels
theta = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options);
 all_theta(c,:) = theta';
 %這裏樣本數據裏面的y是根據1~9對應的1~9 ,0對應的10 
 % 所以y==c 就是把y的取值 從1~10 直接抹成 1或者 0 
end
end

其中lrCostFunction的定義和之前的一樣


q1:根據max函數用法推斷
theta = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options);
這麼寫就只返回theta
[theta,cost]= fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta
這麼寫就返回兩個值
q2:第二句我一開始寫的
all_theta(c,:) = fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), initial_theta, options); submit的時候也沒有報錯
在command line實驗了一下確實不會出錯
猜測是默認會進行一下轉置
q3:theta(:)把矩陣變成一列 這個功能沒有用上啊? 爲什麼要出現在hint裏面?


接下來進行使用多分類邏輯迴歸函數進行預測
說明不需要使用循環,提示使用max函數,代碼如下:

function p = predictOneVsAll(all_theta, X)
m = size(X, 1);
num_labels = size(all_theta, 1);
p = zeros(size(X, 1), 1);
c = zeros(size(X, 1), 1);
X = [ones(m, 1) X];
[c,p] = max(sigmoid(X*all_theta'),[],2);%得到每一行最大值的行號和列號

接下來使用已經訓練好的參數,用神經網絡進行預測
這個神經網絡有3層,隱藏層有25個單元
所以Theta1是25×401,Theta2是10×26
在計算a(2) 的時候記得給x(i) 加上x0
求出的應該是hθ(x) k個元素中的最大值的下標
代碼如下:

a1 = [ones(m, 1) X];
a2 = sigmoid(Theta1*a1');
a2  = [ones(1,m);a2];
a3= (sigmoid(Theta2*a2))';
[c, p] = max(a3,[],2);

另一個版本:

a1 = X; %5*400
a1 = [ones(size(X,1), 1),X]; 
a2 = sigmoid(a1*Theta1');
a2 = [ones(size(a2,1),1),a2]; 
a3 = sigmoid(a2*Theta2');
[tmp,p] = max(a3,[],2);

q1:matlab計算矩陣轉置 計算複雜度和消耗大嗎?
我的電腦貌似連ex3的display都帶不動

octave 函數

colormap功能簡介
設定和獲取當前的色圖。
使用方法
色圖是一個m*3的實數矩陣,實數的大小在0到1.0之間,每一行是定義一種顏色的一個RGB向量。顏色圖的第k行定義第k種顏色,其中 map(k,:)=[r(k) g(k) b(k)]定義爲紅、綠、藍亮度。 Matlab中文論壇
1.colormap(map)
設置顏色圖爲矩陣map。如果map中的任何值在區間[0,1]之外,MATLAB返回錯誤:Colormap must have values in [0,1]。
2.colormap(‘default’)
將當前的顏色圖設置爲默認的顏色圖。
3.cmap=colormap
返回當前的顏色圖。返回的值都在區間[0,1]內。
指定色圖
在color目錄中的M文件產生多種色圖。每一個M文件將顏色圖的大小作爲一個變量。例如:
colormap(hsv(128))
創建一個hsv顏色圖,具有128種顏色。如果用戶不指定大小,MATLAB創建與當前色圖大小相同的色圖。
支持的色圖
下面將舉例描述MATLAB內建的色圖。用戶除了可以編程指定MATLAB內建的色圖,還可以使用Plot Tools圖形用具界面的Figure Properties面板中的Colormap菜單來選擇一種色圖。

.autumn 從紅色平滑變化到橙色,然後到黃色;
.bone 具有較高的藍色成分的灰度色圖。該色圖用於對灰度圖添加電子的視圖。
.colorcube 儘可能多地包含在RGB顏色空間中的正常空間的顏色,試圖提供更多級別的灰色、純紅色、純綠色和純藍色。 《Simulink與信號處理》
.cool 包含青綠色和品紅色的陰影色。從青綠色平滑變化到品紅色。
.copper 從黑色平滑過渡到亮銅色。
.flag 包含紅色、白色、綠色和黑色。
.gray 返回線性灰度色圖。
.hot 從黑色平滑過度到紅色、橙色和黃色的背景色,然後到白色。 book.iLoveMatlab.cn
.hsv 從紅色,變化到黃色、綠色、青綠色、品紅色,返回到紅色。
.jet 從藍色到紅色,中間經過青綠色、黃色和橙色。
.line 產生由座標軸的ColorOrder屬性產生的顏色以及灰色的背景色的色圖。 .pink 柔和的桃紅色。
.prism 重複這六種顏色:紅色、橙色、黃色、綠色、藍色和紫色。
.spring 包含品紅色和黃色的陰影顏色。
.summer 包含綠色和黃色的陰影顏色。
.white 全白的單色色圖。 Matlab中文論壇
.winter 包含藍色和綠色的陰影色。

drawnow 功能簡介
在matlab的help中可以看到,flush pending graphics events, 這就是說,將還未處理完的圖像實時的顯示出來,可以理解爲立即執行的plot,變化的plot。當代碼執行時間長,需要反覆執行plot時,Matlab程序不會馬上把圖像畫到figure上,這時,要想實時看到圖像的每一步變化情況,需要使用這個語句。

MAX函數
當A是一個列向量時候,返回一個最大值,在此不在贅述。

當Amxn是一個矩陣的時候,有以下幾種情況:

① C = max(max(A)),返回矩陣最大值

② D = max(A,[],1),每一列的最值,得到行向量

③ E = max(A,[],2),每一行的最值,得到列向量
* [U V] = max(A,[],2),返回兩個列向量,行最大元素本身與列號*
etc

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章