本文目錄一覽:
- 1、如何用神經網絡實現連續型變量的回歸預測?
- 2、計算機python的實現方式都有哪些?
- 3、python 常用的系統函數有哪些
- 4、如何利用python語言實現機器學習算法
- 5、python把一個字符串列表寫入txt文件,並保證每個字符串佔用一行且沒有其他符號(例如[]‘’空格)
- 6、怎樣用python構建一個卷積神經網絡模型
如何用神經網絡實現連續型變量的回歸預測?
神經網絡最開始是機器學習的一種模型,但其訓練的時間和其他幾種模型相比不佔優勢,且結果也不盡人意,所以一直沒有被廣泛使用。但隨着數學的深入研究以及計算機硬件質量的提高,尤其是GPU的出現,給深度學習的廣泛應用提供了基礎。GPU最初是為了給遊戲玩家帶來高質量的視覺體驗,由於其處理矩陣運算的能力特別優秀,也被用於深度學習中模型的訓練,以往數十天才能訓練好的模型在GPU上訓練幾天就可以訓練好,大大減少了深度學習的訓練時間,因而深度學習的應用越來越多。
神經網絡作為深度學習最主要的模型,人工神經網絡ANN是最基礎的神經網絡結構,其工作原理很像人類大腦中的神經。神經元是ANN的工作單元,每個神經元含有權重和偏置,神經元將上一層神經元傳遞過來的值通過權重和偏置的運算,得到新的結果,將該結果傳遞給下一層神經元,通過不斷的傳遞,最終獲得輸出結果。
要想用神經網絡實現連續型變量的回歸預測,需要將該N維變量的數據作為輸入,中間再設置隱藏層和每一層的神經元個數,至於隱藏層的層數則需要多次訓練才能得出較準確的層數。而最後輸出層的值和實際變量的值會有誤差,神經網絡會通過不斷地訓練,更改權重和偏置的值來使誤差儘可能的小,當誤差小到一定程度,該神經網絡的回歸預測就算成功了。
通常使用Python來搭建神經網絡,Python自帶深度學習的一些庫,在進行回歸預測時,我們只需用調用函數,設定幾個參數,如隱藏層層數和神經元個數等,剩下的就是等模型自行訓練,最終便能完成回歸預測,非常的方便。
計算機python的實現方式都有哪些?
雖然官方 Python 實現差不多得到最廣泛的歡迎,但也有一些其他實現對特定領域的用戶來說更具吸引力。
知名的實現包括:
CPython
這是最早出現並持續維護的 Python 實現,以 C 語言編寫。新的語言特性通常在此率先添加。
Jython
以 Java 語言編寫的 Python 實現。此實現可以作為 Java 應用的一個腳本語言,或者可以用來創建需要 Java 類庫支持的應用。想了解更多信息可訪問 Jython 網站。
Python for .NET
此實現實際上使用了 CPython 實現,但是屬於 .NET 託管應用並且可以引入 .NET 類庫。它的創造者是 Brian Lloyd。想了解詳情可訪問 Python for .NET 主頁。
IronPython
另一個 .NET 的 Python 實現,與 Python.NET 不同點在於它是生成 IL 的完全 Python 實現,並且將 Python 代碼直接編譯為 .NET 程序集。它的創造者就是當初創造 Jython 的 Jim Hugunin。想了解詳情可訪問 IronPython 網站。
PyPy
完全使用 Python 語言編寫的 Python 實現。它支持多個其他實現所沒有的高級特性,例如非棧式支持和 JIT 編譯器等。此項目的目標之一是通過允許方便地修改解釋器 (因為它是用 Python 編寫的),鼓勵該對語言本身進行試驗。想了解詳情可訪問 PyPy 項目主頁。
以上這些實現都可能在某些方面與此參考文檔手冊的描述有所差異,或是引入了超出標準 Python 文檔範圍的特定信息。請參考它們各自的專門文檔,以確定你正在使用的這個實現有哪些你需要了解的東西。
以 Java 語言編寫的 Python 實現。此實現可以作為 Java 應用的一個腳本語言,或者可以用來創建需要 Java 類庫支持的應用。想了解更多信息可訪問 Jython 網站。
Python for .NET
此實現實際上使用了 CPython 實現,但是屬於 .NET 託管應用並且可以引入 .NET 類庫。它的創造者是 Brian Lloyd。想了解詳情可訪問 Python for .NET 主頁。
IronPython
另一個 .NET 的 Python 實現,與 Python.NET 不同點在於它是生成 IL 的完全 Python 實現,並且將 Python 代碼直接編譯為 .NET 程序集。它的創造者就是當初創造 Jython 的 Jim Hugunin。想了解詳情可訪問 IronPython 網站。
python 常用的系統函數有哪些
1.常用內置函數:(不用import就可以直接使用)
help(obj) 在線幫助, obj可是任何類型
callable(obj) 查看一個obj是不是可以像函數一樣調用
repr(obj) 得到obj的表示字符串,可以利用這個字符串eval重建該對象的一個拷貝
eval_r(str) 表示合法的python表達式,返回這個表達式
dir(obj) 查看obj的name space中可見的name
hasattr(obj,name) 查看一個obj的name space中是否有name
getattr(obj,name) 得到一個obj的name space中的一個name
setattr(obj,name,value) 為一個obj的name space中的一個name指向vale這個object
delattr(obj,name) 從obj的name space中刪除一個name
vars(obj) 返回一個object的name space。用dictionary表示
locals() 返回一個局部name space,用dictionary表示
globals() 返回一個全局name space,用dictionary表示
type(obj) 查看一個obj的類型
isinstance(obj,cls) 查看obj是不是cls的instance
issubclass(subcls,supcls) 查看subcls是不是supcls的子類
類型轉換函數
chr(i) 把一個ASCII數值,變成字符
ord(i) 把一個字符或者unicode字符,變成ASCII數值
oct(x) 把整數x變成八進制表示的字符串
hex(x) 把整數x變成十六進制表示的字符串
str(obj) 得到obj的字符串描述
list(seq) 把一個sequence轉換成一個list
tuple(seq) 把一個sequence轉換成一個tuple
dict(),dict(list) 轉換成一個dictionary
int(x) 轉換成一個integer
long(x) 轉換成一個long interger
float(x) 轉換成一個浮點數
complex(x) 轉換成複數
max(…) 求最大值
min(…) 求最小值
用於執行程序的內置函數
complie 如果一段代碼經常要使用,那麼先編譯,再運行會更快。
2.和操作系統相關的調用
系統相關的信息模塊 import sys
sys.argv是一個list,包含所有的命令行參數.
sys.stdout sys.stdin sys.stderr 分別表示標準輸入輸出,錯誤輸出的文件對象.
sys.stdin.readline() 從標準輸入讀一行 sys.stdout.write(“a”) 屏幕輸出a
sys.exit(exit_code) 退出程序
sys.modules 是一個dictionary,表示系統中所有可用的module
sys.platform 得到運行的操作系統環境
sys.path 是一個list,指明所有查找module,package的路徑.
操作系統相關的調用和操作 import os
os.environ 一個dictionary 包含環境變量的映射關係 os.environ[“HOME”] 可以得到環境變量HOME的值
os.chdir(dir) 改變當前目錄 os.chdir(‘d:\\outlook’) 注意windows下用到轉義
os.getcwd() 得到當前目錄
os.getegid() 得到有效組id os.getgid() 得到組id
os.getuid() 得到用戶id os.geteuid() 得到有效用戶id
os.setegid os.setegid() os.seteuid() os.setuid()
os.getgruops() 得到用戶組名稱列表
os.getlogin() 得到用戶登錄名稱
os.getenv 得到環境變量
os.putenv 設置環境變量
os.umask 設置umask
os.system(cmd) 利用系統調用,運行cmd命令
操作舉例:
os.mkdir(‘/tmp/xx’) os.system(“echo ‘hello’ /tmp/xx/a.txt”) os.listdir(‘/tmp/xx’)
os.rename(‘/tmp/xx/a.txt’,’/tmp/xx/b.txt’) os.remove(‘/tmp/xx/b.txt’) os.rmdir(‘/tmp/xx’)
用python編寫一個簡單的shell
#!/usr/bin/python
import os, sys
cmd = sys.stdin.readline()
while cmd:
os.system(cmd)
cmd = sys.stdin.readline()
用os.path編寫平台無關的程序
os.path.abspath(“1.txt”) == os.path.join(os.getcwd(), “1.txt”)
os.path.split(os.getcwd()) 用於分開一個目錄名稱中的目錄部分和文件名稱部分。
os.path.join(os.getcwd(), os.pardir, ‘a’, ‘a.doc’) 全成路徑名稱.
os.pardir 表示當前平台下上一級目錄的字符 ..
os.path.getctime(“/root/1.txt”) 返回1.txt的ctime(創建時間)時間戳
os.path.exists(os.getcwd()) 判斷文件是否存在
os.path.expanduser(‘~/dir’) 把~擴展成用戶根目錄
os.path.expandvars(‘$PATH’) 擴展環境變量PATH
os.path.isfile(os.getcwd()) 判斷是否是文件名,1是0否
os.path.isdir(‘c:\Python26\temp’) 判斷是否是目錄,1是0否
os.path.islink(‘/home/huaying/111.sql’) 是否是符號連接 windows下不可用
os.path.ismout(os.getcwd()) 是否是文件系統安裝點 windows下不可用
os.path.samefile(os.getcwd(), ‘/home/huaying’) 看看兩個文件名是不是指的是同一個文件
os.path.walk(‘/home/huaying’, test_fun, “a.c”)
遍歷/home/huaying下所有子目錄包括本目錄,對於每個目錄都會調用函數test_fun.
例:在某個目錄中,和他所有的子目錄中查找名稱是a.c的文件或目錄。
def test_fun(filename, dirname, names): //filename即是walk中的a.c dirname是訪問的目錄名稱
if filename in names: //names是一個list,包含dirname目錄下的所有內容
print os.path.join(dirname, filename)
os.path.walk(‘/home/huaying’, test_fun, “a.c”)
文件操作
打開文件
f = open(“filename”, “r”) r只讀 w寫 rw讀寫 rb讀二進制 wb寫二進制 w+寫追加
讀寫文件
f.write(“a”) f.write(str) 寫一字符串 f.writeline() f.readlines() 與下read類同
f.read() 全讀出來 f.read(size) 表示從文件中讀取size個字符
f.readline() 讀一行,到文件結尾,返回空串. f.readlines() 讀取全部,返回一個list. list每個元素表示一行,包含”\n”\
f.tell() 返回當前文件讀取位置
f.seek(off, where) 定位文件讀寫位置. off表示偏移量,正數向文件尾移動,負數表示向開頭移動。
where為0表示從開始算起,1表示從當前位置算,2表示從結尾算.
f.flush() 刷新緩存
關閉文件
f.close()
regular expression 正則表達式 import re
簡單的regexp
p = re.compile(“abc”) if p.match(“abc”) : print “match”
上例中首先生成一個pattern(模式),如果和某個字符串匹配,就返回一個match object
除某些特殊字符metacharacter元字符,大多數字符都和自身匹配。
這些特殊字符是 。^ $ * + ? { [ ] \ | ( )
字符集合(用[]表示)
列出字符,如[abc]表示匹配a或b或c,大多數metacharacter在[]中只表示和本身匹配。例:
a = “.^$*+?{\\|()” 大多數metachar在[]中都和本身匹配,但”^[]\”不同
p = re.compile(“[“+a+”]”)
for i in a:
if p.match(i):
print “[%s] is match” %i
else:
print “[%s] is not match” %i
在[]中包含[]本身,表示”[“或者”]”匹配.用
和
表示.
^出現在[]的開頭,表示取反.[^abc]表示除了a,b,c之外的所有字符。^沒有出現在開頭,即於身身匹配。
-可表示範圍.[a-zA-Z]匹配任何一個英文字母。[0-9]匹配任何數字。
\在[]中的妙用。
\d [0-9]
\D [^0-9]
\s [ \t\n\r\f\v]
\S [^ \t\n\r\f\v]
\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\t 表示和tab匹配, 其他的都和字符串的表示法一致
\x20 表示和十六進制ascii 0x20匹配
有了\,可以在[]中表示任何字符。註:單獨的一個”.”如果沒有出現[]中,表示出了換行\n以外的匹配任何字符,類似[^\n].
regexp的重複
{m,n}表示出現m個以上(含m個),n個以下(含n個). 如ab{1,3}c和abc,abbc,abbbc匹配,不會與ac,abbbc匹配。
m是下界,n是上界。m省略表下界是0,n省略,表上界無限大。
*表示{,} +表示{1,} ?表示{0,1}
最大匹配和最小匹配 python都是最大匹配,如果要最小匹配,在*,+,?,{m,n}後面加一個?.
match object的end可以得到匹配的最後一個字符的位置。
re.compile(“a*”).match(‘aaaa’).end() 4 最大匹配
re.compile(“a*?”).match(‘aaaa’).end() 0 最小匹配
使用原始字符串
字符串表示方法中用\\表示字符\.大量使用影響可讀性。
解決方法:在字符串前面加一個r表示raw格式。
a = r”\a” print a 結果是\a
a = r”\”a” print a 結果是\”a
使用re模塊
先用re.compile得到一個RegexObject 表示一個regexp
後用pattern的match,search的方法,得到MatchObject
再用match object得到匹配的位置,匹配的字符串等信息
RegxObject常用函數:
re.compile(“a”).match(“abab”) 如果abab的開頭和re.compile(“a”)匹配,得到MatchObject
_sre.SRE_Match object at 0x81d43c8
print re.compile(“a”).match(“bbab”)
None 註:從str的開頭開始匹配
re.compile(“a”).search(“abab”) 在abab中搜索第一個和re_obj匹配的部分
_sre.SRE_Match object at 0x81d43c8
print re.compile(“a”).search(“bbab”)
_sre.SRE_Match object at 0x8184e18 和match()不同,不必從開頭匹配
re_obj.findall(str) 返回str中搜索所有和re_obj匹配的部分.
返回一個tuple,其中元素是匹配的字符串.
MatchObject的常用函數
m.start() 返回起始位置,m.end()返回結束位置(不包含該位置的字符).
m.span() 返回一個tuple表示(m.start(), m.end())
m.pos(), m.endpos(), m.re(), m.string()
m.re().search(m.string(), m.pos(), m.endpos()) 會得到m本身
m.finditer()可以返回一個iterator,用來遍歷所有找到的MatchObject.
for m in re.compile(“[ab]”).finditer(“tatbxaxb”):
print m.span()
高級regexp
| 表示聯合多個regexp. A B兩個regexp,A|B表示和A匹配或者跟B匹配.
^ 表示只匹配一行的開始行首,^只有在開頭才有此特殊意義。
$ 表示只匹配一行的結尾
\A 表示只匹配第一行字符串的開頭 ^匹配每一行的行首
\Z 表示只匹配行一行字符串的結尾 $匹配第一行的行尾
\b 只匹配詞的邊界 例:\binfo\b 只會匹配”info” 不會匹配information
\B 表示匹配非單詞邊界
示例如下:
print re.compile(r”\binfo\b”).match(“info “) #使用raw格式 \b表示單詞邊界
_sre.SRE_Match object at 0x817aa98
print re.compile(“\binfo\b”).match(“info “) #沒有使用raw \b表示退格符號
None
print re.compile(“\binfo\b”).match(“\binfo\b “)
_sre.SRE_Match object at 0x8174948
分組(Group) 示例:re.compile(“(a(b)c)d”).match(“abcd”).groups() (‘abc’, ‘b’)
#!/usr/local/bin/python
import re
x = “””
name: Charles
Address: BUPT
name: Ann
Address: BUPT
“””
#p = re.compile(r”^name:(.*)\n^Address:(.*)\n”, re.M)
p = re.compile(r”^name:(?P.*)\n^Address:(?P.*)\n”, re.M)
for m in p.finditer(x):
print m.span()
print “here is your friends list”
print “%s, %s”%m.groups()
Compile Flag
用re.compile得到RegxObject時,可以有一些flag用來調整RegxObject的詳細特徵.
DOTALL, S 讓.匹配任意字符,包括換行符\n
IGNORECASE, I 忽略大小寫
LOCALES, L 讓\w \W \b \B和當前的locale一致
MULTILINE, M 多行模式,隻影響^和$(參見上例)
VERBOSE, X verbose模式
如何利用python語言實現機器學習算法
基於以下三個原因,我們選擇Python作為實現機器學習算法的編程語言:(一) Python的語法清晰;(二) 易於操作純文本文件;(三) 使用廣泛,存在大量的開發文檔。 可執行偽代碼 Python具有清晰的語法結構,大家也把它稱作可執行偽代碼(executable pseudo-code)。默認安裝的Python開發環境已經附帶了很多高級數據類型,如列表、元組、字典、集合、隊列等,無需進一步編程就可以使用這些數據類型的操作。使用這些數據類型使得實現抽象的數學概念非常簡單。此外,讀者還可以使用自己熟悉的編程風格,如面向對象編程、面向過程編程、或者函數式編程。不熟悉Python的讀者可以參閱附錄A,該附錄詳細介紹了Python語言、Python使用的數據類型以及安裝指南。 Python語言處理和操作文本文件非常簡單,非常易於處理非數值型數據。Python語言提供了豐富的正則表達式函數以及很多訪問Web頁面的函數庫,使得從HTML中提取數據變得非常簡單直觀。 Python比較流行 Python語言使用廣泛,代碼範例也很多,便於讀者快速學習和掌握。此外,在開發實際應用程序時,也可以利用豐富的模塊庫縮短開發周期。 在科學和金融領域,Python語言得到了廣泛應用。SciPy和NumPy等許多科學函數庫都實現了向量和矩陣操作,這些函數庫增加了代碼的可讀性,學過線性代數的人都可以看懂代碼的實際功能。另外,科學函數庫SciPy和NumPy使用底層語言(C和Fortran)編寫,提高了相關應用程序的計算性能。本書將大量使用Python的NumPy。 Python的科學工具可以與繪圖工具Matplotlib協同工作。Matplotlib可以繪製二D、三D圖形,也可以處理科學研究中經常使用到的圖形,所以本書也將大量使用Matplotlib。 Python開發環境還提供了交互式shell環境,允許用戶開發程序時查看和檢測程序內容。 Python開發環境將來還會集成Pylab模塊,它將NumPy、SciPy和Matplotlib合併為一個開發環境。在本書寫作時,Pylab還沒有併入Python環境,但是不遠的將來我們肯定可以在Python開發環境找到它。 Python語言的特色 諸如MATLAB和Mathematica等高級程序語言也允許用戶執行矩陣操作,MATLAB甚至還有許多內嵌的特徵可以輕鬆地構造機器學習應用,而且MATLAB的運算速度也很快。然而MATLAB的不足之處是軟件費用太高,單個軟件授權就要花費數千美元。雖然也有適合MATLAB的第三方插件,但是沒有一個有影響力的大型開源項目。 Java和C等強類型程序設計語言也有矩陣數學庫,然而對於這些程序設計語言來說,最大的問題是即使完成簡單的操作也要編寫大量的代碼。程序員首先需要定義變量的類型,對於Java來說,每次封裝屬性時還需要實現getter和setter方法。另外還要記着實現子類,即使並不想使用子類,也必須實現子類方法。為了完成一個簡單的工作,我們必須花費大量時間編寫了很多無用冗長的代碼。Python語言則與Java和C完全不同,它清晰簡練,而且易於理解,即使不是編程人員也能夠理解程序的含義,而Java和C對於非編程人員則像天書一樣難於理解。 所有人在小學二年級已經學會了寫作,然而大多數人必須從事其他更重要的工作。 ——鮑比·奈特 也許某一天,我們可以在這句話中將“寫作”替代為“編寫代碼”,雖然有些人對於編寫代碼很感興趣,但是對於大多數人來說,編程僅是完成其他任務的工具而已。Python語言是高級編程語言,我們可以花費更多的時間處理數據的內在含義,而無須花費太多精力解決計算機如何得到數據結果。Python語言使得我們很容易表達自己的目的。 Python語言的缺點 Python語言唯一的不足是性能問題。Python程序運行的效率不如Java或者C代碼高,但是我們可以使用Python調用C編譯的代碼。這樣,我們就可以同時利用C和Python的優點,逐步地開發機器學習應用程序。我們可以首先使用Python編寫實驗程序,如果進一步想要在產品中實現機器學習,轉換成C代碼也不困難。如果程序是按照模塊化原則組織的,我們可以先構造可運行的Python程序,然後再逐步使用C代碼替換核心代碼以改進程序的性能。C++ Boost庫就適合完成這個任務,其他類似於Cython和PyPy的工具也可以編寫強類型的Python代碼,改進一般Python程序的性能。 如果程序的算法或者思想有缺陷,則無論程序的性能如何,都無法得到正確的結果。如果解決問題的思想存在問題,那麼單純通過提高程序的運行效率,擴展用戶規模都無法解決這個核心問題。從這個角度來看,Python快速實現系統的優勢就更加明顯了,我們可以快速地檢驗算法或者思想是否正確,如果需要,再進一步優化代碼
python把一個字符串列表寫入txt文件,並保證每個字符串佔用一行且沒有其他符號(例如[]‘’空格)
代碼如下:
#coding=utf-8
a = [‘zali’,’sili’,’ann’]
with open(‘test.txt’, ‘w’) as f:
for i in a:
f.write(i + ‘\n’)
運行結果
怎樣用python構建一個卷積神經網絡模型
上周末利用python簡單實現了一個卷積神經網絡,只包含一個卷積層和一個maxpooling層,pooling層後面的多層神經網絡採用了softmax形式的輸出。實驗輸入仍然採用MNIST圖像使用10個feature map時,卷積和pooling的結果分別如下所示。
部分源碼如下:
[python] view plain copy
#coding=utf-8
””’
Created on 2014年11月30日
@author: Wangliaofan
”’
import numpy
import struct
import matplotlib.pyplot as plt
import math
import random
import copy
#test
from BasicMultilayerNeuralNetwork import BMNN2
def sigmoid(inX):
if 1.0+numpy.exp(-inX)== 0.0:
return 999999999.999999999
return 1.0/(1.0+numpy.exp(-inX))
def difsigmoid(inX):
return sigmoid(inX)*(1.0-sigmoid(inX))
def tangenth(inX):
return (1.0*math.exp(inX)-1.0*math.exp(-inX))/(1.0*math.exp(inX)+1.0*math.exp(-inX))
def cnn_conv(in_image, filter_map,B,type_func=’sigmoid’):
#in_image[num,feature map,row,col]=in_image[Irow,Icol]
#features map[k filter,row,col]
#type_func[‘sigmoid’,’tangenth’]
#out_feature[k filter,Irow-row+1,Icol-col+1]
shape_image=numpy.shape(in_image)#[row,col]
#print “shape_image”,shape_image
shape_filter=numpy.shape(filter_map)#[k filter,row,col]
if shape_filter[1]shape_image[0] or shape_filter[2]shape_image[1]:
raise Exception
shape_out=(shape_filter[0],shape_image[0]-shape_filter[1]+1,shape_image[1]-shape_filter[2]+1)
out_feature=numpy.zeros(shape_out)
k,m,n=numpy.shape(out_feature)
for k_idx in range(0,k):
#rotate 180 to calculate conv
c_filter=numpy.rot90(filter_map[k_idx,:,:], 2)
for r_idx in range(0,m):
for c_idx in range(0,n):
#conv_temp=numpy.zeros((shape_filter[1],shape_filter[2]))
conv_temp=numpy.dot(in_image[r_idx:r_idx+shape_filter[1],c_idx:c_idx+shape_filter[2]],c_filter)
sum_temp=numpy.sum(conv_temp)
if type_func==’sigmoid’:
out_feature[k_idx,r_idx,c_idx]=sigmoid(sum_temp+B[k_idx])
elif type_func==’tangenth’:
out_feature[k_idx,r_idx,c_idx]=tangenth(sum_temp+B[k_idx])
else:
raise Exception
return out_feature
def cnn_maxpooling(out_feature,pooling_size=2,type_pooling=”max”):
k,row,col=numpy.shape(out_feature)
max_index_Matirx=numpy.zeros((k,row,col))
out_row=int(numpy.floor(row/pooling_size))
out_col=int(numpy.floor(col/pooling_size))
out_pooling=numpy.zeros((k,out_row,out_col))
for k_idx in range(0,k):
for r_idx in range(0,out_row):
for c_idx in range(0,out_col):
temp_matrix=out_feature[k_idx,pooling_size*r_idx:pooling_size*r_idx+pooling_size,pooling_size*c_idx:pooling_size*c_idx+pooling_size]
out_pooling[k_idx,r_idx,c_idx]=numpy.amax(temp_matrix)
max_index=numpy.argmax(temp_matrix)
#print max_index
#print max_index/pooling_size,max_index%pooling_size
max_index_Matirx[k_idx,pooling_size*r_idx+max_index/pooling_size,pooling_size*c_idx+max_index%pooling_size]=1
return out_pooling,max_index_Matirx
def poolwithfunc(in_pooling,W,B,type_func=’sigmoid’):
k,row,col=numpy.shape(in_pooling)
out_pooling=numpy.zeros((k,row,col))
for k_idx in range(0,k):
for r_idx in range(0,row):
for c_idx in range(0,col):
out_pooling[k_idx,r_idx,c_idx]=sigmoid(W[k_idx]*in_pooling[k_idx,r_idx,c_idx]+B[k_idx])
return out_pooling
#out_feature is the out put of conv
def backErrorfromPoolToConv(theta,max_index_Matirx,out_feature,pooling_size=2):
k1,row,col=numpy.shape(out_feature)
error_conv=numpy.zeros((k1,row,col))
k2,theta_row,theta_col=numpy.shape(theta)
if k1!=k2:
raise Exception
for idx_k in range(0,k1):
for idx_row in range( 0, row):
for idx_col in range( 0, col):
error_conv[idx_k,idx_row,idx_col]=\
max_index_Matirx[idx_k,idx_row,idx_col]*\
float(theta[idx_k,idx_row/pooling_size,idx_col/pooling_size])*\
difsigmoid(out_feature[idx_k,idx_row,idx_col])
return error_conv
def backErrorfromConvToInput(theta,inputImage):
k1,row,col=numpy.shape(theta)
#print “theta”,k1,row,col
i_row,i_col=numpy.shape(inputImage)
if rowi_row or col i_col:
raise Exception
filter_row=i_row-row+1
filter_col=i_col-col+1
detaW=numpy.zeros((k1,filter_row,filter_col))
#the same with conv valid in matlab
for k_idx in range(0,k1):
for idx_row in range(0,filter_row):
for idx_col in range(0,filter_col):
subInputMatrix=inputImage[idx_row:idx_row+row,idx_col:idx_col+col]
#print “subInputMatrix”,numpy.shape(subInputMatrix)
#rotate theta 180
#print numpy.shape(theta)
theta_rotate=numpy.rot90(theta[k_idx,:,:], 2)
#print “theta_rotate”,theta_rotate
dotMatrix=numpy.dot(subInputMatrix,theta_rotate)
detaW[k_idx,idx_row,idx_col]=numpy.sum(dotMatrix)
detaB=numpy.zeros((k1,1))
for k_idx in range(0,k1):
detaB[k_idx]=numpy.sum(theta[k_idx,:,:])
return detaW,detaB
def loadMNISTimage(absFilePathandName,datanum=60000):
images=open(absFilePathandName,’rb’)
buf=images.read()
index=0
magic, numImages , numRows , numColumns = struct.unpack_from(‘IIII’ , buf , index)
print magic, numImages , numRows , numColumns
index += struct.calcsize(‘IIII’)
if magic != 2051:
raise Exception
datasize=int(784*datanum)
datablock=””+str(datasize)+”B”
#nextmatrix=struct.unpack_from(‘47040000B’ ,buf, index)
nextmatrix=struct.unpack_from(datablock ,buf, index)
nextmatrix=numpy.array(nextmatrix)/255.0
#nextmatrix=nextmatrix.reshape(numImages,numRows,numColumns)
#nextmatrix=nextmatrix.reshape(datanum,1,numRows*numColumns)
nextmatrix=nextmatrix.reshape(datanum,1,numRows,numColumns)
return nextmatrix, numImages
def loadMNISTlabels(absFilePathandName,datanum=60000):
labels=open(absFilePathandName,’rb’)
buf=labels.read()
index=0
magic, numLabels = struct.unpack_from(‘II’ , buf , index)
print magic, numLabels
index += struct.calcsize(‘II’)
if magic != 2049:
raise Exception
datablock=””+str(datanum)+”B”
#nextmatrix=struct.unpack_from(‘60000B’ ,buf, index)
nextmatrix=struct.unpack_from(datablock ,buf, index)
nextmatrix=numpy.array(nextmatrix)
return nextmatrix, numLabels
def simpleCNN(numofFilter,filter_size,pooling_size=2,maxIter=1000,imageNum=500):
decayRate=0.01
MNISTimage,num1=loadMNISTimage(“F:\Machine Learning\UFLDL\data\common\\train-images-idx3-ubyte”,imageNum)
print num1
row,col=numpy.shape(MNISTimage[0,0,:,:])
out_Di=numofFilter*((row-filter_size+1)/pooling_size)*((col-filter_size+1)/pooling_size)
MLP=BMNN2.MuiltilayerANN(1,[128],out_Di,10,maxIter)
MLP.setTrainDataNum(imageNum)
MLP.loadtrainlabel(“F:\Machine Learning\UFLDL\data\common\\train-labels-idx1-ubyte”)
MLP.initialweights()
#MLP.printWeightMatrix()
rng = numpy.random.RandomState(23455)
W_shp = (numofFilter, filter_size, filter_size)
W_bound = numpy.sqrt(numofFilter * filter_size * filter_size)
W_k=rng.uniform(low=-1.0 / W_bound,high=1.0 / W_bound,size=W_shp)
B_shp = (numofFilter,)
B= numpy.asarray(rng.uniform(low=-.5, high=.5, size=B_shp))
cIter=0
while cItermaxIter:
cIter += 1
ImageNum=random.randint(0,imageNum-1)
conv_out_map=cnn_conv(MNISTimage[ImageNum,0,:,:], W_k, B,”sigmoid”)
out_pooling,max_index_Matrix=cnn_maxpooling(conv_out_map,2,”max”)
pool_shape = numpy.shape(out_pooling)
MLP_input=out_pooling.reshape(1,1,out_Di)
#print numpy.shape(MLP_input)
DetaW,DetaB,temperror=MLP.backwardPropogation(MLP_input,ImageNum)
if cIter%50 ==0 :
print cIter,”Temp error: “,temperror
#print numpy.shape(MLP.Theta[MLP.Nl-2])
#print numpy.shape(MLP.Ztemp[0])
#print numpy.shape(MLP.weightMatrix[0])
theta_pool=MLP.Theta[MLP.Nl-2]*MLP.weightMatrix[0].transpose()
#print numpy.shape(theta_pool)
#print “theta_pool”,theta_pool
temp=numpy.zeros((1,1,out_Di))
temp[0,:,:]=theta_pool
back_theta_pool=temp.reshape(pool_shape)
#print “back_theta_pool”,numpy.shape(back_theta_pool)
#print “back_theta_pool”,back_theta_pool
error_conv=backErrorfromPoolToConv(back_theta_pool,max_index_Matrix,conv_out_map,2)
#print “error_conv”,numpy.shape(error_conv)
#print error_conv
conv_DetaW,conv_DetaB=backErrorfromConvToInput(error_conv,MNISTimage[ImageNum,0,:,:])
#print “W_k”,W_k
#print “conv_DetaW”,conv_DetaW
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/232345.html