1. 程式人生 > >Tensorflow 在損失函式中加入正則項(Normalization)

Tensorflow 在損失函式中加入正則項(Normalization)

L1和L2正則:

舉例說明,假設有一個數組 nums=[1,2,3,4]

L1 = a*(|1|+|2|+|3|+|4|)

L2 = a*(1^2+2^2+3^2+4^2)/2

其中a是係數,用於平衡正則項與經驗損失函式的權重關係,即:C = loss+a*Normalization。

這裡說明一下,利用L1經過訓練後,會讓權重得到稀疏結,即權重中的一部分項為0,這種作用相當於對原始資料進行了特徵選擇;利用L2進行訓練後,會讓權重更趨於0,但不會得到稀疏解,這樣做可以避免某些權重過大;兩種正則做法都可以減輕過擬合,使訓練結果更加具有魯棒性。

下面給出使用TensorFlow計算L1,L2的方法。

import tensorflow as tf
alpha = 0.5 #係數設定為0.5,alpha相當於上述a
val = tf.constant([[1,2],[3,4]],dtype=tf.float32)
l1 = tf.contrib.layers.l1_regularizer(alpha)(val)
l2 = tf.contrib.layers.l2_regularizer(alpha)(val)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print ("l1:",sess.run(l1))
    print ("l2:",sess.run(l2))

下面給出使用TensorFlow的整體訓練過程:
# -*- coding: utf-8 -*-
"""
Created on Sun Jun  4 21:51:33 2017

@author: Yangyang Deng
@Email: [email protected]
"""


import tensorflow as tf
from numpy.random import RandomState


w1 = tf.Variable(tf.truncated_normal([2,3],seed=1))
w2 = tf.Variable(tf.truncated_normal([3,1],seed=1))

x = tf.placeholder(dtype=tf.float32,shape=[None,2])
y_real = tf.placeholder(dtype=tf.float32,shape=[None,1])

a = tf.nn.relu(tf.matmul(x,w1))  #神經元的啟用函式為 relu
y_pre = tf.nn.relu(tf.matmul(a,w2))

sample_size = 20000 #訓練樣本總數
batch = 500 # 使用mini-batch(批梯度下降),每個batch的大小。

rds = RandomState(0)
X = rds.rand(sample_size,2)
Y = [[int(20*x1+30*x2)]+rds.rand(1) for (x1,x2) in X] #Y = 20*x1+30*x2+noise

global_step = tf.Variable(0)
#--------------學習速率的設定(學習速率呈指數下降)---------------------
learning_rate = tf.train.exponential_decay(1e-2,global_step,decay_steps=sample_size/batch,decay_rate=0.98,staircase=True)    
#-------------使用均方誤差(MSE)作為損失函式,在損失函式中加入L1正則項
MSE = tf.reduce_mean(tf.square(y_real-y_pre)+tf.contrib.layers.l1_regularizer(0.1)(w1)) 
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(MSE,global_step=global_step)

step = 20000 #訓練的總次數
start = 0
end = batch

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(step):
    sess.run(train_step,feed_dict={x:X[start:end],y_real:Y[start:end]})
    if not i%20:
        H = sess.run(MSE,feed_dict={x:X[start:end],y_real:Y[start:end]})
        lr = sess.run(learning_rate)
        l1 = sess.run(tf.contrib.layers.l1_regularizer(0.1)(w1))
        print ("MSE: ",H,"  learning_rate: ",lr," l1:",l1)
        if H<1e-1:  #採用stop early 的方法防止過擬合,節省訓練時間。
            break
    strat = end if end<sample_size else 0
    end = start+batch
y1 = sess.run(y_pre,feed_dict={x:X[start:end]})
y2 = Y[start:end]
sess.close()   

#訓練結果的部分展示
for i in range(100):
    print(y1[i],y2[i])




相關推薦

Tensorflow損失函式加入(Normalization)

L1和L2正則: 舉例說明,假設有一個數組 nums=[1,2,3,4] L1 = a*(|1|+|2|+|3|+|4|) L2 = a*(1^2+2^2+3^2+4^2)/2 其中a是係數,用於平衡正則項與經驗損失函式的權重關係,即:C = loss+a*Normaliz

神經網路損失函式L1和L2

轉自:https://blog.csdn.net/dcrmg/article/details/80229189 神經網路中損失函式後一般會加一個額外的正則項L1或L2,也成為L1範數和L2範數。正則項可以看做是損失函式的懲罰項,用來對損失函式中的係數做一些限制

79、tensorflow計算一個五層神經網路的損失係數、防止網路過擬合、化的思想就是在損失函式加入刻畫模型複雜程度的指標

''' Created on Apr 20, 2017 @author: P0079482 ''' import tensorflow as tf #獲取一層神經網路邊上的權重,並將這個權重的L2正

機器學習目標函式損失函式以及的通俗解釋

目錄: 前言: 1、什麼是目標函式? 定義是:指所關心的目標與相關的因素的函式關係。舉個例子,假如我們想要預測公司樓下手抓餅店明天能賣多少張手抓餅,已知過去10天每天賣多少,以及每天的天氣情況,是否有節假日,和手抓餅店老闆和老闆娘的感情狀況,

資料預處理歸一化(Normalization)與損失函式化(Regularization)解惑

背景:資料探勘/機器學習中的術語較多,而且我的知識有限。之前一直疑惑正則這個概念。所以寫了篇博文梳理下 摘要:   1.正則化(Regularization)     1.1 正則化的目的      1.2 結構風險最小化(SRM)理論     1.3 L1範數

機器學習演算法如何選取超引數 學習速率 係數 minibatch size

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

sql函式

SQL 中的正則函式 ORACLE中支援正則表示式的函式主要有下面四個: 1,REGEXP_LIKE :與LIKE的功能相似,比LIKE強大得多。 2,REGEXP_INSTR :與INSTR的功能相似。 3,REGEXP_SUBSTR :與SUBSTR的功能相似。 4,REGEXP_REPLA

Pythonre(表示式)常用函式總結

1  re.match       #嘗試從字串的開始匹配一個模式     re.match的函式原型為:re.match(pattern, string, flags)     第一個引數是正則表示式,這裡為"(\w+)\s",如果匹配成功,則返回一個Match,否則返

機器學習筆記之五——目標函式、經驗風險與結構風險、

一、常見的目標函式(loss/cost function)   二、經驗風險與結構風險    經驗風險 L(f) 就是以上損失函式,描述的是模型與訓練資料的契合程度。   結構風險Ω(f)對應於過擬合問題,用正則項解決過擬合是結構風險的課

TensorFlow 化(Batch Normalization)詳解和實現程式碼

        雖然在訓練初期使用 He 初始化方法初始ELU(或者其他派生的ReLU)能夠有效的防止梯度彌散、爆炸問題。但是這種方式無法保證梯度問題不會在訓練過程中產生。         2015年的一篇paper( “Batch Normalization: Accel

Oracle表示式(及函式)詳解

1、概述     相信大家對正則表示式都不陌生,從linux下的命令到Java等程式語言,正則表示式無處不在,雖然我們實際使用的時候也並不一定太多,但是當我們要處理字串時,它確實是一個強大的工具。     上一篇文章(Oracle中的字串型別及相關函式詳解)中,已

caffe如何列印/輸出總loss,包括loss和(待完成)

並沒有找到合適的方案,目前來看,需要修改原始碼,但是咋修改原始碼,還沒有搞定。並沒有找到合適的方案,目前來看,需要修改原始碼,但是咋修改原始碼,還沒有搞定。並沒有找到合適的方案,目前來看,需要修改原始碼

JS利用表示式交換函式的引數位置

某百科中看到一個例子,要用正則表示式將函式foo(a,b,c)中的引數位置換為foo(b,a,c),正好又在複習JS的過程中看到了正則表示式的部分,於是考慮用JS來實現這個功能。 函式的引數同例題中一樣通過 [^,]* 進行匹配,於是寫出正則式: /foo\

機器學習regularization化(加入weight_decay)的作用

Regularization in Linear Regression 轉載自:http://blog.sina.com.cn/s/blog_a18c98e5010115ta.html Regularization是Linear Regression中很重要的一步。

javascript使用表達式

表達 制表符 script java asc 重復 scrip a-z 出現 1.標準字符集和 \d:任意一個數字,0-9中的一個; \w:任意一個字母數字下劃線,即a-z, A-Z, 0-9,_中的一個; \s:空格,換行符,制表符等空白字符中的一個; .:小數點可以匹配

vim使用表達式

.html 函數表達式 定向 源文件 替換字符 標準 一覽 ati adc 一、使用正則表達式的命令 使用正則表達式的命令最常見的就是 / (搜索)命令。其格式例如以下: /正則表達式 還有一個非常實用的命令就是 :s(替換)

【js 表達式】記錄所有在js使用表達式的情況

表達式 字符 username 之前 replace rep 慢慢 字符串 pla 說實話,對正則表達式有些許的畏懼感,之前的每次只要碰到需要正則表達式去匹配的情況,都會刻意的躲過或者直接從度娘處獲取。 此時此刻,感覺到了某一個特定的點去觸及她。但筆者對於正則表達式使用上的

python表達式

spa cnblogs cep 字符0 輸出 正則表達式 pytho clas 匹配字符串 特殊字符 "."  : Matches any character except a newline. 匹配任何字符 除了換行符"^"  :匹配字符的開頭 1 import re

Python表達式-re模塊

最大的 語法 詳細 ict over emp 則表達式 regular mpi 有時候我們需要模糊查找我們需要的字符串等值,這個時候需要用到正則表達式。 正則表達式的使用,在python中需要引入re包 import re 1、首先了解下正則表達式的常用語

爬蟲——爬蟲使用表達式

txt文件 點擊 頁碼 range safari 頁面 gen odin ace 下面我們嘗試爬取內涵段子網站:http://www.neihan8.com/article/list_5_1.html 打開之後,當你進行翻頁的時候,不能註意到,url地址的變化: