ValueError: slice index xxxx of dimension 0 out of bounds,详细分析。
出現這種問題的原因是,一般都是數據維度的原因,導致參數不匹配,一定要檢查參數維度。
你比如,我報錯的原因:
我的 image_placeholder聲明的是[10,16,112,112,3],但是后面我在調用的時候,卻這樣用了
logits = c3d_model.inference(image_placeholder[10,:, :, :, :], 。。。。。)
這里的這樣(注意10后面逗號)的話就會導致維度錯誤,有的同學會說,哦!我懂了,把逗號去了就行了,然而并不是這樣的。
接下來我們來看一下代碼:
import numpy as npa = np.ones([5,6,7,7,9]) #print(a) print("加逗號:",a[0,:,:,:,:].shape) #[6,7,7,9]print("加逗號:",a[1,:,:,:,:].shape) #[6,7,7,9]print("加逗號:",a[2,:,:,:,:].shape) #[6,7,7,9]print("加逗號:",a[3,:,:,:,:].shape) #[6,7,7,9]print("加逗號:",a[4,:,:,:,:].shape) #[6,7,7,9]#print("加逗號:",a[5,:,:,:,:].shape) #報錯:print("--------------------------")#上述都等價于a[i]print("不加逗號:",a[0:,:,:,:].shape) #[5,6,7,7,9]print("不加逗號:",a[1:,:,:,:].shape) #[4,6,7,7,9]print("不加逗號: ",a[2:,:,:,:].shape) #[3,6,7,7,9]print("不加逗號: ",a[3:,:,:,:].shape) #[2,6,7,7,9]print("不加逗號: ",a[4:,:,:,:].shape) #[1,6,7,7,9]print("不加逗號: ",a[9:,:,:,:].shape) #不報錯 #[0,6,7,7,9],這樣的維度的是什么東西,其實就是一個空list :[]. #上述都等價于啊a[i:]ps:只要維度里出現0,則這都是一個空列表。
相信看到這里不少小伙伴大概明白了,我們稍加解釋:
(1)加逗號:即當前維度與下一維度之間有逗號,表示提取第幾個slice,這樣產生的數據會降低一個維度,并且對數據有要求,只能取值為0-dims(當前維度) -1。否則會報錯:ValueError: slice index xxx of dimension 0 out of bounds。
(2)不加逗號:即當前維度與下一維度之間無逗號,表示從當前維度的第幾個值進行切片,不會改變原始數據的維度。當取值>dims(當前維度) -1 時,不報錯,但是會產生空列表。(小技巧,查逗號,看數值出現在第幾個逗號處,則對哪一個維度切片)
接下來有一些例子來加深我們的理解,大家可以先手動計算,然后再寫代碼驗證:
?
import numpy as npa = np.ones([5,6,7,8,9]) #print(a)print("加逗號:",a[:,0,:,:,:].shape) print('加逗號:',a[3,:,:,1,:].shape)print('不加逗號:',a[3:,:,2:].shape) #小技巧,查逗號,看數值出現在第幾個逗號處,則對哪一個維度取切片。 加逗號: (5, 7, 8, 9) 加逗號: (6, 7, 9) 不加逗號: (2, 6, 5, 8, 9)熟悉:c3d_model的朋友,或許對個語句不陌生:
images_placeholder[gpu_index * FLAGS.batch_size:(gpu_index + 1) * FLAGS.batch_size,:,:,:,:],
其實很容易理解,這又涉及到另外一種情況:我們來看代碼:
import numpy as npbatch_size = 8gpu_index = 0a = np.ones([4*8,6,7,8,9])print(a[gpu_index * batch_size:(gpu_index + 1) * batch_size,:,:,:,:].shape) for i in range (4):print(": ",a[:(i + 1)*batch_size,:,:,:,:].shape)print("i*batch_size: ",a[i * batch_size:(i + 1)*batch_size,:,:,:,:].shape) (8, 6, 7, 8, 9) : (8, 6, 7, 8, 9) i*batch_size: (8, 6, 7, 8, 9) : (16, 6, 7, 8, 9) i*batch_size: (8, 6, 7, 8, 9) : (24, 6, 7, 8, 9) i*batch_size: (8, 6, 7, 8, 9) : (32, 6, 7, 8, 9) i*batch_size: (8, 6, 7, 8, 9)分析,這里表示對第最高維是(i + 1)*batch_size之前的切片,從i * batch_size處取切片。添加一個:且與當前數值維度無逗號間隔,相當于添加一個維度。
?
這里我們詳細的講解了上知識,具體的情況大家也可以編寫代碼驗證,希望維度問題這種問題不再影響大家心情。
總結
以上是生活随笔為你收集整理的ValueError: slice index xxxx of dimension 0 out of bounds,详细分析。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch中的批量归一化BatchN
- 下一篇: 关于python直接用列表名复制的一些问