神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)之Ndarray對象和CNN入門
人類和螞蟻
人類和螞蟻應(yīng)該是理解維度很好的參照,對人類而言,世界是三維的,而對于螞蟻來說,世界是二位的,讓螞蟻來理解三維的東西肯定不好理解,讓人類類理解高于三維的東西,那必然也不容易理解,但Ndarray對象居然可以是任意的維度,其實現(xiàn)本質(zhì)上基于的是多維數(shù)組。
Jupyter
(1)通過官網(wǎng)安裝,anaconda官網(wǎng): https://anaconda.org/ (2)通過conda install jupyter
來安裝Jupyter。 Conda真是一個好東西,用上它就會愛上它,現(xiàn)在我基本不用pip來安裝軟件包了,基本都是用conda進(jìn)行安裝。 區(qū)別:?簡單理解conda會安裝所有依賴包,這能省很多事情的?(3)運行jupyter notebook
即可啟動服務(wù)

很人性化的web界面,自己探索下就知道怎么使用了,總之很強大。在其他的語言中可沒有這等神器。
Numpy
NumPy(Numerical Python) 是 Python 語言的一個擴展程序庫,支持大量的維度數(shù)組與矩陣運算,此外也針對數(shù)組運算提供大量的數(shù)學(xué)函數(shù)庫。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 與其它協(xié)作者共同開發(fā),2005 年,Travis Oliphant 在 Numeric 中結(jié)合了另一個同性質(zhì)的程序庫 Numarray 的特色,并加入了其它擴展而開發(fā)了 NumPy。NumPy 為開放源代碼并且由許多協(xié)作者共同維護(hù)開發(fā)。
NumPy 是一個運行速度非??斓臄?shù)學(xué)庫,主要用于數(shù)組計算,包含:
?一個強大的N維數(shù)組對象 ndarray?廣播功能函數(shù)?整合 C/C++/Fortran 代碼的工具?線性代數(shù)、傅里葉變換、隨機數(shù)生成等功能
本文主要來書ndarray,其他的特性會在后續(xù)文章中介紹。
Numpy的常用操作可參考下面的導(dǎo)圖:

Ndarray
下面這段代碼獲取的是文本訓(xùn)練集和測試集,然后通過CNN對其進(jìn)行文本分類。后續(xù)文章會專門講解CNN,這個神奇的網(wǎng)絡(luò)讓我愛上了深度學(xué)習(xí)。
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
感受一下CNN是個什么東西:

來看一下結(jié)果:

從圖中可以看出測試集和訓(xùn)練集都是ndarray類型的。
Ndarray是什么
NumPy 最重要的一個特點是其 N 維數(shù)組對象 ndarray,它是一系列同類型數(shù)據(jù)的集合,以 0 下標(biāo)為開始進(jìn)行集合中元素的索引。
Ndarray 對象是用于存放同類型元素的多維數(shù)組。
Ndarray 中的每個元素在內(nèi)存中都有相同存儲大小的區(qū)域。
Ndarray 內(nèi)部由以下內(nèi)容組成:
?
一個指向數(shù)據(jù)(內(nèi)存或內(nèi)存映射文件中的一塊數(shù)據(jù))的指針。
?
數(shù)據(jù)類型或 dtype,描述在數(shù)組中的固定大小值的格子。
?一個表示數(shù)組形狀(shape)的元組,表示各維度大小的元組。
?一個跨度元組(stride),其中的整數(shù)指的是為了前進(jìn)到當(dāng)前維度下一個元素需要"跨過"的字節(jié)數(shù)。
Ndarray 的內(nèi)部結(jié)構(gòu):

Ndarray屬性
在上面的導(dǎo)圖中,介紹了主要的屬性,不過這個圖對shape屬性和ndim屬性的說明不太準(zhǔn)確。因此這是引用官網(wǎng)的文檔: 屬性 | 注釋 -------- | ----- |ndarray.flags| Information about the memory layout of the array.| |ndarray.shape|Tuple of array dimensions.| |ndarray.strides|Tuple of bytes to step in each dimension when traversing an array.| |ndarray.ndim|Number of array dimensions.| |ndarray.data|Python buffer object pointing to the start of the array’s data.| |ndarray.size|Number of elements in the array. |ndarray.itemsize|Length of one array element in bytes.| | ndarray.nbytes | Total bytes consumed by the elements of the array. | | ndarray.base | Base object if memory is from some other object.|
通過例子來看一下:
a = np.arange(24) ?
print (a.ndim) ? ? ? ? ? ? # a 現(xiàn)只有一個維度
# 現(xiàn)在調(diào)整其大小
b = a.reshape(2,4,3) ?# b 現(xiàn)在擁有三個維度
print(b)
print(b.ndim)
print(b.shape)
運行結(jié)果:

首先看b的shape的屬性是一個tuple,和list很像,不過元素不能改變。
這其中的(2, 3, 4)都代表什么?這和ndim屬性又有什么關(guān)系那?再次reshape一次。
b = a.reshape(6,4)
b

似乎發(fā)現(xiàn)了什么。通過對比可知,shape對應(yīng)的tuple的長度就是ndim屬性,也就是"Number of array dimensions"。
再看b.shape對用的tuple中的元素都代表什么? 對以第二次reshape后的b,可知:
?6代表的是二維數(shù)組中一維數(shù)組的個數(shù)?4代表的是一維數(shù)組中元素的個數(shù)
如果我想搞個6維的數(shù)組,

Ndarray索引和切片
#切片還可以包括省略號 …/:,來使選擇元組的長度與數(shù)組的維度相同。 如果在行位置使用省略號,它將返回包含行中元素的 ndarray。
a = np.array([[1,2,3],[3,4,5],[4,5,6]]) ?
print(a)
# 返回一個元組
print(a.shape)
# 軸個數(shù)
print(a.ndim)
print (a[...,1]) ? # 第2列元素
print(a[:,1])
print (a[1,...]) ? # 第2行元素
print (a[...,1:]) ?# 第2列及剩下的所有元素
運行結(jié)果如下:
[[1 2 3] [3 4 5] [4 5 6]] (3, 3) 2 [2 4 5] [2 4 5] [3 4 5] [[2 3] [4 5] [5 6]]
圖像的conv2d
創(chuàng)建兩個7x7的濾波器。其中一個在中間帶有垂直白線,另一個在中間帶有水平白線。
#!/usr/bin/env python
# coding: utf-8
# In[108]:
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.datasets import load_sample_image
# In[126]:
china = load_sample_image("china.jpg")/255
flower = load_sample_image("flower.jpg")/255
images = np.array([china,flower])
# In[134]:
print(images.ndim)
batch_size, height, width, chanels = images.shape
# In[135]:
filters = np.zeros(shape=(7,7,chanels,2), dtype=np.float32)
filters
# In[141]:
filters[:,3,:,0] = 1
filters[3,:,:,1] = 1
filters
outputs = tf.nn.conv2d(images, filters, strides=1, padding="SAME")
plt.imshow(outputs[0,:,:,1], cmap="gray")
plt.show()
看一下經(jīng)過卷積之后的特征圖(feature map):

如果想獲得第一個濾波器卷積得到的特征圖,需要用下面的代碼:
plt.imshow(outputs[0,:,:,0], cmap="gray")
結(jié)構(gòu)如下:

參考
?https://www.runoob.com/numpy/numpy-matplotlib.html?機器學(xué)習(xí)實戰(zhàn)?https://numpy.org/
寫在最后
接下來的文章會介紹Ndarray的內(nèi)存布局,以及tensorflow中重要的數(shù)據(jù)結(jié)構(gòu)。
公眾號
更多機器學(xué)習(xí)相關(guān)的內(nèi)容,歡迎關(guān)注我的微信公眾號: 無情劍客。
