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

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

新規登録して質問してみよう
ただいま回答率
85.48%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

1899閲覧

Pythonの勾配法の実装でTypeErrorが出る

chizu-daisuki

総合スコア10

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2018/07/25 00:15

前提・実現したいこと

機械学習初学者の者です。O'Reilly社の「ゼロから作るDeepLearning」の114〜117ページのコードを写経していたのですが、勾配を求める処理net.numerical_gradient()中の重みパラメタW1について勾配を求値するnumerical_gradient(loss_W, self.params['W1'])内のgrad[idx] = (fxh1 - fxh2) / (2*h)で、以下のようなエラーが発生します。

File "sdg1.py", line 89, in numerical_gradient grads['W1'] = numerical_gradient(loss_W, self.params['W1']) File "sdg1.py", line 29, in numerical_gradient grad[idx] = (fxh1 - fxh2) / (2*h) TypeError: unsupported operand type(s) for -: 'NoneType' and 'NoneType'

numerical_gradient()を本付属のURLから入手したコードに置き換えても同様のエラーが発生します。自分なりに考えられるものは色々と試しては見たのですが、どうにも埒が明きません。ご教授いただけると助かります。

コード (sdg1.py)

Python

1#import sys, os 2#sys.path.append(os.pardir) 3#from common.functions import * 4#from dlfsm.common.gradient import numerical_gradient 5import numpy as np 6 7def sigmoid(x): 8 return 1 / (1 + np.exp(-x)) 9 10def softmax(a): 11 c = np.max(a) 12 exp_a = np.exp(a - c) 13 sum_exp_a = np.sum(exp_a) 14 y = exp_a / sum_exp_a 15 return y 16 17def numerical_gradient(f, x): 18 h = 1e-4 # 0.0001 19 grad = np.zeros_like(x) 20 it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite']) 21 while not it.finished: 22 idx = it.multi_index 23 tmp_val = x[idx] 24 x[idx] = float(tmp_val) + h 25 fxh1 = f(x) # f(x+h) 26 27 x[idx] = tmp_val - h 28 fxh2 = f(x) # f(x-h) 29 grad[idx] = (fxh1 - fxh2) / (2*h) 30 31 x[idx] = tmp_val # 値を元に戻す 32 it.iternext() 33 34 return grad 35 36 37def cross_entropy_error(y, t, label=False): 38 39 if y.ndim == 1: 40 t = t.reshape(1, t.size) 41 y = y.reshape(1, y.size) 42 batch_size = y.shape[0] 43 delta = 0 44 if label == True: 45 return -np.sum(np.log(y[np.arange(batch_size), t]) + delta) / batch_size 46 else: 47 return -np.sum(t * np.log(y + delta)) / batch_size 48 49 50class TwoLayerNet: 51 52 def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01): 53 54 #重みの初期化 55 self.params = {}; 56 self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) 57 self.params['b1'] = np.zeros(hidden_size) 58 self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size) 59 self.params['b2'] = np.zeros(output_size) 60 61 def predict(self, x): 62 W1, W2 = self.params['W1'], self.params["W2"] 63 b1, b2 = self.params['b1'], self.params["b2"] 64 65 a1= np.dot(x, W1) + b1 66 z1 = sigmoid(a1) 67 a2 = np.dot(z1, W2) + b2 68 y = softmax(a2) 69 70 return y 71 72 def loss(self, x, t): 73 y = self.predict(x) 74 75 return cross_entropy_error(y, t) 76 77 def accuracy(self, x, t): 78 y = predict(x) 79 y = np.argmax(y, axis=1) 80 t = np.argmax(t, axis=1) 81 82 accuracy = np.sum(y == t) / float(x.shape[0]) 83 return accuracy 84 85 def numerical_gradient(self, x, t): 86 loss_W = lambda W: self.loss(x, t) 87 88 grads = {} 89 grads['W1'] = numerical_gradient(loss_W, self.params['W1']) 90 grads['b1'] = numerical_gradient(loss_W, self.params['b1']) 91 grads['W2'] = numerical_gradient(loss_W, self.params['W2']) 92 grads['b2'] = numerical_gradient(loss_W, self.params['b2']) 93 94 return grads 95 96net = TwoLayerNet(input_size=784, hidden_size=100, output_size=10) 97print(net.params['W1'].shape) 98print(net.params['b1'].shape) 99print(net.params['W2'].shape) 100print(net.params['b2'].shape) 101 102x = np.random.rand(100, 784) 103y = net.predict(x) 104print(y) 105 106x = np.random.rand(100, 784) 107t = np.random.rand(100, 10) 108 109grads = net.numerical_gradient(x, t) 110print(grads) 111

(※)PythonのバージョンはAnacondaの3.6.4です。

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

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

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

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

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

tachikoma

2018/07/25 00:26

accuracyの中のpredictはself.predictですかね。
chizu-daisuki

2018/07/25 00:34 編集

あっ、そうですね。ご指摘ありがとうございます。self.predictですね。
guest

回答1

0

ベストアンサー

関数はreturn文が実行されなかった場合、Noneを返します。

cross_entropy_error()y.ndim == 1Falseのとき、返り値がNoneになるのが問題なのでしょう。

python

1 def loss(self, x, t): 2 y = self.predict(x) 3 4 return cross_entropy_error(y, t) # ここでNoneが返るのかな 5 6 # ...中略 7 8 def numerical_gradient(self, x, t): 9 loss_W = lambda W: self.loss(x, t) # self.loss()を使う

投稿2018/07/25 00:36

編集2018/07/25 00:39
hayataka2049

総合スコア30933

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

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

chizu-daisuki

2018/07/25 00:44

そうか、インデントを間違えて全処理がif内に入っていたからNoneが返っていたのですね。ご回答本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問