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

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

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

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

Q&A

1回答

2039閲覧

pythonでのエラー(beyond my capacity)

kosuke1126

総合スコア12

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

0グッド

0クリップ

投稿2016/12/18 08:39

編集2022/01/12 10:55

大学4回の研究生です。
研究でニューラルネットワークを用いた機械学習を行いたいのですが、pythonのプログラムが全く通りません。プログラム自体は間違っていないはずなのでpathの通し方が悪いんでしょうが…

投げやりのようで申し訳ないのですがこのプログラムを通すためのアドバイスをお願いします。どういうエラーかはわかりますが直しかたが全く分かりません。長すぎてコメント等はところどころ消してますがもとになるプログラムは http://aidiary.hatenablog.com/entry/20140522/1400763709 にあります。

Directory: /data/0deg_30deg_0811/sleep1 1000 files found in sleep1. Total: 1000 files found in /data/0deg_30deg_0811/sleep1. Total: 0 files found in /data/0deg_30deg_0811/sleep1. Traceback (most recent call last): File "C:\python\NN\mlp_cg.py", line 242, in <module> data=images.reshape(len(images), -1) ValueError: total size of new array must be unchanged
#coding: utf-8 import numpy as np from scipy import optimize from matplotlib import pyplot from sklearn.datasets import load_digits, fetch_mldata from sklearn.preprocessing import LabelBinarizer from sklearn.metrics import confusion_matrix, classification_report # import os from scipy.misc import imresize from scipy.misc import imread import pickle tdatanum = 500 def displayData(X, fname): """ データからランダムに100サンプル選んで可視化 画像データは8x8ピクセルを仮定 """ pyplot.clf() # ランダムに100サンプル選ぶ sel = np.random.permutation(X.shape[0]) sel = sel[:100] X = X[sel, :] for index, data in enumerate(X): pyplot.subplot(10, 10, index + 1) pyplot.axis('off') image = data.reshape((80, 40)) pyplot.imshow(image, cmap=pyplot.cm.gray_r, interpolation='nearest') # pyplot.show() pyplot.savefig(fname) def randInitializeWeights(L_in, L_out): # 入力となる層にはバイアス項が入るので+1が必要なので注意 epsilon_init = 0.12 W = np.random.rand(L_out, 1 + L_in) * 2 * epsilon_init - epsilon_init return W def sigmoid(z): return 1.0 / (1 + np.exp(-z)) def sigmoidGradient(z): return sigmoid(z) * (1 - sigmoid(z)) def safe_log(x, minval=0.0000000001): return np.log(x.clip(min=minval)) def nnCostFunction(nn_params, *args): """NNのコスト関数とその偏微分を求める""" in_size, hid_size, num_labels, X, y, lam = args # ニューラルネットの全パラメータを行列形式に復元 Theta1 = nn_params[0:(in_size + 1) * hid_size].reshape((hid_size, in_size + 1)) Theta2 = nn_params[(in_size + 1) * hid_size:].reshape((num_labels, hid_size + 1)) # パラメータの偏微分 Theta1_grad = np.zeros(Theta1.shape) Theta2_grad = np.zeros(Theta2.shape) # 訓練データ数 m = X.shape[0] # 訓練データの1列目にバイアス項に対応する1を追加 X = np.hstack((np.ones((m, 1)), X)) # 教師ラベルを1-of-K表記に変換 lb = LabelBinarizer() lb.fit(y) y = lb.transform(y) J = 0 for i in range(m): xi = X[i, :] yi = y[i] # forward propagation a1 = xi z2 = np.dot(Theta1, a1) a2 = sigmoid(z2) a2 = np.hstack((1, a2)) z3 = np.dot(Theta2, a2) a3 = sigmoid(z3) J += sum(-yi * safe_log(a3) - (1 - yi) * safe_log(1 - a3)) # backpropagation delta3 = a3 - yi delta2 = np.dot(Theta2.T, delta3) * sigmoidGradient(np.hstack((1, z2))) delta2 = delta2[1:] # 行数に-1を指定すると自動的に入る delta2 = delta2.reshape((-1, 1)) delta3 = delta3.reshape((-1, 1)) a1 = a1.reshape((-1, 1)) a2 = a2.reshape((-1, 1)) # 正則化ありのときのデルタの演算 Theta1_grad += np.dot(delta2, a1.T) Theta2_grad += np.dot(delta3, a2.T) J /= m # 正則化項 temp = 0.0; for j in range(hid_size): for k in range(1, in_size + 1): # バイアスに対応する重みは加えない temp += Theta1[j, k] ** 2 for j in range(num_labels): for k in range(1, hid_size + 1): # バイアスに対応する重みは加えない temp += Theta2[j, k] ** 2 J += lam / (2.0 * m) * temp; # 偏微分の正則化項 Theta1_grad /= m Theta1_grad[:, 1:] += (lam / m) * Theta1_grad[:, 1:] Theta2_grad /= m Theta2_grad[:, 1:] += (lam / m) * Theta2_grad[:, 1:] # ベクトルに変換 grad = np.hstack((np.ravel(Theta1_grad), np.ravel(Theta2_grad))) print "J =", J return J, grad def predict(Theta1, Theta2, X): m = X.shape[0] num_labels = Theta2.shape[0] # forward propagation X = np.hstack((np.ones((m, 1)), X)) h1 = sigmoid(np.dot(X, Theta1.T)) h1 = np.hstack((np.ones((m, 1)), h1)) h2 = sigmoid(np.dot(h1, Theta2.T)) return np.argmax(h2, axis=1) if __name__ == "__main__": # 入力層のユニット数 in_size = 80 * 40 # J = 0.09091 iteration=165 # 隠れ層のユニット数 hid_size = 45 #25 # hid_size = 11 # 出力層のユニット数(=ラベル数) # num_labels = 10 # for digits num_labels = 2 # 訓練データをロードするための準備 # ファイル数を調べるための変数 nFiles = 0 # 訓練データを入れておくディレクトリ # このディレクトリの下に # 1/ # 2/ # 3/ ... # というディレクトリを作りその下に訓練用の画像を入れておく # ここで1,2,3..は、識別するラベル番号に相当する path = '/data/0deg_30deg_0811/sleep1' # ディレクトリ毎にファイルが何個あるか調べる for root, dirs, files in os.walk(path): print 'Directory: %s' % root nsubFiles = 0 for f in files: #subdir = root.split('/') #print '%d' % int(subdir[-1]) r,e = os.path.splitext(f) if e.lower() == '.png': nFiles += 1 nsubFiles += 1 if nsubFiles != 0: print '%d files found in %s.' % (nsubFiles, root.split('/')[-1]) print 'Total: %d files found in %s.' % (nFiles, path) # Initialization # # 訓練画像のサイズ height = 80 width = 40 # ラベルを入れるための配列 target = np.zeros(nFiles, dtype=np.int) # 訓練画像を入れるための配列 images = np.zeros((nFiles, height, width), dtype=np.float32) # ディレクトリを辿ってラベル、画像を格納する nFiles = 0 for root, dirs, files in os.walk(path): # print 'Directory: %s' % root subdir = root.split('/') if subdir[-1] == 'sleep1': continue nsubFiles = 0 for f in files: #print '%d' % int(subdir[-1]) target[nFiles] = int(subdir[-1])-1 r,e = os.path.splitext(f) if e.lower() == '.png': # print '%s' % root+'/'+f img = imresize(imread(root+'/'+f), (height,width), interp='bilinear') image = np.asarray(img, dtype=np.float32) image /= 255.0 # scale uint8 coded colors to the [0.0, 1.0] floats images[nFiles, ...] = image nFiles += 1 nsubFiles += 1 if nsubFiles != 0: print '%d files found in %s.' % (nsubFiles, root.split('/')[-1]) print 'Total: %d files found in %s.' % (nFiles, path) # print "image:shape: ", image.shape # print "images:shape: ", images.shape indices = np.arange(nFiles) np.random.RandomState(42).shuffle(indices) images, target = images[indices], target[indices] data=images.reshape(len(images), -1) # print "data:shape = ",data.shape # ラベル、訓練画像を、学習用の配列に格納し直す X = data X = X.astype(np.float64) X /= X.max() y = target # データをシャッフル p = np.random.permutation(len(X)) X = X[p, :] y = y[p] # 最初の5000サンプル(digits)を選択 # 最初の2500サンプル(mimamori)を選択 X_train = X[:tdatanum, :] y_train = y[:tdatanum] # print "X:shape = ",X_train.shape # print "y:shape = ",y_train.shape # ------------ ここからあとは、編集する必要なし ----------------- # データを可視化 displayData(X_train, 'train.png') # パラメータ(NNの重み)をランダムに初期化 initial_Theta1 = randInitializeWeights(in_size, hid_size) initial_Theta2 = randInitializeWeights(hid_size, num_labels) # パラメータをベクトルにフラット化 initial_nn_params = np.hstack((np.ravel(initial_Theta1), np.ravel(initial_Theta2))) # 正則化係数 lam = 1.0 # 初期状態のコストを計算 J, grad = nnCostFunction(initial_nn_params, in_size, hid_size, num_labels, X_train, y_train, lam) # Conjugate Gradientでパラメータ推定 # NNはコスト関数と偏微分の計算が重複するため同じ関数(nnCostFunction)にまとめている # この場合、fmin_cgではなくminimizeを使用するとよい # minimize()はscipy 0.11.0以上が必要 res = optimize.minimize(fun=nnCostFunction, x0=initial_nn_params, method="CG", jac=True, options={'maxiter':200, 'disp':True}, args=(in_size, hid_size, num_labels, X_train, y_train, lam)) nn_params = res.x # パラメータを分解 Theta1 = nn_params[0:(in_size + 1) * hid_size].reshape((hid_size, in_size + 1)) Theta2 = nn_params[(in_size + 1) * hid_size:].reshape((num_labels, hid_size + 1)) # 隠れユニットを可視化 displayData(Theta1[:, 1:], 'hide.png') # 訓練データのラベルを予測して精度を求める pred = predict(Theta1, Theta2, X_train) # print "pred:shape = ", pred.shape print "*** training set accuracy" print confusion_matrix(y_train, pred) print classification_report(y_train, pred) # ------------ ここまで編集する必要なし ----------------- # 訓練データとかぶらない範囲からテストデータを選んで精度を求める print "*** test set accuracy" # X_test = X[10000:12000, :] # y_test = y[10000:12000] X_test = X[tdatanum:, :] y_test = y[tdatanum:] pred = predict(Theta1, Theta2, X_test) print len(pred) print confusion_matrix(y_test, pred) print classification_report(y_test, pred) # save weightings (Theta1, Theta2) in the NN # 学習後の重みをpkl形式で保存(後で使用するため) f = open('weightings.pkl','wb') pickle.dump(Theta1,f) pickle.dump(Theta2,f) f.close()

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

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

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

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

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

ikedas

2016/12/18 13:36

エラーメッセージをトレースバック含めて示していただけますか。
kosuke1126

2016/12/18 14:12

失礼しました。編集しておきました
guest

回答1

0

python

1data=images.reshape( (len(images), -1) )

に変更したらどうなりますか?

投稿2016/12/20 09:44

Lhankor_Mhy

総合スコア35860

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問