網頁

2018年6月6日 星期三

Optimizer 選擇

tf.train.GradientDescentOptimizer
梯度下降法
常見梯度下降法 BGD, SGD, MBGD
BGD: Batch gradient descent
採用整個訓練集的數據來計算,所以速度慢,若遇到大量的數據集會更慢
SGD: Stochastic gradient descent
隨機採用部分的訓練集來計算,所以速度較快,但是因為更新快,會造成震盪
MBGD: Mini-batch gradient descent

tf.train.AdagradOptimizer
Adagrad 會累加之前所有的梯度平方,
對低頻的參數做較大的更新,對高頻做較小的更新,
用於處理大的希疏矩陣,可以自動變更學習速率

tf.train.AdadeltaOptimizer
Adadelta 是對 Adagrad 的擴展,甚至不需要提前設定學習率

tf.train.MomentumOptimizer
如果梯度長時間保持一個方向,則增大參數更新幅度。
可以想像成從山頂放下一個球,會越滾越快

tf.train.RMSPropOptimizer
RMSProp 和 Adadelta 都是為了解決 Adagrad 學習率急劇下降的問題

tf.train.AdamOptimizer
它綜合了 Momentum 和 RMSProp 方法,是目前最常用的優化器



2018年6月5日 星期二

losses function

losses function

分類問題使用 softmax_cross_entropy_with_logits
回歸問題(如預測速度,價格,溫度等)使用均方誤差

loss = tf.reduce_mean(tf.reduce_sum(tf.square(result - prediction), reduction_indices=[1]))

Activation Function

Sigmoid
輸出介於0-1, 特別適用於概率輸出的模型
本身為單調函數(monotonic function)(漸增或漸減), 但導數不是
邏輯上,在訓練期間可能會卡住
一般會使用 softmax function 替代, 使得每一個元素都在0-1, 並且所有元素合為1
適用於多樣分類
圖片來源
Tanh
類似 sigmoid, 輸出介於 -1 到 1
本身為單調函數(monotonic function)(漸增或漸減), 但導數不是
適用於二分類
圖片來源
ReLU
為卷積神經網路或深度學習最常用的函數
輸出範圍從 0 到無限大
計算輛小,只需判斷輸入是否大於 0
圖片來源

激勵函數一般建議使用ReLU, 或者變形的 Leaky ReLU, Tanh 和 Sigmoid 盡量別用,
因為他們有梯度消失的問題,是類神經網路加深時主要的訓練障礙。
圖片來源

2018年5月3日 星期四

jupyter notebook

jupyter notebook 出錯

(tensorflow) D:\TensorFlow>jupyter notebook
Traceback (most recent call last):
  File "d:\anaconda3\envs\tensorflow\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "d:\anaconda3\envs\tensorflow\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "D:\Anaconda3\envs\tensorflow\Scripts\jupyter-notebook.EXE\__main__.py", line 5, in <module>
  File "d:\anaconda3\envs\tensorflow\lib\site-packages\notebook\notebookapp.py", line 44, in <module>
    from zmq.eventloop import ioloop
  File "d:\anaconda3\envs\tensorflow\lib\site-packages\zmq\__init__.py", line 47, in <module>
    from zmq import backend
  File "d:\anaconda3\envs\tensorflow\lib\site-packages\zmq\backend\__init__.py", line 40, in <module>
    reraise(*exc_info)
  File "d:\anaconda3\envs\tensorflow\lib\site-packages\zmq\utils\sixcerpt.py", line 34, in reraise
    raise value
  File "d:\anaconda3\envs\tensorflow\lib\site-packages\zmq\backend\__init__.py", line 27, in <module>
    _ns = select_backend(first)
  File "d:\anaconda3\envs\tensorflow\lib\site-packages\zmq\backend\select.py", line 26, in select_backend
    mod = __import__(name, fromlist=public_api)
  File "d:\anaconda3\envs\tensorflow\lib\site-packages\zmq\backend\cython\__init__.py", line 6, in <module>
    from . import (constants, error, message, context,
ImportError: cannot import name 'constants'

重新安裝 pyzmq 可以解決
pip uninstall pyzmq
pip install pyzmq




2018年5月2日 星期三

python labelImg.py 增加另一資料(pose)輸入

執行遇到問題
conda install pyqt=5
pip install --upgrade lxml
pyrcc5 -o resources.py resources.qrc

出現錯誤
Traceback (most recent call last):
  File "labelImg.py", line 1452, in <module>
    sys.exit(main())
  File "labelImg.py", line 1448, in main
    app, _win = get_main_app(sys.argv)
  File "labelImg.py", line 1441, in get_main_app
    argv[3] if len(argv) >= 4 else None)
  File "labelImg.py", line 109, in __init__
    self.settings.load()
  File "D:\TensorFlow\ObjectDetection\labelImg\libs\settings.py", line 33, in load
    self.data = pickle.load(f, encoding="iso-8859-1")
ModuleNotFoundError: No module named 'PyQt4'
請刪除 c:\users\user name\.labelImgSettings.pkl

pascal_voc_io.py
  def addBndBox(self, xmin, ymin, xmax, ymax, name, pose, difficult):
    bndbox['pose'] = pose
self.boxlist.append(bndbox)
  def appendObjects(self, top):
    for each_object in self.boxlist:
      pose.text = unicode(each_object['pose'])
  def save(self, targetFile=None):
    self.appendObjects(root)

labelFile.py
  def savePascalVocFormat(self, filename, shapes, imagePath, imageData, lineColor=None, fillColor=None, databaseSrc=None):
    for shape in shapes:
  pose = shape['pose']
  writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label, pose, difficult)

canvas.py

labelImage.py
class MainWindow(QMainWindow, WindowMixin):
  def __init__(self, defaultFilename=None, defaultPrefdefClassFile=None, defaultSaveDir=None):
    self.labelList = QListWidget()
self.canvas = Canvas(parent=self)
  def saveLabels(self, annotationFilePath):
    shapes = [format_shape(shape) for shape in self.canvas.shapes]
self.labelFile.savePascalVocFormat(annotationFilePath, shapes, self.filePath, self.imageData, self.lineColor.getRgb(), self.fillColor.getRgb())
  def addLabel(self, shape):
    item = HashableQListWidgetItem(shape.label)
item.setPose(shape.pose)
self.labelList.addItem(item)
  def currentItem(self):
    items = self.labelList.selectedItems()
return items[0]
  def editLabel(self):
    item = self.currentItem()
text, pose = self.labelDialog.popUp(item.text(), item.getPose())
item.setPose(pose)
item.setLabel(label)
item.setText(label + "_" + pose)
  def labelItemChanged(self, item):
    shape = self.itemsToShapes[item]
shape.label = item.text()
class HashableQListWidgetItem(QListWidgetItem):

labelDialog.py
  def popUp(self, text='', pose='', move=True):

2018年4月28日 星期六

Kennel 升級紀錄

Windows 10 回復原廠設定不能使用
出現 "重設您的電腦時發生問題 沒有做任何變更"
從官方網站下載 Windows 10
此時會有兩種選項,一是升級本身的電腦,二是建立安裝媒體(USB 隨身碟 8G)
兩者皆有測試過
似乎授權已經寫入 BIOS, 所以即使換硬碟重灌也可以直接啟用

部分的硬碟分割區無法刪除
需用 命令題是字元 執行 diskpart
DISKPART> list disk
DISKPART> select disk 1
DISKPART> list disk
DISKPART> list partition
DISKPART> clean

資料庫使用
mariadb-10.2.14-winx64.msi
備份使用
dump.bat
@echo off
set dt=%date:~0,10%
rem date format is "YYYY-MM-DD"
set dy=%dt:~0,4%
set dm=%dt:~5,2%
set dd=%dt:~8,2%
rem echo %dt%
set TODAY=%dy%%dm%%dd%
dump.bat
call today.bat
"c:\Program Files\MariaDB 10.2\bin\mysqldump.exe" -u root -pmark1234 -B kennel util>mariadb_%today%.sql
"c:\Program Files\7-Zip\7z.exe" a -tzip mariadb_%today%.sql.zip mariadb_%today%.sql
del mariadb_%today%.sql


開發環境使用
jdk-8u172-windows-i586.exe (給舊的 Eclipse 3 使用 32位元環境)
jdk-8u172-windows-x64.exe
eclipse-jee-oxygen-3a-win32-x86_64.zip
External JARs 換位置了,之前可以隨便放,現在必須放在 WEB-INF\lib
否則程式執行時會發生 ClassNotFoundException
使用 Tomcat v9.0 搭配 java 10 時,發生
-Djava.endorsed.dirs=C:\Program Files\Apache Software Foundation\Tomcat 9.0\endorsed is not supported.
錯誤,即使將 Run/Debug Configurations/Arguments/VM arguments 內的
-Djava.endorsed.dirs="C:\Program Files\Apache Software Foundation\Tomcat 9.0\endorsed"
刪除,下次執行時,依舊又出現,換成舊版的 java 即可解決

網站使用
apache-tomcat-9.0.7.exe (不能搭配 java 10)
修改 config 下的 server.xml 和 context.xml 請注意權限
若不修改權限,作業系統會搞鬼,讓你以為修改成功,浪費時間抓蟲
Tomcat v6.0 時, server.xml 為
<Context docBase="Main" path="/Kennel" reloadable="true" source="org.eclipse.jst.jee.server:Main">
<Resource name="jdbc/MainDS" auth="Container" type="javax.sql.DataSource" maxActive="4" maxIdle="2" maxWait="4" username="xxxx" password="xxxx" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/?useUnicode=true&amp;amp;characterEncoding=big5"></Resource></Context>

Tomcat v9.0 時, server.xml 不用動, 反而是修改 context.xml
    <Resource 
    name="jdbc/MainDS" 
    auth="Container" 
    type="javax.sql.DataSource" 
    maxTotal="4" 
    maxIdle="2" 
    maxWaitMillis="-1" 
    username="xxxx" 
    password="xxxx" 
    driverClassName="org.mariadb.jdbc.Driver" 
    url="jdbc:mariadb://localhost:3306/?useUnicode=true&amp;characterEncoding=utf8">
    </Resource>
注意其中 maxActive 改成 maxTotal, maxWait 變成 maxWaitMillis
另外 DBCP 也有變化,由
<Resource
    name="jdbc/MainDb"
    scope="Shareable"
    type="javax.sql.DataSource"
    factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
    maxTotal="4" maxIdle="2" maxWaitMillis="-1"
    url="jdbc:mariadb://localhost:3306"
    driverClassName="org.mariadb.jdbc.Driver"
    username="xxxx"
    password="xxxx"
    />
變成
<Resource
    name="jdbc/MainDb"
    scope="Shareable"
    type="javax.sql.DataSource"
    factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
    maxTotal="4" maxIdle="2" maxWaitMillis="-1"
    url="jdbc:mariadb://localhost:3306"
    driverClassName="org.mariadb.jdbc.Driver"
    username="xxxx"
    password="xxxx"
    />







2018年1月16日 星期二

Point Grey 相機之 FlyCapture 編譯 過程記錄

FlyCapture 有 32 和 64位元兩個版本
32位元安裝在 C:\Program Files (x86)\Point Grey Research\FlyCapture2
64位元安裝在 C:\Program Files\Point Grey Research\FlyCapture2

雖然安裝後有 src, 但因權限的關係,無法直接編譯
另外準備一個目錄 D:\SVN_Repository3\vc\FlyCapture
拷貝 include lib lib64 src_x64 src_x86

build src_x64/Examples_vs2013

雖然是 64位元, 不要改變 Configuration Manager 或 Property Pages 的 Platform 為 x64
雖然可以編譯成功,但是無法執行

VB.Net Examples 的 Project 會產生 Type 'FC2Version' is not defined. 之類的錯誤
開啟 Project 的 Properties 選 References, 可以看到
點選 FlyCapture2Managedd_v120, 在按 Reference Paths
加入目錄 C:\Program Files\Point Grey Research\FlyCapture2\bin64\vs2013
即可解決

CSharp Examples 的 Project 會產生如下的錯誤

開啟 Project 的 Properties 選 Build
改 Output path: bin\Debug\
為 Output path: bin\Debug
即可解決

CSharp Examples 的 Project 還會產生如下的錯誤

開啟 Project 的 Properties 選 Reference Paths 加入目錄
C:\Program Files\Point Grey Research\FlyCapture2\bin64\vs2013\
即可解決

CSharp Examples 的 MultiSyncEx_CSharp_vs2013 Project 還會產生如下的錯誤

點選 MultiSyncEx_CSharp_vs2013/References, 按右鍵選 Add References...
勾選 MultiSyncLibraryManaged_v120.dll 和 FlyCapture2Managed_v120.dll 按 OK
刪除錯誤 References FlyCapture2Managed 和 MultiSyncLibraryManaged
即可解決

C Examples 和 C++ Examples 內的 Project 需要各別 Build
唯一會有錯誤的是 FlyCapture2GUI
修改 FlyCap2CameraControl_ILBridge.h 和 FlyCap2CameraSelection_ILBridge.h
#elif (_MSC_VER == 1800)
#using <..\\..\\bin\\vs2013\\FlyCap2CameraControld_v120.dll>
#using <..\\..\\bin\\vs2013\\FlyCapture2Managedd_v120.dll>
#elif (_MSC_VER == 1700)
為
#elif (_MSC_VER == 1800)
//#using <..\\..\\bin\\vs2013\\FlyCap2CameraControld_v120.dll>
//#using <..\\..\\bin\\vs2013\\FlyCapture2Managedd_v120.dll>
#using <..\\FlyCap2CameraControl\\bin\\Debug\\FlyCap2CameraControld_v120.dll>
#using <..\\FlyCap2CameraControl\\bin\\Debug\\FlyCapture2Managedd_v120.dll>
#elif (_MSC_VER == 1700)
即可解決

點選 C++ Examples/FlyCap2, 按右鍵選 Set as Startup Project, 嘗試執行, 若產生下列錯誤
是因為 FlyCap2 會用到 FlyCapture2GUI 產生的 FlyCapture2GUId_v120.dll
而 FlyCapture2GUId_v120.dll 會用到 FlyCap2CameraControl 產生的
FlyCap2CameraControld_v120.dll 和 FlyCapture2Managedd_v120.dll
若是刪除 FlyCapture2GUId_v120.dll, 及會使用
C:\Program Files\Point Grey Research\FlyCapture2\bin64\vs2013 目錄下可以執行的程式庫
即可執行,至於什麼原因,就不知道了