python構建
㈠ 使用 python 和 Pygame 模塊構建一個游戲框架
在我的 這系列的第一篇文章 中, 我已經講解如何使用 Python 創建一個簡單的、基於文本的骰子 游戲 。這次,我將展示如何使用 Python 模塊 Pygame 來創建一個圖形化 游戲 。它將需要幾篇文章才能來得到一個確實做成一些東西的 游戲 ,但是到這系列的結尾,你將更好地理解如何查找和學習新的 Python 模塊和如何從其基礎上構建一個應用程序。
在開始前,你必須安裝 Pygame 。
有幾種方法來安裝 Python 模塊,但是最通用的兩個是:
兩個方法都工作的很好,並且每一個都有它自己的一套優勢。如果你是在 linux 或 BSD 上開發,可以利用你的發行版的軟體存儲庫來自動和及時地更新。
然而,使用 Python 的內置軟體包管理器可以給予你控制更新模塊時間的能力。而且,它不是特定於操作系統的,這意味著,即使當你不是在你常用的開發機器上時,你也可以使用它。pip 的其它的優勢是允許本地安裝模塊,如果你沒有正在使用的計算機的管理許可權,這是有用的。
如果 Python 和 Python3 都安裝在你的系統上,你想使用的命令很可能是 pip3,它用來區分 Python 2.x 的 pip 的命令。如果你不確定,先嘗試 pip3。
pip 命令有些像大多數 Linux 軟體包管理器一樣工作。你可以使用 search 搜索 Python 模塊,然後使用 install 安裝它們。如果你沒有你正在使用的計算機的管理許可權來安裝軟體,你可以使用 --user 選項來僅僅安裝模塊到你的家目錄。
Pygame 是一個 Python 模塊,這意味著它僅僅是一套可以使用在你的 Python 程序中的庫。換句話說,它不是一個像 IDLE 或 Ninja-IDE 一樣可以讓你啟動的程序。
一個電子 游戲 需要一個背景設定:故事發生的地點。在 Python 中,有兩種不同的方法來創建你的故事背景:
你的背景僅是一張圖片或一種顏色。你的電子 游戲 人物不能與在背景中的東西相互作用,因此,不要在後面放置一些太重要的東西。它僅僅是設置裝飾。
要開始一個新的 Pygame 工程,先在計算機上創建一個文件夾。 游戲 的全部文件被放在這個目錄中。在你的工程文件夾內部保持所需要的所有的文件來運行 游戲 是極其重要的。
一個 Python 腳本以文件類型、你的姓名,和你想使用的許可證開始。使用一個開放源碼許可證,以便你的朋友可以改善你的 游戲 並與你一起分享他們的更改:
然後,你告訴 Python 你想使用的模塊。一些模塊是常見的 Python 庫,當然,你想包括一個你剛剛安裝的 Pygame 模塊。
由於你將用這個腳本文件做很多工作,在文件中分成段落是有幫助的,以便你知道在哪裡放代碼。你可以使用塊注釋來做這些,這些注釋僅在看你的源文件代碼時是可見的。在你的代碼中創建三個塊。
接下來,為你的 游戲 設置窗口大小。注意,不是每一個人都有大計算機屏幕,所以,最好使用一個適合大多數人的計算機的屏幕大小。
這里有一個方法來切換全屏模式,很多現代電子 游戲 都會這樣做,但是,由於你剛剛開始,簡單起見僅設置一個大小即可。
在腳本中使用 Pygame 引擎前,你需要一些基本的設置。你必須設置幀頻,啟動它的內部時鍾,然後開始 (init)Pygame 。
現在你可以設置你的背景。
在你繼續前,打開一個圖形應用程序,為你的 游戲 世界創建一個背景。在你的工程目錄中的 images 文件夾內部保存它為 stage.png 。
這里有一些你可以使用的自由圖形應用程序。
你的圖像不必很復雜,你可以以後回去更改它。一旦有了它,在你文件的 Setup 部分添加這些代碼:
如果你僅僅用一種顏色來填充你的 游戲 的背景,你需要做的就是:
你也必須定義顏色以使用。在你的 Setup 部分,使用紅、綠、藍 (RGB) 的值來創建一些顏色的定義。
至此,你理論上可以啟動你的 游戲 了。問題是,它可能僅持續了一毫秒。
為證明這一點,保存你的文件為 your-name_game.py(用你真實的名稱替換 your-name)。然後啟動你的 游戲 。
如果你正在使用 IDLE,通過選擇來自 「Run」 菜單的 「Run Mole」 來運行你的 游戲 。
如果你正在使用 Ninja,在左側按鈕條中單擊 「Run file」 按鈕。
你也可以直接從一個 Unix 終端或一個 Windows 命令提示符中運行一個 Python 腳本。
如果你正在使用 Windows,使用這命令:
啟動它,不過不要期望很多,因為你的 游戲 現在僅僅持續幾毫秒。你可以在下一部分中修復它。
除非另有說明,一個 Python 腳本運行一次並僅一次。近來計算機的運行速度是非常快的,所以你的 Python 腳本運行時間會少於 1 秒鍾。
為強制你的 游戲 來處於足夠長的打開和活躍狀態來讓人看到它(更不要說玩它),使用一個 while 循環。為使你的 游戲 保存打開,你可以設置一個變數為一些值,然後告訴一個 while 循環只要變數保持未更改則一直保存循環。
這經常被稱為一個「主循環」,你可以使用術語 main 作為你的變數。在你的 Setup 部分的任意位置添加代碼:
在主循環期間,使用 Pygame 關鍵字來檢查鍵盤上的按鍵是否已經被按下或釋放。添加這些代碼到你的主循環部分:
也是在你的循環中,刷新你世界的背景。
如果你使用一個圖片作為背景:
如果你使用一種顏色作為背景:
最後,告訴 Pygame 來重新刷新屏幕上的所有內容,並推進 游戲 的內部時鍾。
保存你的文件,再次運行它來查看你曾經創建的最無趣的 游戲 。
退出 游戲 ,在你的鍵盤上按 q 鍵。
在這系列的 下一篇文章 中,我將向你演示,如何加強你當前空空如也的 游戲 世界,所以,繼續學習並創建一些將要使用的圖形!
via: https://opensource.com/article/17/12/game-framework-python
作者: Seth Kenlon 選題: lujun9972 譯者: robsean 校對: wxy
㈡ 教女朋友學Python(一)運行環境搭建
下班比較早,吃了飯沒什麼事,就和女朋友一起研究了Python。
編程語言有很多,為什麼選擇它呢?因為它火吧,沒什麼好解岩行洞釋的,下面開始第一步,環境搭建。網上的教程實在太多,各種系統的各種版本,本地鏈接下載,有真有假,亂七八糟。這里是官網
我這里下載的是最新版,有關Python2到Python3有許多不兼容的問題,我想大家應該不需要擔心,因為以後Python3肯帶敏定是主流,官方會盡快處理,所以新手學習還是從Python3開始吧。
進去之後會看到:
別的不要點了,按照這個順序來就可以,反正我是這么做的,公司電腦是windows7
download-windows-python 3.6.3
然後開始下載。
幾分鍾之後(網速有點慢),打開下載文件python-3.6.3.exe,一步步next就可以了。不過為了免去配置環境變數這一步,要在下圖位置打上勾:
然後可以默認安裝路徑,也可以選擇自定義安裝,就是costomize installation,路徑中應該是不能有中文。如下:
稍等即可。顯示如下圖setup was successful就表示成功了。
那麼怎麼讓這個東西跑起來呢?這里:
輸入 idle ,回車,然後出來這么個東西:
完成。那三個大於號一樣的東西表示程序准備就緒粗枯,就等你來操作了。上面是版本信息等,具體不解釋。
下面是昨天晚上我女朋友敲出來的簡單代碼,我們屬於新手入門,大家看看就好。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Python
3.6
.
3
(v3.
6.3
2c5fed8
,
Oct
3
2017
,
17
26
49) [MSC v.
1900
32
bit (Intel)] on win32
Type
right
,
credits
or
license()㈢ 基於python如何建立人臉庫
您好,基於Python建立人臉庫的方法如下:
1. 安裝Python和相關包:首先,您需要安裝Python和相關的包,如OpenCV、NumPy等,以便使用Python來處理圖像和視頻。
2. 獲取人臉數據:您需此盯要獲取足夠多的人臉數據,以便訓練模型。
3. 提取特徵:使用Python中的OpenCV庫,您可以提取人臉圖像中的特徵,以便進行識別。
4. 訓練模型:使用提取的特徵,您可以訓練一個機器學習森敗和模型,以便識別不同的人臉。
5. 測試模型:最後,您可以使用測試數據來測試模型的准確性,以確保它能夠准確地識別不同枯旁的人臉。
㈣ 如何用Python搭建一個網站
Python搭建網站,利用現成的框架還是挺簡單的。在這滑咐里舉一個例子-利用Flask搭建一個網站。
Flask
Flask是一個使用Python編寫的輕量級Web應用框架。其WSGI工具箱採用Werkzeug,模板引擎則使用Jinja2。Flask創建一個應用很簡單,只需要一行代碼就可以創建一個應用。一個最小的應用看起來像這樣:
直接執行pythonhello.py,就可以看到頁面就可以訪問了,這只是官方給出的一個示例,方便學習。
應用初始化
所有Flask程序都必須創建一個程序實例。Web伺服器使用一種名為Web伺服器網關介面(WebServerGatewayInterface,WSGI)的協議,把接收自客戶端的所有請求都轉交給這個對象處理。程序實例是Flask類的對象,經常使用下述代碼創建:
Flask類的構造函數只有一個必須指定的參數,即程序主模塊或包的名字。在大多數程序中,Python的__name__變數就是所需的值。
路由和視圖函數
客戶端(例如Web瀏覽器)把請求發送給Web伺服器,Web伺服器再把請求發送給Flask程序實例。程備余序實例需要知道對每個URL請求運行哪些代碼,所以保存了一個URL到Python函數的映射關系。處理URL和函數之間關系的程序稱為路由。在Flask程序中定義仿讓滾路由的最簡便方式,是使用程序實例提供的app.route修飾器,把修飾的函數注冊為路由。下面的例子說明了如何使用這個修飾器聲明路由:
index()函數注冊為程序根地址的處理程序。如果部署程序的伺服器域名為,在瀏覽器中訪問p>
啟動伺服器
程序實例用run方法啟動Flask集成的開發Web伺服器:
__name__=='__main__'是Python的慣常用法,在這里確保直接執行這個腳本時才啟動開發Web伺服器。如果這個腳本由其他腳本引入,程序假定父級腳本會啟動不同的伺服器,因此不會執行app.run()。伺服器啟動後,會進入輪詢,等待並處理請求。輪詢會一直運行,直到程序停止,比如按Ctrl-C鍵。
Flask開發的網站實例
本示例中網站的結構如下
啟動伺服器界面
訪問WEB頁面
整個是利用Flask自己搭建的一個WEB頁面,資料庫試過mysql和mongodb都可以正常訪問。整體感覺Flask的學習成本會比Django低,而且也比Django更靈活。
㈤ 如何構建python環境
1、概念區分
對於剛剛開始學習Python的零基礎小白來說,可能很容易就會對Pycharm、Python解釋器、conda安裝、pip安裝這個幾個概念混淆。下面跟著我來逐一認識一下它們:
(1)Pycharm是Pytho開發的集成開發環境(Integrated Development Environment,簡稱IDE),它本身無法執行Python代碼。
(2)Python解釋器才是真正執行代碼的工具,pycharm里可設置Python解釋器,一般我們可去Python官網下載Python3.7或Python3.8版本;如果安裝過anaconda ,它裡面必然也包括一個某版本的Python解釋器;Pycharm配置Python解釋器選擇哪一個都可以。
(3)anaconda是把python所有常用包的合集,並提供給我們使用 conda 命令非常非常方便的安裝各種Python包。
(4)conda安裝:我們安裝過anaconda軟體後,就能夠使用conda命令下載anaconda源里(比如中科大鏡像源)的包。
(5)pip安裝:也是一種類似於conda安裝的python安裝方法,如果用過Centos系統,它就像yum安裝一樣。
2、修改鏡像源
在使用安裝 conda 安裝某些包會出現慢或安裝失敗問題,最有效方法是修改鏡像源為國內鏡像源。之前都選用清華鏡像源,但是2019年後已停止服務。推薦選用中科大鏡像源。
先查看已經安裝過的鏡像源,cmd窗口執行命令:
conda config --show
查看配置項 channels ,如果顯示帶有 tsinghua ,則說明已安裝過清華鏡像。
channels:
https://mirrors.tuna.tsinghua.e.cn/tensorflow/linux/cpu/
https://mirrors.tuna.tsinghua.e.cn/anaconda/cloud/msys2/
https://mirrors.tuna.tsinghua.e.cn/anaconda/cloud/conda-forge/
https://mirrors.tuna.tsinghua.e.cn/anaconda/pkgs/free/
https://mirrors.tuna.tsinghua.e.cn/anaconda/cloud/pytorch/
下一步,使用 conda config --remove channels url地址 刪除清華鏡像,如下命令刪除第一個。然後,依次刪除所有鏡像源
conda config --remove channels https://mirrors.tuna.tsinghua.e.cn/tensorflow/linux/cpu/
添加目前可用的中科大鏡像源:
conda config --add channels https://mirrors.ustc.e.cn/anaconda/pkgs/free/
並設置搜索時顯示通道地址:
conda config --set show_channel_urls yes
確認是否安裝鏡像源成功,執行 conda config --show ,找到 channels 值為如下:
channels:
https://mirrors.ustc.e.cn/anaconda/pkgs/free/
defaults
以上就是分享的Python基礎學習之環境搭建的全部學習內容,大家都看懂了嗎?希望本文的分享能幫到大家!
㈥ 怎麼用python建立一個用戶名列表
1、首先,我們需要打開Python,建立一個程序。
2、其次該程序具有一個函數,該函數將名字和姓氏作為參數,並創建一個用戶名。
3、最後使用sys.argv完成建立即可。
㈦ python虛擬環境搭建
當前python有多個版本,所以輸入命令的時候在不同的場景可能會需要不同的python版本。
就需要安裝python的虛擬環境,方便快速切換python的版本。
安裝python虛擬環境
sudo apt-get install python-virtualenv
sudo apt-get install virtualenvwrapper
創建虛擬環境
mkdir .virtualenvs
vi ~/.bashrc
插入如下兩行
export WORKON_HOME=$HOME/.virtualenvs
source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
然後執行
source ~/.bashrc
mkvirtualenv -p /usr/bin/python3.8 py3env
source py3env/bin/activate
㈧ 從零開始用Python構建神經網路
從零開始用Python構建神經網路
動機:為了更加深入的理解深度學習,我們將使用 python 語言從頭搭建一個神經網路,而不是使用像 Tensorflow 那樣的封裝好的框架。我認為理解神經網路的內部工作原理,對數據科學家來說至關重要。
這篇文章的內容是我的所學,希望也能對你有所幫助。
神經網路是什麼?
介紹神經網路的文章大多數都會將它和大腦進行類比。如果你沒有深入研究過大腦與神經網路的類比,那麼將神經網路解釋為一種將給定輸入映射為期望輸出的數學關系會更容易理解。
神經網路包括以下組成部分
? 一個輸入層,x
? 任意數量的隱藏層
? 一個輸出層,?
? 每層之間有一組權值和偏置,W and b
? 為隱藏層選擇一種激活函數,σ。在教程中我們使用 Sigmoid 激活函數
下圖展示了 2 層神經網路的結構(注意:我們在計算網路層數時通常排除輸入層)
2 層神經網路的結構
用 Python 可以很容易的構建神經網路類
訓練神經網路
這個網路的輸出 ? 為:
你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數。
因此 W 和 b 的值影響預測的准確率. 所以根據輸入數據對 W 和 b 調優的過程就被成為訓練神經網路。
每步訓練迭代包含以下兩個部分:
? 計算預測結果 ?,這一步稱為前向傳播
? 更新 W 和 b,,這一步成為反向傳播
下面的順序圖展示了這個過程:
前向傳播
正如我們在上圖中看到的,前向傳播只是簡單的計算。對於一個基本的 2 層網路來說,它的輸出是這樣的:
我們在 NeuralNetwork 類中增加一個計算前向傳播的函數。為了簡單起見我們假設偏置 b 為0:
但是我們還需要一個方法來評估預測結果的好壞(即預測值和真實值的誤差)。這就要用到損失函數。
損失函數
常用的損失函數有很多種,根據模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數。
誤差平方和是求每個預測值和真實值之間的誤差再求和,這個誤差是他們的差值求平方以便我們觀察誤差的絕對值。
訓練的目標是找到一組 W 和 b,使得損失函數最好小,也即預測值和真實值之間的距離最小。
反向傳播
我們已經度量出了預測的誤差(損失),現在需要找到一種方法來傳播誤差,並以此更新權值和偏置。
為了知道如何適當的調整權值和偏置,我們需要知道損失函數對權值 W 和偏置 b 的導數。
回想微積分中的概念,函數的導數就是函數的斜率。
梯度下降法
如果我們已經求出了導數,我們就可以通過增加或減少導數值來更新權值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。
但是我們不能直接計算損失函數對權值和偏置的導數,因為在損失函數的等式中並沒有顯式的包含他們。因此,我們需要運用鏈式求導發在來幫助計算導數。
鏈式法則用於計算損失函數對 W 和 b 的導數。注意,為了簡單起見。我們只展示了假設網路只有 1 層的偏導數。
這雖然很簡陋,但是我們依然能得到想要的結果—損失函數對權值 W 的導數(斜率),因此我們可以相應的調整權值。
現在我們將反向傳播演算法的函數添加到 Python 代碼中
為了更深入的理解微積分原理和反向傳播中的鏈式求導法則,我強烈推薦 3Blue1Brown 的如下教程:
Youtube:https://youtu.be/tIeHLnjs5U8
整合並完成一個實例
既然我們已經有了包括前向傳播和反向傳播的完整 Python 代碼,那麼就將其應用到一個例子上看看它是如何工作的吧。
神經網路可以通過學習得到函數的權重。而我們僅靠觀察是不太可能得到函數的權重的。
讓我們訓練神經網路進行 1500 次迭代,看看會發生什麼。 注意觀察下面每次迭代的損失函數,我們可以清楚地看到損失函數單調遞減到最小值。這與我們之前介紹的梯度下降法一致。
讓我們看看經過 1500 次迭代後的神經網路的最終預測結果:
經過 1500 次迭代訓練後的預測結果
我們成功了!我們應用前向和方向傳播演算法成功的訓練了神經網路並且預測結果收斂於真實值。
注意預測值和真實值之間存在細微的誤差是允許的。這樣可以防止模型過擬合並且使得神經網路對於未知數據有著更強的泛化能力。
下一步是什麼?
幸運的是我們的學習之旅還沒有結束,仍然有很多關於神經網路和深度學習的內容需要學習。例如:
? 除了 Sigmoid 以外,還可以用哪些激活函數
? 在訓練網路的時候應用學習率
? 在面對圖像分類任務的時候使用卷積神經網路
我很快會寫更多關於這個主題的內容,敬請期待!
最後的想法
我自己也從零開始寫了很多神經網路的代碼
雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學習框架方便的搭建深層網路而不需要完全理解其內部工作原理。但是我覺得對於有追求的數據科學家來說,理解內部原理是非常有益的。
這種練習對我自己來說已成成為重要的時間投入,希望也能對你有所幫助
㈨ 如何搭建python環境
1、說明:windows下設置python環境變數,就是把python的安裝目錄添加到系統path中。2、步驟:1)確定python安裝目錄,根據版本不同安裝目錄也不同,可以在開始菜單中的快捷方式中查看。在python快捷方式上點右鍵,屬性菜單
3、注意事項:如果未出現python結果,則需要檢查路徑是否設置正確,並重新啟動一下計算機即可。
㈩ 代碼詳解:用Python構建RNN模擬人腦
(number_of_records x length_of_sequence x types_of_sequences)
(number_of_records x types_of_sequences) #where types_of_sequences is 1
%pylab inline
import math
sin_wave = np.array([math.sin(x) for x in np.arange(200)])
plt.plot(sin_wave[:50])
X = []
Y = []
seq_len = 50
num_records = len(sin_wave) - seq_len
for i in range(num_records - 50):
X.append(sin_wave[i:i+seq_len])
Y.append(sin_wave[i+seq_len])
X = np.array(X)
X = np.expand_dims(X, axis=2)
Y = np.array(Y)
Y = np.expand_dims(Y, axis=1)
X.shape, Y.shape
((100, 50, 1), (100, 1))
X_val = []
Y_val = []
for i in range(num_records - 50, num_records):
X_val.append(sin_wave[i:i+seq_len])
Y_val.append(sin_wave[i+seq_len])
X_val = np.array(X_val)
X_val = np.expand_dims(X_val, axis=2)
Y_val = np.array(Y_val)
Y_val = np.expand_dims(Y_val, axis=1)
learning_rate = 0.0001
nepoch = 25
T = 50 # length of sequence
hidden_dim = 100
output_dim = 1
bptt_truncate = 5
min_clip_value = -10
max_clip_value = 10
U = np.random.uniform(0, 1, (hidden_dim, T))
W = np.random.uniform(0, 1, (hidden_dim, hidden_dim))
V = np.random.uniform(0, 1, (output_dim, hidden_dim))
def sigmoid(x):
return 1 / (1 + np.exp(-x))
for epoch in range(nepoch):
# check loss on train
loss = 0.0
# do a forward pass to get prediction
for i in range(Y.shape[0]):
x, y = X[i], Y[i] # get input, output values of each record
prev_s = np.zeros((hidden_dim, 1)) # here, prev-s is the value of the previous activation of hidden layer; which is initialized as all zeroes
for t in range(T):
new_input = np.zeros(x.shape) # we then do a forward pass for every timestep in the sequence
new_input[t] = x[t] # for this, we define a single input for that timestep
mulu = np.dot(U, new_input)
mulw = np.dot(W, prev_s)
add = mulw + mulu
s = sigmoid(add)
mulv = np.dot(V, s)
prev_s = s
# calculate error
loss_per_record = (y - mulv)**2 / 2
loss += loss_per_record
loss = loss / float(y.shape[0])
# check loss on val
val_loss = 0.0
for i in range(Y_val.shape[0]):
x, y = X_val[i], Y_val[i]
prev_s = np.zeros((hidden_dim, 1))
for t in range(T):
new_input = np.zeros(x.shape)
new_input[t] = x[t]
mulu = np.dot(U, new_input)
mulw = np.dot(W, prev_s)
add = mulw + mulu
s = sigmoid(add)
mulv = np.dot(V, s)
prev_s = s
loss_per_record = (y - mulv)**2 / 2
val_loss += loss_per_record
val_loss = val_loss / float(y.shape[0])
print('Epoch: ', epoch + 1, ', Loss: ', loss, ', Val Loss: ', val_loss)
Epoch: 1 , Loss: [[101185.61756671]] , Val Loss: [[50591.0340148]]
...
...
# train model
for i in range(Y.shape[0]):
x, y = X[i], Y[i]
layers = []
prev_s = np.zeros((hidden_dim, 1))
dU = np.zeros(U.shape)
dV = np.zeros(V.shape)
dW = np.zeros(W.shape)
dU_t = np.zeros(U.shape)
dV_t = np.zeros(V.shape)
dW_t = np.zeros(W.shape)
dU_i = np.zeros(U.shape)
dW_i = np.zeros(W.shape)
# forward pass
for t in range(T):
new_input = np.zeros(x.shape)
new_input[t] = x[t]
mulu = np.dot(U, new_input)
mulw = np.dot(W, prev_s)
add = mulw + mulu
s = sigmoid(add)
mulv = np.dot(V, s)
layers.append({'s':s, 'prev_s':prev_s})
prev_s = s
# derivative of pred
dmulv = (mulv - y)
# backward pass
for t in range(T):
dV_t = np.dot(dmulv, np.transpose(layers[t]['s']))
dsv = np.dot(np.transpose(V), dmulv)
ds = dsv
dadd = add * (1 - add) * ds
dmulw = dadd * np.ones_like(mulw)
dprev_s = np.dot(np.transpose(W), dmulw)
for i in range(t-1, max(-1, t-bptt_truncate-1), -1):
ds = dsv + dprev_s
dadd = add * (1 - add) * ds
dmulw = dadd * np.ones_like(mulw)
dmulu = dadd * np.ones_like(mulu)
dW_i = np.dot(W, layers[t]['prev_s'])
dprev_s = np.dot(np.transpose(W), dmulw)
new_input = np.zeros(x.shape)
new_input[t] = x[t]
dU_i = np.dot(U, new_input)
dx = np.dot(np.transpose(U), dmulu)
dU_t += dU_i
dW_t += dW_i
dV += dV_t
dU += dU_t
dW += dW_t
if dU.max() > max_clip_value:
dU[dU > max_clip_value] = max_clip_value
if dV.max() > max_clip_value:
dV[dV > max_clip_value] = max_clip_value
if dW.max() > max_clip_value:
dW[dW > max_clip_value] = max_clip_value
if dU.min() < min_clip_value:
dU[dU < min_clip_value] = min_clip_value
if dV.min() < min_clip_value:
dV[dV < min_clip_value] = min_clip_value
if dW.min() < min_clip_value:
dW[dW < min_clip_value] = min_clip_value
# update
U -= learning_rate * dU
V -= learning_rate * dV
W -= learning_rate * dW
Epoch: 1 , Loss: [[101185.61756671]] , Val Loss: [[50591.0340148]]
Epoch: 2 , Loss: [[61205.46869629]] , Val Loss: [[30601.34535365]]
Epoch: 3 , Loss: [[31225.3198258]] , Val Loss: [[15611.65669247]]
Epoch: 4 , Loss: [[11245.17049551]] , Val Loss: [[5621.96780111]]
Epoch: 5 , Loss: [[1264.5157739]] , Val Loss: [[632.02563908]]
Epoch: 6 , Loss: [[20.15654115]] , Val Loss: [[10.05477285]]
Epoch: 7 , Loss: [[17.13622839]] , Val Loss: [[8.55190426]]
Epoch: 8 , Loss: [[17.38870495]] , Val Loss: [[8.68196484]]
Epoch: 9 , Loss: [[17.181681]] , Val Loss: [[8.57837827]]
Epoch: 10 , Loss: [[17.31275313]] , Val Loss: [[8.64199652]]
Epoch: 11 , Loss: [[17.12960034]] , Val Loss: [[8.54768294]]
Epoch: 12 , Loss: [[17.09020065]] , Val Loss: [[8.52993502]]
Epoch: 13 , Loss: [[17.17370113]] , Val Loss: [[8.57517454]]
Epoch: 14 , Loss: [[17.04906914]] , Val Loss: [[8.50658127]]
Epoch: 15 , Loss: [[16.96420184]] , Val Loss: [[8.46794248]]
Epoch: 16 , Loss: [[17.017519]] , Val Loss: [[8.49241316]]
Epoch: 17 , Loss: [[16.94199493]] , Val Loss: [[8.45748739]]
Epoch: 18 , Loss: [[16.99796892]] , Val Loss: [[8.48242177]]
Epoch: 19 , Loss: [[17.24817035]] , Val Loss: [[8.6126231]]
Epoch: 20 , Loss: [[17.00844599]] , Val Loss: [[8.48682234]]
Epoch: 21 , Loss: [[17.03943262]] , Val Loss: [[8.50437328]]
Epoch: 22 , Loss: [[17.01417255]] , Val Loss: [[8.49409597]]
Epoch: 23 , Loss: [[17.20918888]] , Val Loss: [[8.5854792]]
Epoch: 24 , Loss: [[16.92068017]] , Val Loss: [[8.44794633]]
Epoch: 25 , Loss: [[16.76856238]] , Val Loss: [[8.37295808]]
preds = []
for i in range(Y.shape[0]):
x, y = X[i], Y[i]
prev_s = np.zeros((hidden_dim, 1))
# Forward pass
for t in range(T):
mulu = np.dot(U, x)
mulw = np.dot(W, prev_s)
add = mulw + mulu
s = sigmoid(add)
mulv = np.dot(V, s)
prev_s = s
preds.append(mulv)
preds = np.array(preds)
plt.plot(preds[:, 0, 0], 'g')
plt.plot(Y[:, 0], 'r')
plt.show()
preds = []
for i in range(Y_val.shape[0]):
x, y = X_val[i], Y_val[i]
prev_s = np.zeros((hidden_dim, 1))
# For each time step...
for t in range(T):
mulu = np.dot(U, x)
mulw = np.dot(W, prev_s)
add = mulw + mulu
s = sigmoid(add)
mulv = np.dot(V, s)
prev_s = s
preds.append(mulv)
preds = np.array(preds)
plt.plot(preds[:, 0, 0], 'g')
plt.plot(Y_val[:, 0], 'r')
plt.show()
from sklearn.metrics import mean_squared_error
math.sqrt(mean_squared_error(Y_val[:, 0] * max_val, preds[:, 0, 0] * max_val))
0.127191931509431