人类和蚂蚁
人类和蚂蚁应该是理解维度很好的参照,对人类而言,世界是三维的,而对于蚂蚁来说,世界是二位的,让蚂蚁来理解三维的东西肯定不好理解,让人类类理解高于三维的东西,那必然也不容易理解,但Ndarray对象居然可以是任意的维度,其实现本质上基于的是多维数组。
Jupyter
(1)通过官网安装,anaconda官网: https://anaconda.org/ (2)通过conda install jupyter
来安装Jupyter。 Conda真是一个好东西,用上它就会爱上它,现在我基本不用pip来安装软件包了,基本都是用conda进行安装。 区别: 简单理解conda会安装所有依赖包,这能省很多事情的 (3)运行jupyter notebook
即可启动服务
很人性化的web界面,自己探索下就知道怎么使用了,总之很强大。在其他的语言中可没有这等神器。
Numpy
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
•一个强大的N维数组对象 ndarray•广播功能函数•整合 C/C++/Fortran 代码的工具•线性代数、傅里叶变换、随机数生成等功能
本文主要来书ndarray,其他的特性会在后续文章中介绍。
Numpy的常用操作可参考下面的导图: 在这里插入图片描述Ndarray
下面这段代码获取的是文本训练集和测试集,然后通过CNN对其进行文本分类。后续文章会专门讲解CNN,这个神奇的网络让我爱上了深度学习。
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
感受一下CNN是个什么东西:
在这里插入图片描述
来看一下结果:
在这里插入图片描述
从图中可以看出测试集和训练集都是ndarray类型的。
Ndarray是什么
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
Ndarray 对象是用于存放同类型元素的多维数组。
Ndarray 中的每个元素在内存中都有相同存储大小的区域。
Ndarray 内部由以下内容组成:
•
一个指向数据(内存或内存映射文件中的一块数据)的指针。
•
数据类型或 dtype,描述在数组中的固定大小值的格子。 •
一个表示数组形状(shape)的元组,表示各维度大小的元组。 •
一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。
Ndarray 的内部结构: 在这里插入图片描述Ndarray属性
在上面的导图中,介绍了主要的属性,不过这个图对shape属性和ndim属性的说明不太准确。因此这是引用官网的文档: 属性 | 注释 -------- | ----- |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 现只有一个维度# 现在调整其大小b = a.reshape(2,4,3) # b 现在拥有三个维度print(b)print(b.ndim)print(b.shape)
运行结果:
在这里插入图片描述
首先看b的shape的属性是一个tuple,和list很像,不过元素不能改变。
这其中的(2, 3, 4)都代表什么?这和ndim属性又有什么关系那?再次reshape一次。
b = a.reshape(6,4)b
在这里插入图片描述
似乎发现了什么。通过对比可知,shape对应的tuple的长度就是ndim属性,也就是"Number of array dimensions"。
再看b.shape对用的tuple中的元素都代表什么? 对以第二次reshape后的b,可知:
•6代表的是二维数组中一维数组的个数•4代表的是一维数组中元素的个数
如果我想搞个6维的数组,
在这里插入图片描述Ndarray索引和切片
#切片还可以包括省略号 …/:,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。a = np.array([[1,2,3],[3,4,5],[4,5,6]]) print(a)# 返回一个元组print(a.shape)# 轴个数print(a.ndim)print (a[...,1]) # 第2列元素print(a[:,1])print (a[1,...]) # 第2行元素print (a[...,1:]) # 第2列及剩下的所有元素
运行结果如下:
[[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
创建两个7x7的滤波器。其中一个在中间带有垂直白线,另一个在中间带有水平白线。
#!/usr/bin/env python# coding: utf-8# In[108]:import numpy as npimport tensorflow as tfimport matplotlib.pyplot as pltfrom sklearn.datasets import load_sample_image# In[126]:china = load_sample_image("china.jpg")/255flower = load_sample_image("flower.jpg")/255images = 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] = 1filters[3,:,:,1] = 1filtersoutputs = tf.nn.conv2d(images, filters, strides=1, padding="SAME")plt.imshow(outputs[0,:,:,1], cmap="gray")plt.show()
看一下经过卷积之后的特征图(feature map):
在这里插入图片描述
如果想获得第一个滤波器卷积得到的特征图,需要用下面的代码:
plt.imshow(outputs[0,:,:,0], cmap="gray")
结构如下:
在这里插入图片描述
参考
•https://www.runoob.com/numpy/numpy-matplotlib.html•机器学习实战•https://numpy.org/
写在最后
接下来的文章会介绍Ndarray的内存布局,以及tensorflow中重要的数据结构。
公众号
更多机器学习相关的内容,欢迎关注我的微信公众号: 无情剑客。
burning_gzh.png
网友评论