質問するログイン新規登録
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

Q&A

解決済

1回答

1044閲覧

ゼロつくの3.6「手書き数字認識」をcolabで実装するには

TsubakiTsubasa

総合スコア1

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

0グッド

0クリップ

投稿2023/02/08 08:56

編集2023/02/08 11:12

0

0

実現したいこと

『ゼロから作るDeepLearnig』をcolabで実装したい

  • p76の手書き数字認識に関して

前提

(例)
ゼロからをcolabで実装しているのですが、エラーが出てしまいます。
調べた限り以下のサイトが見つかったのですが、これをどうすればいいのかわからなくて
https://marshmallow444.github.io/tech_blog/2021/08/09/zero-tsuku-chpt3.html

発生している問題・エラーメッセージ

#54行でエラーが出ています shapes (784,) and (2,3) not aligned: 784 (dim 0) != 2 (dim 0) ValueError Traceback (most recent call last) <ipython-input-107-f1108bf38dc3> in <module> 1 accuracy_cnt = 0 2 for i in range(len(x)): ----> 3 y = predict(network, x[1]) 4 # 最も確率の高い要素のインデックスを取得 5 p = np.argmax(y) <ipython-input-104-6332fa5fc513> in predict(nework, x) 12 b1, b2, b3 = network['b1'], network['b2'], network['b3'] 13 ---> 14 a1 = np.dot(x, W1) + b1 15 z1 = sigmoid(a1) 16 a2 = np.dot(z1, W2) +b2 <__array_function__ internals> in dot(*args, **kwargs) ValueError: shapes (784,) and (2,3) not aligned: 784 (dim 0) != 2 (dim 0)

該当のソースコード

Python

1# googleドライブへの接続(テキストに記載なし) 2from google.colab import drive 3drive.mount('/content/drive') 4# パスの指定(テキストに記載なし) 5import sys 6sys.path.append('/content/drive/My Drive/zero_to_deep-learning/dataset') 7from mnist import load_mnist 8from PIL import Image 9from IPython.display import display 10 11def img_show(img): 12 pil_img = Image.fromarray(np.uint8(img)) 13 display(pil_img) 14 15(x_train, t_train), (x_test,y_test) = load_mnist(flatten=True, normalize=False) 16 17img = x_train[0] 18label = t_train[0] 19print(label) 20print(img.shape) 21img = img.reshape(28,28) 22print(img.shape) 23 24img_show(img) 25 26def get_data(): 27 (x_train, t_train), (x_test, y_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False) 28 return x_test, y_test 29def init_neteork(): 30# pickleファイルに格納されているファイルに格納されているsample_weight.pklに保存された学習済み重みパラメータを読み込む 31 with open("sample_weight.pkl", 'rb')as f: 32 network = pickle.load(f) 33 return network 34 35def predict(nework, x): 36 W1, W2, W3 = network['W1'], network['W2'], network['W3'] 37 b1, b2, b3 = network['b1'], network['b2'], network['b3'] 38 39 a1 = np.dot(x, W1) + b1 40 z1 = sigmoid(a1) 41 a2 = np.dot(z1, W2) +b2 42 z2 = sigmoid(a2) 43 a3 = np.dot(z2, W3) +b3 44 y = softmax(a3) 45 46 return y 47 48# 性能を評価 49x, t = get_data() 50network = init_network() 51 52accuracy_cnt = 0 53for i in range(len(x)): 54 y = predict(network, x[1]) 55# 最も確率の高い要素のインデックスを取得 56 p = np.argmax(y) 57 if p == t[i]: 58 accuracy_cnt += 1 59 60print("Accuracy:" + str(float(accuracy_cnt)/len(x)))

試したこと

https://marshmallow444.github.io/tech_blog/2021/08/09/zero-tsuku-chpt3.html
このサイトに書いてある、いろいろなところに挿入して試したのですが成功しませんでした。
shapeが違くて、行列の計算ができないためにエラーが出ているというところは理解できていますが、
どの行列と行列が違うのか、どうすれば行列のshapeを変換できるのかが分かりません。

補足情報(FW/ツールのバージョンなど)

ゼロつくは第8版です。
基本的にはゼロつく通りにコードを書いています。
環境はmacbookのM1で、safariを使用しています。
本来はanacondaでじっこうするものらしいのですが、
colabでやっていて、データの接続などが変わっていると思います。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/02/08 10:48

> #54行でエラーが出ています > shapes (784,) and (2,3) not aligned: 784 (dim 0) != 2 (dim 0) 抜粋ではなくエラーメッセージ全文を掲載ください。(ユーザー名は隠してもらってOKです)上記だけではpredict関数のどこでエラーが発生したのか分かりません。
meg_

2023/02/08 10:56 編集

質問のコードは「NameError: name 'np' is not defined」が発生しますが、これは「import numpy as np」の記載漏れということで良いでしょうか? 「NameError: name 'init_network' is not defined」も発生しました。こちらのコードも追記いただけませんか?
TsubakiTsubasa

2023/02/08 11:03

コメントありがとうございます、申し訳ございません。 プログラムに関してはど素人で、こういった質問をするのも初めてなので、お手数をおかけします。 npのエラーに関しては、事前のインポートしています。 init_networkに関しては自分も理解できていないので、よく分かってはいませんが、ゼロつくのgithub https://github.com/oreilly-japan/deep-learning-from-scratch をダウンロードして、ドライブにあげています。 自分の認識なので間違っているかもしれまんがgithubの中にあらかじめ学習されたニューラルネットワークがあるらしく、それをインポートしているのだと思います。
TsubakiTsubasa

2023/02/08 11:05

ライブラリに関しては、 import numpy as np import matplotlib.pylab as plt も入れております。 あとはANDゲートやNANDゲートを定義しただけで特に問題ないと思います。
TsubakiTsubasa

2023/02/08 11:15

すみません、伝え忘れてましたが、質問を編集して、エラーコードを追加しておきました。 あと素人の質問でほんとに申し訳ないのですが、自分のエラーコードはユーザー名は隠せていますでしょうか。 ほんとに初心者なので、何がないかわからない状態です。お手数をおかけして申し訳ございません
meg_

2023/02/08 11:17

書籍のgithubにあるコードと質問のコードを組み合わせたところでは質問のエラーは発生しないですね。 エラーが発生する行の直前に「print(f'x.shape={x.shape}, W1.shpe={W1.shape}')」を挿入して実行すると何が表示されますか?
TsubakiTsubasa

2023/02/08 11:37

以下のようなエラーになりました x.shape=(10000, 784), W1.shpe=(2, 3) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-39-a691d664334e> in <module> 2 for i in range(len(x)): 3 print(f'x.shape={x.shape}, W1.shpe={W1.shape}') ----> 4 y = predict(network, x[1]) 5 # 最も確率の高い要素のインデックスを取得 6 p = np.argmax(y) <ipython-input-37-afe61ea3081c> in predict(nework, x) 12 b1, b2, b3 = network['b1'], network['b2'], network['b3'] 13 ---> 14 a1 = np.dot(x, W1) + b1 15 z1 = sigmoid(a1) 16 a2 = np.dot(z1, W2) +b2 <__array_function__ internals> in dot(*args, **kwargs) ValueError: shapes (784,) and (2,3) not aligned: 784 (dim 0) != 2 (dim 0)
TsubakiTsubasa

2023/02/08 11:41

間違いないと思います。このURLのcodeを押して、Download ZIPを押してダウンロードされたファイルをそのままグーグルドライブに上げました。 https://github.com/oreilly-japan/deep-learning-from-scratch 一つ気になるのが、31行目の with open("sample_weight.pkl", 'rb')as f: 32 network = pickle.load(f) なのですが、自分の認識では、with open("ファイル名",’意味がわからない’)as 名前 だとおおもうのですが、このアイル名はパスを書いた方がよろしいのでしょうか
meg_

2023/02/08 12:11

エラーとは関係ないのですが、 y = predict(network, x[1]) は y = predict(network, x[i]) ではありませんか? こちらでは print(f'x.shape={x.shape}, W1.shpe={W1.shape}') で下記が表示されます。 x.shape=(784,), W1.shpe=(784, 50) Colabotoryを起動しなおして実行しても同じ結果でしょうか?モデル自体はpklファイルを読み込んでいるだけなので、重み(W1)の形が違うのは不可解です。
TsubakiTsubasa

2023/02/08 12:41

y = predict(network, x[i])に関しては読み間違いでした、ありがとうございます。 再度上記のURLでダウンロードし直して、再アップロードして新しいcolabでやってみました。 上記のコードをコピーしてやってみました。(numpyはインストールしました。) 再アップロードの関係で六行目のコードが sys.path.append('/content/drive/My Drive/zero_to_deep-learning/dataset') sys.path.append('/content/drive/My Drive/deep-learning-from-scratch-master/dataset') に変更になりました(deep-learning-from-scratch-masterがファイル名です) すると、以下のエラーに変わりました。 --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-8-f149c185c2fa> in <module> 1 # 性能を評価 2 x, t = get_data() ----> 3 network = init_network() 4 accuracy_cnt = 0 5 for i in range(len(x)): NameError: name 'init_network' is not defined
meg_

2023/02/08 12:58

from neuralnet_mnist import init_network を追加すると良いかと思います。
TsubakiTsubasa

2023/02/08 13:04

以下のようなエラーが出ます。どうすれば良いでしょうか --------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) <ipython-input-39-4891fea008b3> in <module> 1 # 性能を評価 ----> 2 from neuralnet_mnist import init_network 3 x, t = get_data() 4 network = init_network() 5 accuracy_cnt = 0 /content/drive/My Drive/deep-learning-from-scratch-master/ch03/neuralnet_mnist.py in <module> 4 import numpy as np 5 import pickle ----> 6 from dataset.mnist import load_mnist 7 from common.functions import sigmoid, softmax 8 ModuleNotFoundError: No module named 'dataset'
TsubakiTsubasa

2023/02/09 00:31

上記のコードからアップロードし直しましたが、相変わらず同じエラーが発生します。 パスの指定はこちらで間違い無いのでしょうか drive.mount('/content/drive') import sys sys.path.append('/content/drive/My Drive/deep-learning-from-scratch-master/dataset')
TsubakiTsubasa

2023/02/09 00:47

sys.path.append() ここで、with open("sample_weight.pkl", 'rb')as f:の”sample_weight.pkl”がある場所の パスを指定するという理解で良いのでしょうか。
jbpb0

2023/02/09 07:24

> このURLのcodeを押して、Download ZIPを押してダウンロードされたファイルをそのままグーグルドライブに上げました。 https://github.com/oreilly-japan/deep-learning-from-scratch 「ダウンロードされたファイル」はZIPファイルのはずですが、そのZIPファイルを「そのまま」google driveにアップロードしたのでしょうか? それとも、ダウンロードしたZIPファイルをローカルパソコンで解凍したら、たくさんのファイルやディレクトリが入ってるディレクトリができますが、そのディレクトリを(中のファイルやディレクトリを全部含めて)google driveにアップロードしたのでしょうか?
jbpb0

2023/02/09 07:36

> ModuleNotFoundError: No module named 'dataset' sys.path.append('/content/drive/My Drive/deep-learning-from-scratch-master/dataset') ↓ 変更 sys.path.append('/content/drive/My Drive/deep-learning-from-scratch-master') です 下記も必要だと思います from mnist import load_mnist ↓ 変更 from dataset.mnist import load_mnist
jbpb0

2023/02/09 07:51 編集

> with open("ファイル名",’意味がわからない’)as 名前 だとおおもうのですが、このアイル名はパスを書いた方がよろしいのでしょうか !ls -l を実行して「sample_weight.pkl」が有るなら、「with open("sample_weight.pkl", 'rb') as f:」とファイル名を書くだけで読み込めるはず もし、上記を実行して「sample_weight.pkl」が無いなら、 %cd /content/drive/My Drive/deep-learning-from-scratch-master/ch03 のようにして、「sample_weight.pkl」が有る場所にカレントディレクトリを移してください (行頭は「!」ではなく「%」です)
TsubakiTsubasa

2023/02/09 12:35

コメントありがとうございます。ファイルに関してはそのままアップロードしました。 最近MacBookを購入したのでまだ仕様を把握してないのですが、パソコン上で中身を確認できるので、 解凍できていると思います sys.path.appendのパスを変更すると以下のようなエラーが出ました。 --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-11-138fc8f4a27e> in <module> 6 print(img.shape) 7 ----> 8 img_show(img) <ipython-input-8-e2973be05260> in img_show(img) 10 11 def img_show(img): ---> 12 pil_img = Image.fromarray(np.uint8(img)) 13 display(pil_img) NameError: name 'Image' is not defined
TsubakiTsubasa

2023/02/09 12:37

!ls -lを実行すると、以下のようになりました。 total 8 drwx------ 5 root root 4096 Feb 9 12:28 drive drwxr-xr-x 1 root root 4096 Feb 7 14:38 sample_data これはsample_weight.pklがあるという状況になっているのでしょうか。 一応、withopenをパスを指定した場合でやったのですが、 name 'init_network' is not defined のエラーが出ました
jbpb0

2023/02/09 14:11 編集

> これはsample_weight.pklがあるという状況になっているのでしょうか。 なってません 「drive」と「sample_data」しかありませんよね 前のコメントにも書きましたが、 %cd /content/drive/My Drive/deep-learning-from-scratch-master/ch03 !ls -l を実行したら、「sample_weight.pkl」というファイルが表示されるはずです その状態なら、「with open("sample_weight.pkl", 'rb') as f:」とファイル名を書くだけで読み込めるはず
jbpb0

2023/02/09 14:19 編集

> NameError: name 'Image' is not defined from PIL import Image を実行し忘れたのでは? > name 'init_network' is not defined def init_neteork(): (中略) return network を実行し忘れたのでは?
TsubakiTsubasa

2023/02/10 01:16

実行す忘れというのは無いと思います。順に実行しているので %cd /content/drive/My Drive/deep-learning-from-scratch-master/ch03 !ls -l の通りに実行しても、同じように出力されます。 ドライブのアップロードの段階で何かしているのだと思います。 詳しいことはよく分かりませんが、とりあえずは、jbpb0さんの助言の  %cd /content/drive/My Drive/deep-learning-from-scratch-master/ch03  のようにして、「sample_weight.pkl」が有る場所にカレントディレクトリを移してください を参考にして、動きました。 色々親身に相談にのってくださって誠にありがとうございました。
guest

回答1

0

自己解決

もう一度テキストや、ネットを参考に調べたらうまくいきました。
以下コードになります。

Python

1import numpy as np 2import matplotlib.pylab as plt 3from google.colab import drive 4drive.mount('/content/drive', force_remount=True) 5import sys 6sys.path.append('/content/drive/My Drive/deep-learning-from-scratch-master/') 7from dataset.mnist import load_mnist 8from PIL import Image 9from IPython.display import display 10def img_show(img): 11 pil_img = Image.fromarray(np.uint8(img)) 12 pil_img.show() 13(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False) 14sys.path.append(os.pardir) 15img = x_train[0] 16label = t_train[0] 17print(label) 18 19print(img.shape) 20img = img.reshape(28, 28) 21print(img.shape) 22def sigmoid(x): 23 return 1/(1 + np.exp(-x)) 24def softmax(a): 25 c = np.max(a) 26 exp_a = np.exp(a - c) 27 sum_exp_a = np.sum(exp_a) 28 y = exp_a/sum_exp_a 29 30 return y 31from binascii import a2b_base64 32from typing_extensions import NewType 33def get_data(): 34 (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=False) 35 return x_test, t_test 36 37import pickle 38def init_network(): 39 with open("/content/drive/My Drive/deep-learning-from-scratch-master/ch03/sample_weight.pkl", 'rb') as f: 40 network = pickle.load(f) 41 return network 42 43def predict(network, x): 44 W1, W2, W3 = network['W1'], network['W2'], network['W3'] 45 b1, b2, b3 = network['b1'], network['b2'], network['b3'] 46 47 a1 = np.dot(x, W1) +b1 48 z1 = sigmoid(a1) 49 a2 = np.dot(z1, W2) +b2 50 z2 = sigmoid(a2) 51 a3 = np.dot(z2, W3) +b3 52 y = softmax(a3) 53 54 return y 55x, t = get_data() 56network = init_network() 57 58accuracy_cnt = 0 59for i in range(len(x)): 60 y = predict(network, x[i]) 61 p = np.argmax(y) 62 if p == t[i]: 63 accuracy_cnt +=1 64print("Accuracy:" + str(float(accuracy_cnt)/len(x)))

変更点としては、
・drive.mountにforce_remountを追加したのと、
・sys.path.appendのパスをファイル名までに変更
・mnistをdataset.mnistに
・with openのファイル名をそのまま指定しました。
以上になるかと思います。

なぜそうなるのかは分かりませんが、ひとまず解決したのでよかったです。
初めての質問で、質問の仕方がわからなかったり、少し緊張したのですが、
meg_さんとjbpb0さんが親身にご回答していただき大変助かりました。
本当にありがとうございました。

投稿2023/02/09 13:34

TsubakiTsubasa

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問