1. 程式人生 > >【TensorFlow】01 TensorFlow簡介與Python基礎

【TensorFlow】01 TensorFlow簡介與Python基礎

編譯器 n) The 腳本語言 ble rem 時間 完整 快的

TensorFlow簡介與Python基礎

2018.9.10

一、概述

  • TF使用數據數據流圖進行數值計算,亮點是支持異構設備分布式計算機
  • 常用的ML庫有MXNet Torch/Pytorch Theano CNTK Caffe等
  • 0階張量(純量),1階張量(向量),2階張量(矩陣)tensor(張量) flow(流動)
  • 編程模式 命令式編程(Torch) 符號式編程(Tensorflow,theano 描述算法流程 放到其他語言執行)
  • TF使用數據流圖來進行編程 是一種推斷結構
  • TF的高層庫()如Kearas(對用戶友好,模塊化)
  • Deep-learning主要的運算是浮點運算
  • TF的亮點之一是autograph模式
  • TF的功能:設計、訓練、部署(唯一一個形成完整生態的ML sys)

二、環境配置

虛擬環境的安裝

  1. 使用pip命令安裝venv
    sudo pip install virtualenv
  2. cd 項目目錄 切換到項目所在的目錄
  3. 激活虛擬環境
    virtualenv --system-site-packages venv
  4. 退出venv
    deactivate

    5、查看venv環境的python包版本

    pip freeze

三、科學工具和流程

  • 編譯語言C,C++,Fortran 快,優化好,但語法不友好
  • 腳本語言: Matlab 開發友好,收費,基礎語言缺乏
    R語言 偏向統計,不能完成所有的任務
  • 高級的pyhton shell:IPython,Jupyter
  • python包:
    Numpy:強大的數值對象操作
    Scipy:高級的數據處理程序 (優化、回歸差值等)
    Matplotlib:2D可視化 (不可交互,對3D圖像支持不好)

四、python基礎

(一)數據類型

python的變量類型不像C++一樣在定義時必須制定參數的變量類型,是一種動態語言

整數

Python可以處理任意大小(沒有大小限制)的正負整數,使用0x作為前綴表示十六進制

浮點數(小數)

按照科學計數法表示的數字,比如1.23e9代表$1.23*e^9$

由於儲存方式不同,整數永遠是精確的,但是浮點數可以四舍五入

字符串

字符串是以單引號或者雙引號括起來的任意文本

如果字符串裏有很多字符需要轉義,為簡化可以使用r‘‘,引號內的字符串默認不轉義

print(‘\\\t\\‘)
\   \
print(r‘\\\t\\‘)
\\\t\\

布爾值

boolean只有True和false兩種,其結果可由比較運算,邏輯運算得出(and,or,not)

  • 當兩個變量比較時,如果給定的變量值小於100,則使用is運算的得到的兩個變量所得bool結果為true,否則為false這是由於python在儲存同一個變量是當變量的數值小於100是使用同一塊內存,而大於100是則不使用同一塊內存
a = 1000
b = 1000
print(a is b)
print(id(a),id(b))
False
4526894320 4526894960
a = 100
b = 100
print(a is b)
print(id(a),id(b))
True
4305331680 4305331680

(二)字符串

在python保存源代碼是,需要制定保存為UTF-8編碼,當解釋器讀取時,在開頭加上這兩行文字(第一行告訴Unix系統這是一個python可執行程序,win會忽略這個註釋,第二行是告訴編譯器以utf-8的方式讀取,否則中文不能正常編碼)

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

占位符

在Python中,格式化方式與C相同,使用%實現。%s表示用字符串替換,%d表示用整數替換,有幾個%?後面就需要跟幾個變量或值,當變量大於2時需要用括號括起來,有一個的話可以省略

print("Hi,my name is %s, I‘m %d years old."%(‘Alex‘,10))
Hi,my name is Alex, I‘m 10 years old.
占位符 替換內容
%d 整數
%f 浮點數
%s 字符串
%x 十六進制數

(三)循環

for...in循環

for x in ...就是把每個元素帶入變量x,然後執行縮進塊的語句

names = [‘A‘,‘B‘,‘C‘]
for name in names:
    print(name)
A
B
C

使用range(n)可以生成一個叠代器,其值是0 ~ n-1

sum = 0
for i in range(101):
    sum = sum + i
print(sum)
5050

while循環

使用while循環打印100以內所有奇數的和:

sum = 0
n = 99
while n>0:
    sum = sum + n
    n = n - 2
print(sum)
2500

(四)Python數據結構

list(列表)

list是有序的集合,可以隨時刪除和添加元素

classlist = [‘class1‘,‘class2‘,‘class3‘]
len(classlist)  #使用len可以獲得列表的長度
classlist[0] #使用下標可以訪問list的元素(以0開始)
classlist[-1] #使用負下標可以訪問倒數的元素
‘class3‘

列表的插入

classlist.append(‘class4‘)  #尾插法
print(classlist)
classlist.insert(1,‘class5‘) #指定索引插入
print(classlist)
[‘class1‘, ‘class2‘, ‘class3‘, ‘class4‘]
[‘class1‘, ‘class5‘, ‘class2‘, ‘class3‘, ‘class4‘]

列表的刪除

classlist.pop()  #如果pop不加參數,則刪除最後一個,否則按照索引順序刪除
print(classlist)
[‘class1‘, ‘class5‘, ‘class2‘, ‘class3‘]

註意:

  • list中的元素數據類型可以不同
  • list中可以有另外的list
  • list中一個元素也沒有,則其長度為0

tuple(元組)

元組的另一名稱為有序列表,一旦初始化就不能修改,沒有append和pop方法

tuple存在的意義在於tuple不可變,所以代碼更安全,如果可能,盡量用tuple代替list

當定義只有一個元素的tuple時,需要將這個元素後面加上一個逗號,因為()可能會產生歧義。Python規定單獨出現的小括號內容計算結果使其本身。

t = (1,)  #是(1,)而不是(1)
print(t)
(1,)

註意:

  • 要創建一個內容也不變的tuple必須保證tuple中的每一個元素本身不能變(不允許出現tuple中嵌套list的情況)

dict(字典)

dict使用鍵-值(key-value)存儲,具有很快的查找速度

dic = {‘A‘:95,‘B‘:80,‘C‘:75}
print(dic[‘A‘])
95

修改dic某個key的值:

dic[‘A‘]=60
print(dic[‘A‘])
60

對比list與dict:
dict:查找插入速度快,不會因為key的增加而變慢,但浪費內存多
list:查找插入時間隨著元素的增加而增加,但占用空間小,浪費內存少

註意:

  • dic是一種用空間換時間的存儲結構(hash)
  • key必須是不可變的對象

set(集合)

set與dict類似,是key的集合,但不存儲value,沒有重復的key

重復的元素在set中被自動過濾掉:

s = set([1,1,2,2,3,3])
print(s)
{1, 2, 3}

其他方法:
add(key)可以添加元素到set中
remove(key)可以刪除set中的元素

集合操作:

s1 = set([1,2,3])
s2 = set([2,3,4])
print(s1&s2)
print(s1|s2)
{2, 3}
{1, 2, 3, 4}

(五)切片

L = [‘Michael‘, ‘Sarah‘, ‘Tracy‘, ‘Bob‘, ‘Jack‘]

取得前三個元素:

L = [‘Michael‘, ‘Sarah‘, ‘Tracy‘, ‘Bob‘, ‘Jack‘]
print(L[:3])  
#L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素
#如果第一索引是0,可以省略
[‘Michael‘, ‘Sarah‘, ‘Tracy‘]

也可以負切片(記住倒數第一個元素的索引是 -1):

L[-2:]
[‘Bob‘, ‘Jack‘]

前10個數,每兩個取一個(第3個參數n為步長,代表隔n個數取出一個):

L = list(range(100))
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

(五)jupyter使用

魔法命令

import numpy as np
np.reshape??  #在命令後加??可以查看對應命令的幫助文檔
  File "<ipython-input-22-38dc740ee985>", line 2
    np.reshape??  #在命令後加??可以查看對應命令的幫助文檔
              ^
SyntaxError: invalid syntax
a =[1,3,5]
%run my_file.py  #百分號後面的為魔法命令,可以執行非python的內容
%whos  #魔法命令:查看變量
%ls #支持大部分下的Linux命令
%pwd
%timeit a    #使用timeit監測性能
for item in [1,3,5]:
    print(item)
for item in range(10):     #range()可以生成叠代器,等價於range(0,10)
    print(item)

【TensorFlow】01 TensorFlow簡介與Python基礎