web-dev-qa-db-ja.com

サイズの配列を形状に再形成できません

https://www.youtube.com/watch?v=lbFEZAXzk0g でYouTubeの機械学習ビデオをフォローしています。チュートリアルはpython2にあるので、python3に変換する必要があります。これが私がエラーを起こしているコードのセクションです:

_def load_mnist_images(filename):
    if not os.path.exists(filename):
        download(filename)
    with gzip.open(filename,'rb') as file:
        data = numpy.frombuffer(file.read(),numpy.uint8, offset=16)
        data = data.reshape(-1,1,28,28)
        return data/numpy.float32(256)
_

次のエラーが発生します:ValueError: cannot reshape array of size 9992 into shape (1,28,28).どうすれば修正できますか?チュートリアルではそれは働いていました。また、他にエラーがあったら教えてください。

1
Varun Rajkumar

reshapeの構文は次のとおりです

data.reshape(shape)

形状はタプル(a、b)の形式で渡されます。やってみて

data.reshape((-1, 1, 28, 28))
1
psnbaba

入力には、出力配列と同じ数の要素がありません。入力はサイズ9992です。出力はサイズ[? x 1 x 28 x 28] -1は、reshapeコマンドが配列に適合するためにこの次元に沿って必要なインデックスの数を決定する必要があることを示しているためです。 28x28x1は784なので、このサイズに再形成する入力は、出力形状に収まるように784で分割できる必要があります。 9992は784で割り切れないため、ValueErrorがスローされます。以下は、説明のための最小限の例です。

import numpy as np

data = np.zeros(2352) # 2352 is 784 x 3
out = data.reshape((-1,1,28,28)) # executes correctly -  out is size [3,1,28,28]

data = np.zeros(9992) # 9992 is 784 x 12.745 ... not integer divisible
out = data.reshape((-1,1,28,28)) # throws ValueError: cannot reshape array of size 9992 into shape (1,28,28)

したがって、ValueErrorが必要ない場合は、入力を別のサイズの配列に再形成して、正しく収まるようにする必要があります。

1
DerekG