亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以使用向量方法來移動存儲在 numpy ndarray 中的圖像以進行數據增強?

是否可以使用向量方法來移動存儲在 numpy ndarray 中的圖像以進行數據增強?

茅侃侃 2022-10-06 19:20:20
背景:這是 Aurelien Geron 的教科書 Hands on Machine Learning 中的練習題之一。問題是:編寫一個函數,可以將 MNIST 圖像在任何方向(左、右、上、下)移動一個像素。然后為訓練集中的每個圖像創建四個移動副本(每個方向一個)并將它們添加到訓練集中。我的思考過程:我在 X_train 中有一個大小為 (59500, 784) 的 numpy 數組(每行是一個 (28,28) 圖像)。對于 X_train 的每一行:重塑為 784,0寫入空數組將行重塑為 28,28對于每個方向(上、下、左、右):將新數組附加到 X_train我的代碼:import numpy as npfrom scipy.ndimage.interpolation import shiftdef shift_and_append(X, n):    x_arr = np.zeros((1, 784))    for i in range(n):        for j in range(-1,2):            for k in range(-1,2):                if j!=k and j!=-k:                    x_arr = np.append(x_arr, shift(X[i,:].reshape(28,28), [j, k]).reshape(1, 784), axis=0)    return np.append(X, x_arr[1:,:], axis=0)X_train_new = shift_and_append(X_train, X_train.shape[0])y_train_new = np.append(y_train, np.repeat(y_train, 4), axis=0)運行需要很長時間。我覺得這是蠻力的。有沒有一種有效的矢量方法來實現這一點?
查看完整描述

1 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

3 個嵌套for循環,帶有if條件,同時整形和追加顯然不是一個好主意;numpy.roll以矢量方式完美地完成了這項工作:


import numpy as np

import matplotlib.pyplot as plt 

from keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train.shape

# (60000, 28, 28)


# plot an original image

plt.gray() 

plt.matshow(x_train[0]) 

plt.show() 

http://img1.sycdn.imooc.com//633eba1e000145c302580257.jpg

我們先演示一下操作:


# one pixel down:

x_down = np.roll(x_train[0], 1, axis=0)

plt.gray() 

plt.matshow(x_down) 

plt.show() 

http://img1.sycdn.imooc.com//633eba2d0001fc6a02560259.jpg

# one pixel up:

x_up = np.roll(x_train[0], -1, axis=0)

plt.gray() 

plt.matshow(x_up) 

plt.show() 

http://img1.sycdn.imooc.com//633eba3b00017fd202550256.jpg

# one pixel left:

x_left = np.roll(x_train[0], -1, axis=1)

plt.gray() 

plt.matshow(x_left) 

plt.show() 

http://img1.sycdn.imooc.com//633eba4e00018a5a02570255.jpg

# one pixel right:

x_right = np.roll(x_train[0], 1, axis=1)

plt.gray() 

plt.matshow(x_right) 

plt.show() 

http://img1.sycdn.imooc.com//633eba5b000107ec02530256.jpg

確定了這一點后,我們可以簡單地生成所有訓練圖像的“正確”版本


x_all_right = [np.roll(x, 1, axis=1) for x in x_train]

對于其他 3 個方向也是如此。


讓我們確認第一張圖片x_all_right確實是我們想要的:


plt.gray() 

plt.matshow(x_all_right[0]) 

plt.show()

http://img1.sycdn.imooc.com//633eba670001c2e202560256.jpg

您甚至可以避免最后一個列表理解,而使用純 Numpy 代碼,如

x_all_right = np.roll(x_train, 1, axis=2)

這更有效,雖然稍微不那么直觀(只需采用相應的單圖像命令版本并增加axis1)。


查看完整回答
反對 回復 2022-10-06
  • 1 回答
  • 0 關注
  • 151 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號