# -*- coding: utf-8 -*-
import keras
from keras.datasets import mnist
import matplotlib
from matplotlib import pyplot
import numpy as np
from sklearn import datasets
from sklearn.model_selection import cross_val_score as crv
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def softmax(x):
expX = np.exp(x)
return expX / np.sum(expX)
def cross_entropy_error(y,t):
delta = 1e-7
batch_size = y.shape[0]
idx= np.arange(batch_size)
return -np.sum(np.log(y[idx,t]+delta)) / batch_size
def gradient(f,x):
if x.ndim == 1:
return gradient_sub(f,x)
else:
grad = np.zeros_like(x)
for index, xx in enumerate(x):
grad[index] = gradient_sub(f,xx)
return grad
def gradient_sub(f,x):
h = 1e-4
grad = np.zeros_like(x)
for i in range(x.size):
val = x[i]
x[i] = val + h
fx1 = f(x)
x[i] = val - h
fx2 = f(x)
grad[i] = (fx1 - fx2) / (2*h)
x[i] = val
return grad
class SampleNetwork:
def __init__(self):
input_size = 64
hidden_size = 50
output_size = 10
self.params = {}
self.params["w0"] = 0.01 * np.random.randn(input_size,hidden_size)
self.params["w1"] = 0.01 * np.random.randn(hidden_size,output_size)
self.params["b0"] = np.zeros(hidden_size)
self.params["b1"] = np.zeros(output_size)
self.learning_rate = 0.1
def predict(self,x):
a0 = np.dot(x,self.params["w0"]) + self.params["b0"]
z0 = sigmoid(a0)
a1 = np.dot(z0,self.params["w1"]) + self.params["b1"]
y = softmax(a1)
return y
def updata_params(self,x,t):
loss_W = lambda W: self.loss(x,t)
for key in self.params.keys():
grad = gradient(loss_W, self.params[key])
self.params[key] -= self.learning_rate*grad
def loss(self,x,t):
y = self.predict(x)
return cross_entropy_error(y,t)
def accurary(self,x,t):
y = self.predict(x)
y = np.argmax(y,axis=1)
acc = np.sum(y==t) / float(x.shape[0])
return acc
digits = datasets.load_digits()
X = digits.data
T = digits.target
(train_X, train_T), (test_X, test_T) = mnist.load_data()
network = SampleNetwork()
batch_size = 100
iter_num = 300
train_size = train_X.shape[0]
erpoch_size = max(train_size//batch_size,1)
loss_list = []
train_accurary_list = []
test_accurary_list = []
for index in range(iter_num):
batch_choice = np.random.choice(train_size,batch_size)
x_batch = train_X[batch_choice]
t_batch = train_T[batch_choice]
network.update_params(x_batch,t_batch)
loss_list.append(loss)
if (index % erpoch_size == 0):
train_accurary = network.accurary(train_X,train_T)
test_accurary = network.accurary(test_X,test_T)
train_accurary_list.append(train_accurary)
test_accurary_list.append(test_accurary)
pyplot.figure(figsize=(10,7))
pyplot.subplot(2,2,1)
pyplot.plot(np.arange(len(loss_list)),loss_list)
pyplot.xlabel("iteration")
pyplot.title("Cross Entropy Error")
pyplot.subplot(2,2,2)
pyplot.plot(np.arange(0,len(train_accurary_list),1),train_accurary_list,"b")
pyplot.plot(np.arange(0,len(test_accurary_list),1),test_accurary_list,"ro")
pyplot.xlabel("iteration(epoch)")
pyplot.title("Accuary")
pyplot.legend(("train","test"),loc = "lowrer right")
pyplot.tight_layout()
#エラー
Using TensorFlow backend.
Traceback (most recent call last):
File "number.py", line 103, in <module>
network.update_params(x_batch,t_batch)
AttributeError: 'SampleNetwork' object has no attribute 'update_params'
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
AttributeError: 'SampleNetwork' object has no attribute 'update_params'
というエラーが出ていて、
network.update_params(x_batch,t_batch)
や
network.accurary(test_X,test_T)
と記載して呼び出しているのであれば、
def predict(self,x):
def updata_params(self,x,t):
def loss(self,x,t):
def accurary(self,x,t):
がインデントが不足しているので、クラスのメソッドになっていないということではないでしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
y_waiwai
2019/05/03 20:29
このままではコードが読めないので、質門を編集し、<code>ボタンで、出てくる’’’の枠の中にコードを貼り付けてください
iLia
2019/05/03 20:32
わかりました。
iLia
2019/05/03 20:34
こういった形でよろしいでしょうか?
mistn
2019/05/04 02:32
https://teratail.com/help/question-tips#questionTips3-5
ここを参考にソースコードを書いてみてください。
あとエラーも一部分ではなくコンソールに出たものをそのまま記載するのが良いかと思います。