質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.86%

  • Python

    6316questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • NumPy

    345questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

  • Matplotlib

    226questions

    MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

numpyのreshape関数について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 843

sandyur

score 17

ニューラルネットワークを用いて画像認識のアルコリズムを実装しています。
「達人データサイエンティストによる理論と実践/python機械学習プログラミング」の第12章のコードをそのまま写生しています。
MNISTデータをnumpyの配列に読み込むところでエラーが発生しました。

エラーメッセージ

ValueError                                Traceback (most recent call last)
<ipython-input-7-93436c289cee> in <module>()
     23     return images, labels
     24 
---> 25 X_train, y_train = load_mnist('mnist', kind='train')
     26 print('Rows: %d, columns: %d' % (X_train.shape[0], X_train.shape[1]))
     27 

<ipython-input-7-93436c289cee> in load_mnist(path, kind)
     20         #画像ピクセル情報の配列のサイズを変更
     21         #(行数:ラベルのサイズ、列数:特徴量の個数)
---> 22         images = np.fromfile(imgpath, dtype=np.uint8).reshape(len(labels), 784)
     23     return images, labels
     24 

ValueError: cannot reshape array of size 47040000 into shape (60008,784)

ソースコード

import os
import struct
import numpy as np

def load_mnist(path, kind='train'):
    """MNISTデータをpathからロード"""
    #引数から指定したパスを結合(ラベルや画像のパスを作成)
    labels_path = os.path.join(path, '%s-labels-idx1-ubyte' % kind)
    images_path = os.path.join(path, '%s-images-idx3-ubyte' % kind)

    #ファイルを読み込む
    #引数にファイル、モードを指定(rbは読み込みのバイナリモード)
    with open(labels_path, 'rb') as lbpath:
        # バイナリを文字列に変換:unpack関数の引数にフォーマット、8バイト分の
        #バイナリデータを措定して、マジックナンバー、アイテムの個数を読み込む
        labels = np.fromfile(lbpath,dtype=np.uint8)

    with open(images_path, 'rb') as imgpath:
        magic, num, rows, cols = struct.unpack(">IIII", imgpath.read(16))
        #画像ピクセル情報の配列のサイズを変更
        #(行数:ラベルのサイズ、列数:特徴量の個数)
        images = np.fromfile(imgpath, dtype=np.uint8).reshape(len(labels), 784)
    return images, labels

X_train, y_train = load_mnist('mnist', kind='train')
print('Rows: %d, columns: %d' % (X_train.shape[0], X_train.shape[1]))

X_test, y_test = load_mnist('mnist', kind='t10k')
print('Rows: %d, columns: %d' % (X_test.shape[0], X_test.shape[1]))


numpyのreshape関数の第2引数はintまたはintのタプルorリストを拾うことは知っています。
784は、MNISTデータセットの画像(28*28ピクセル)を1次元の行ベクトルで表している際の行数を示すらしいです。

解決法をご教授いただけるとうれしいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Pythonもニューラルネットワークも素人ですが単純にコードの内容とエラーメッセージからの推測です。

ValueError: cannot reshape array of size 47040000 into shape (60008,784)

60008 * 784 = 47046272 > 47040000

なので、reshapeしようとする画像データのピクセル数が不足しているのが直接原因と思います。

"mnist/train-labels-idx1-ubyte" ラベルファイル
"mnist/train-images-idx3-ubyte" 画像ファイル

だと思いますが、ラベルファイルのバイト数がラベルの数になってますね。それはエラーメッセージから60008であったはずです。一方画像ファイルは16バイトのヘッダー情報+画素データのような形式になっていて画素データは1ピクセル当たり1バイトで上の計算式のとおり47046272(=60008*784)バイトが期待のはずですが、実際は47040000(=60000*784)バイトしかなかった=>つまり画像(28x28ピクセル)が8ラベル分だけ不足しているということなのですが・・・

ラベル読み込みのコードをよく見ると「ファイルの先頭8バイトはマジックナンバーとアイテム個数」というコメントがあります。故にそのヘッダー8バイト分の情報を本来読み込むべきであり、それをしていないためにラベル数が本来より8大きくなってしまったのが原因ではないかと思いました。

変数名は適当ですが、以下のようにしておかなければならないのでは?

with open(labels_path, 'rb') as lbpath:
        # バイナリを文字列に変換:unpack関数の引数にフォーマット、8バイト分の
        #バイナリデータを措定して、マジックナンバー、アイテムの個数を読み込む
        label_magic, num_items = struct.unpack(">II", imgpath.read(8))
        labels = np.fromfile(lbpath,dtype=np.uint8)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/20 07:21

    回答ありがとうございます!改善しましたら解決しました!
    詳しく書いてくださりとてもわかり易かったです!

    キャンセル

+1

動きましたか?

Python: Deeper Insights into Machine Learningの日本語版っぽいですね。

質問中には、

with open(labels_path, 'rb') as lbpath:
    # バイナリを文字列に変換:unpack関数の引数にフォーマット、8バイト分の
    #バイナリデータを措定して、マジックナンバー、アイテムの個数を読み込む
    labels = np.fromfile(lbpath,dtype=np.uint8)

とありましたが、先の本ではwith open(labels_path, 'rb') as lbpath:の直後に

magic, n = struct.unpack('>II', lbpath.read(8))

の一文があり、質問中ではこれに相当する一文が漏れているようでしたので…

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/20 07:37

    回答ありがとうございます!
    はい、文章漏れに気づきましたので、訂正しました笑
    こんなミスの回答に答えてくださってありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Rにて手書き数字MNISTをnnetで学習させたい

    前提・実現したいこと Rにて手書き数字データMNISTをnnetで学習させたいと考えています。 サイトを参考に実行してみましたが、エラーが出てしまいうまくいきません。 発

  • 解決済

    TensorFlowでの訓練データについて(自然言語処理)

    Neural networkで何か作ってみたいと思い、チュートリアルを参考にして、自分で実装しようと思いました。 チュートリアルと同じことをやっても嫌だなと思ったので固有抽出表現

  • 解決済

    Tensorflowのfully_connected_feedの実行にエラーが続く

    tensoflowのfully_connected_feed.pyを実行しようとしているのですが、どう試行錯誤してもエラーが続きます。 tensorflowのインストールの仕方、

  • 解決済

    MNISTデータをreshapeできない

    前提・実現したいこと tensorflowでDCGANを使って画像生成するサンプルを自分のPCで動かそうとしています win10,anaconda(python3.5)で作業してい

  • 解決済

    chainerサンプルコードtrain_mnist.pyのエラー

    前提・実現したいこと githubから以下の公式chainerファイルをクローンし サンプルコードtest_mnist.py を実行したらエラーが返ってきました どなたか解決方法を

  • 解決済

    mnist for ML Beginnersについて

    https://qiita.com/kkk3H/items/c3eb0d868170b29b0b87 こちらの記事を読ませていただいて自分も同じことをしてみたいと思ってやってみ

  • 解決済

    データセットの作り方がわからない

     前提・実現したいこと 「ゼロから作るディープラーニング」を読み終えた学生です。 せっかくディープラーニングをかじり始めたため、自分に役に立つことをディープラーニングを利用してやっ

  • 解決済

    Tensorflow, kerasで作成したCNNモデルの使い方

     やりたいこと APIで画像分析を今までやってきましたが、もっと深い画像分析をやりたいと思いtensorflowとkerasを使って勉強をはじめました。まずは、イメージを掴むためk

同じタグがついた質問を見る

  • Python

    6316questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • NumPy

    345questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

  • Matplotlib

    226questions

    MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。