Numpy、TensorFlow和Keras函数输入参数axis理解(一)

在利用numpy、TensorFlow和Keras等进行编程时,经常发现很多函数携带axis参数,且具有相同功能的函数的axis(轴)参数取值范围可能不同(操作方式也不一样),从而引起一些困惑。针对这一问题,归纳总结如下:

1. Numpy函数中的axis参数理解

在Numpy中,axis的不同取值对应着numpy array的不同维度,通常取值范围是[-rank(input),rank(input))。比如,二维数组A = np.array([[1,2],[3,4]]),那么数组A的0轴(axis = 0)表示对应着A的第一维方向(纵轴),数组A的1轴(axis = 1)表示对应着A的第二维方向(横轴)。通过在numpy函数的输入参数中指定axis值,可以控制函数沿着axis轴指定的方向进行操作:

当numpy函数不指定axis的值时,表示函数对所有元素进行操作;

当numpy函数指定axis的值时,表示函数沿着指定的axis轴方向进行操作;

下面给出列举一些实例:

1.1 案例1——np.sum()

函数原型:

np.sum(a, axis=None, dtype=None, out=None, keepdims=False)

函数作用:

求给定的axis轴上的数组元素之和

import numpy as np

A = np.array([[1,2],[3,4]])
sum0 = np.sum(A, axis=0)    #沿着0轴求和 ,也就是与0轴平行的方向求和(按列求和)
sum1 = np.sum(A, axis=1)    #沿着1轴求和,也就是与1轴平行的方向求和(按行求和)
sum2 = np.sum(A)

print("输入矩阵:")
print(A)

print("沿着0轴求和(按列,axis = 0):",sum0)
print("沿着1轴求和(按行,aixs = 1):",sum1)
print("所有元素的和(axis = none):",sum2)
输入矩阵:
[[1 2]
 [3 4]]
沿着0轴求和(按列,axis = 0): [4 6]
沿着1轴求和(按行,aixs = 1): [3 7]
所有元素的和(axis = none): 10

1.2案例2——np.argmax()

函数原型:

np.argmax(a, axis=None, out=None)

函数作用:

沿着axis轴返回最大值的索引

import numpy as np

A = np.random.random((3,4))
print("输入数组:")
print(A)

B = np.argmax(A,axis = 0)
C = np.argmax(A,axis = 1)
D = np.argmax(A,axis = -1)
E = np.argmax(A,axis = -2)

print("沿着0轴寻找最大值,并返回其索引:",B)
print("沿着1轴寻找最大值,并返回其索引:",C)
print("沿着-1轴寻找最大值,并返回其索引:",D)
print("沿着-2轴寻找最大值,并返回其索引:",E)
输入数组:
[[ 0.84279837  0.19618695  0.78035449  0.17604155]
 [ 0.61023773  0.13680776  0.34354893  0.63371117]
 [ 0.36884615  0.51836158  0.15862349  0.17267713]]
沿着0轴寻找最大值,并返回其索引: [0 2 0 1]
沿着1轴寻找最大值,并返回其索引: [0 3 1]
沿着-1轴寻找最大值,并返回其索引: [0 3 1]
沿着-2轴寻找最大值,并返回其索引: [0 2 0 1]

* 总结:*

根据上述试验发现,在axis的区间为[-2,2),axis的取值虽然可以不同,但是实际的效果却存在相同的情况,即

axis = -2 对应 axis = 0,效果一致;

axis = -1 对应 axis = 1,效果一致;

1.3 案例3——np.concatenate()

函数原型:

concatenate((a1, a2, …), axis=0)

函数作用:

沿着已有的axis轴,对数组进行合并

import numpy as np

A_1 = np.array([[1,2],[4,5]])
A_2 = np.zeros((2,2))

print("输入数组A_1:")
print(A_1)

print("输入数组A_2:")
print(A_2)

B = np.concatenate((A_1,A_2),axis = 0)
C = np.concatenate((A_1,A_2),axis = 1)

print("沿着0轴方向合并数组(垂直合并):\n",B)
print("沿着1轴方向合并数组(水平合并):\n",C)
输入数组A_1:
[[1 2]
 [4 5]]
输入数组A_2:
[[ 0.  0.]
 [ 0.  0.]]
沿着0轴方向合并数组(垂直合并):
 [[ 1.  2.]
 [ 4.  5.]
 [ 0.  0.]
 [ 0.  0.]]
沿着1轴方向合并数组(水平合并):
 [[ 1.  2.  0.  0.]
 [ 4.  5.  0.  0.]]

总结:

在numpy中还有很多函数中存在axis输入参数,比如np.mean()、np.max()、np.min()等函数,其对于的axis理解方式跟上述案例完全一致。

发布了17 篇原创文章 · 获赞 138 · 访问量 20万+
展开阅读全文

TensorFlowKeras如何使用Dataset作为数据输入

05-04

当我把dataset作为输入数据是总会报出如下错误,尽管我已经在数据解析那里reshape了图片大小为(512,512,1),请问该如何修改? ``` ValueError: Error when checking input: expected conv2d_input to have 4 dimensions, but got array with shape (None, 1) ``` **图片大小定义** ``` import tensorflow as tf from tensorflow import keras IMG_HEIGHT = 512 IMG_WIDTH = 512 IMG_CHANNELS = 1 IMG_PIXELS = IMG_CHANNELS * IMG_HEIGHT * IMG_WIDTH ``` **解析函数** ``` def parser(record): features = tf.parse_single_example(record, features={ 'image_raw': tf.FixedLenFeature([], tf.string), 'label': tf.FixedLenFeature([23], tf.int64) }) image = tf.decode_raw(features['image_raw'], tf.uint8) label = tf.cast(features['label'], tf.int32) image.set_shape([IMG_PIXELS]) image = tf.reshape(image, [IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS]) image = tf.cast(image, tf.float32) return image, label ``` **模型构建** ``` dataset = tf.data.TFRecordDataset([TFRECORD_PATH]) dataset.map(parser) dataset = dataset.repeat(10*10).batch(10) model = keras.Sequential([ keras.layers.Conv2D(filters=32, kernel_size=(5, 5), padding='same', activation='relu', input_shape=(512, 512, 1)), keras.layers.MaxPool2D(pool_size=(2, 2)), keras.layers.Dropout(0.25), keras.layers.Conv2D(filters=64, kernel_size=(3, 3), padding='same', activation='relu'), keras.layers.MaxPool2D(pool_size=(2, 2)), keras.layers.Dropout(0.25), keras.layers.Flatten(), keras.layers.Dense(128, activation='relu'), keras.layers.Dropout(0.25), keras.layers.Dense(23, activation='softmax') ]) model.compile(optimizer=keras.optimizers.Adam(), loss=keras.losses.sparse_categorical_crossentropy, metrics=[tf.keras.metrics.categorical_accuracy]) model.fit(dataset.make_one_shot_iterator(), epochs=10, steps_per_epoch=10) ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览