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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1527閲覧

ゼロから作るDeep Learningの3章の辞書変数の疑問

toyota

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/02/02 06:29

編集2019/02/02 15:47

ゼロから作るDeep Learningの3章3.4.3の説明

 下記のページの説明で変数「network」は辞書形式で定義されていると思います。
この内容は容易に理解できます。

実装まとめ

Python

1  def init_network(): # """重みとバイアスの初期化""" 2   network = {} 3   network['W1'] = np.array([[.1, .3, .5], [.2, .4, .6]]) 4    network['W2'] = np.array([[.1, .4], [.2, .5], [.3, .6]]) 5    network['W3'] = np.array([[.1, .3], [.2, .4]]) 6    network['b1'] = np.array([.1, .2, .3]) 7    network['b2'] = np.array([.1, .2]) 8   network['b3'] = np.array([.1, .2]) 9 10    return network 11 12  def forward(network, x): # """入力信号が出力へと変換されるプロセス""" 13    W1, W2, W3 = network['W1'], network['W2'], network['W3'] 14   b1, b2, b3 = network['b1'], network['b2'], network['b3']

ゼロから作るDeep Learningの3章3.6.2のニューラルネットワークの推論処理では

  構造は同じようですが、何処にもnetworkを辞書で初期化してなくて、なぜ、このように記述して
実行して結果ができるのがわかりません。理由を教えてください。お願いします。
pickle.load(f)関数のソースをみてもピンときませんでした。

Python

1  import sys, os 2  sys.path.append(os.pardir) # 親ディレクトリのファイルをインポートするための設定 3  import numpy as np 4  import pickle 5  from dataset.mnist import load_mnist 6  from common.functions import sigmoid, softmax 7 8  def get_data(): # """学習データのロード""" 9    (x_train, t_train), (x_test, t_test) = \ 10    load_mnist(normalize=True, flatten=True, one_hot_label=False) 11    return x_test, t_test 12 13  def init_network(): # """sample_weight.pklに保存された学習済み重みパラメータの読み込み""" 14    with open("sample_weight.pkl", 'rb') as f: 15     network = pickle.load(f) 16 17    return network 18 19  def predict(network, x): 20    W1, W2, W3 = network['W1'], network['W2'], network['W3'] 21    b1, b2, b3 = network['b1'], network['b2'], network['b3']

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

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

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

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

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

hayataka2049

2019/02/02 06:33

ちょっと読むのが困難なので、https://teratail.com/tour を参考にシンタックスハイライト・マークダウンでコードを囲い見やすくしてください。 sample_weight.pklは書籍の著者などが提供しているものですか?
toyota

2019/02/02 06:56

見やすくするように編集します。ご指摘のpklは、そのようで、以下のGitHubから提供されています。 https://github.com/oreilly-japan/deep-learning-from-scratch/tree/master/ch03 書籍内の説明では、init_network()では、pickleファイルのSample_Weight.Pklに保存された学習済みの 重みパラメーターを読み込みます。このファイルには、重みとバイアスのパラメーターがディクショナリ型の変数として保存されていると説明されています。 私の疑問はなぜ、init_network()内で以下のような空の辞書設定と”W1”などのキーに値の要素を入れる記述がないのかが理解できなくて質問しました。 network = {} network['W1'] = np.array([[.1, .3, .5], [.2, .4, .6]]) network['W2'] = np.array([[.1, .4], [.2, .5], [.3, .6]]) network['W3'] = np.array([[.1, .3], [.2, .4]]) network['b1'] = np.array([.1, .2, .3]) network['b2'] = np.array([.1, .2]) network['b3'] = np.array([.1, .2])
quickquip

2019/02/02 09:41

解決したとしても質問は編集しましょう
toyota

2019/02/02 14:49

編集したつもりです。
toyota

2019/02/02 14:53

これでは不足だとしたら、もし可能であれば、編集の手法を砕いて説明ください
quickquip

2019/02/02 15:03

質問のソースがまともに読めている、というのはつまりPythonのコードにとって大事になるインデントがまともにあるように見えていますか? https://teratail.com/tour#animateBox2 のシンタックスハイライト・マークダウンの項、 https://teratail.com/tour のhttps://teratail.com/help#about-template のコードを入力の部分、 https://teratail.com/help/question-tips#questionTips3-5-1 のソースコードを書きましょうの項、前提としてのマークダウンについて調べるなどなど、色々と見るべきところはあるはずです。 https://teratail.com/help#about-teratail の 価値のあるコンテンツを世の中に残し届ける事を目的としています。 なども参考にお願いします。
toyota

2019/02/02 15:24

インテントは、抜けている事は修正必要ですね。コピペだと、インテントが抜けてしまったようです。修正します
quickquip

2019/02/02 15:29

"コピペだとインテントが抜ける"のではありません。 コードがちゃんと表示されるような記法を使ってください。 ```で行の前後を括るか、コード部分を選択して <code> というボタンを押してみてください。
toyota

2019/02/02 15:34

インテントやコメントの位置を正しく合わせたのですが、更新すると頭が面一になります。なぜでしょう? 編集モードでは正しく表記されてますが・・・・
toyota

2019/02/02 15:46

わかりました使い方
toyota

2019/02/02 15:50

いろいろありがとうございました。
guest

回答1

0

ベストアンサー

pickleは辞書などのPythonオブジェクトをそのままファイルなどに保存できる機能です。
以下のようにファイルから読み込むことで辞書がそのまま復元されます。
sample_weight.pklにも同様にinit_networkで構築されたものと同じ辞書データが格納されています。

Python

1import pickle 2a = {1:'a'} 3with open('test.pkl','wb') as f: 4 pickle.dump(a,f) # 保存 5 6with open('test.pkl','rb') as f: 7 b = pickle.load(f) # 復元 8print(b) # {1: 'a'}

投稿2019/02/02 06:43

can110

総合スコア38233

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

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

toyota

2019/02/02 07:19 編集

理解しました。ありがとうございます。 nettoworkをprint表示して、辞書内容を確認してたつもりでしたが、データ構造が大きくて見落としていました。確かにpklファイルには、事前に”W1”、"W2"、”W3"、"b1”、"b2”、"b3”の各キーが設定されて、各キーの長い値の要素が入っていました。そして、変数には、辞書形式の値を、そのまま入れるので初期化から不要ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問