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

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

ただいまの
回答率

88.80%

配列の治し方(?)がわかりません

解決済

回答 1

投稿

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

iLia

score 14

エラーの内容を調べたところおそらく量が合っていないから計算をすることができないというところまではわかったのですが、どうすれば量を変えることができるのかがわかりません
reshapeを使えば変わるということまでは覚えているのですが、この場合どう書けばいいのかわかりませんでした。
教えてください。
お願いします。

# -*- 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 update_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 = network.loss(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 104, in <module>
network.update_params(x_batch,t_batch)
File "number.py", line 70, in update_params
grad = gradient(loss_W, self.params[key])
File "number.py", line 44, in gradient
grad[index] = gradient_sub(f,xx)
File "number.py", line 31, in gradient_sub
fx1 = f(x)
File "number.py", line 68, in <lambda>
loss_W = lambda W: self.loss(x,t)
File "number.py", line 75, in loss
y = self.predict(x)
File "number.py", line 61, in predict
a0 = np.dot(x,self.params["w0"]) + self.params["b0"]
ValueError: shapes (100,28,28) and (64,50) not aligned: 28 (dim 2) != 64 (dim 0)
と出ます

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

(train_X, test_X), (train_T,test_T ) = mnist.load_data()
でした

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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