Numpyの次元の追加と入れ替え
画像をnumpy配列にしたい
Numpyの次元の追加と入れ替え
次元の追加
追加したいデータが入った変数[np.newaxis, :, :]
一次元追加
x.shapeが(3,5)だったら
x = x[np.newaxis, :, :]を入力すると
x.shapeは(1,3,5)になる
入れ替え
入れ替えたいデータが入った変数.transpose(2,0,1)みたいに入力
x.shapeが(1,3,5)のとき、1,3,5はインデックス0,1,2にそれぞれ対応している
なのでx = x.transpose(2,0,1)を実行すると
x.shapeは(5,1,3)になる。
東大の松尾研究室が出した無償の演習コンテンツ
東大の松尾豊准教授の研究室がデータサイエンティストを目指す人に向けて、機械学習に関する講義内容を無償公開されました。
以下のホームページでファイルのダウンロードができます。
グローバル消費インテリジェンス寄附講座演習コンテンツ 公開ページ | 東京大学松尾研究室 - Matsuo Lab
weblab_dlb.7z というファイルがダウンロードできていると思います。
圧縮ファイルなので解凍します。
以下のサイトで解凍ソフトがダウンロードできます。すでにある方はそのまま解凍してください。
次にjupyter notebookを準備します。
Anacondaを過去にインストールしたことがある方はすでに入っていると思います。
python -m pip install --upgrade pip
python -m pip install jupyter
jupyter notebook
を入力すればインストールできます。
ちなみにpython3系の方はpython3と入力してください。
Anacondaもpythonも入っていない方はとりあえずAnacondaをインストールすればよいのではないでしょうか。
最後にjupyterでダウンロードしたファイルを開けば講義資料が出てくるので、学習が始められます。
私も今から始めます。とても楽しみです。
pythonのlenとrangeとrandom
リストからランダムに一つのの要素を取り出す
import random
random.choice(リスト)で一つの要素を返す。
Ex. target = [1,2,3,4,5]
print(random.choice(target))
実行
>>3
range()関数for文とよく使う
Ex. for a in range(3)
print(“A”)
>>AAA
len()関数はリストの大きさを返してくれる。
numpyのuniformとreshape
uniform
random.uniform(low,high)
low以上high未満の一様乱数を1個生成
np.random.uniform(low, high,size)
low以上high未満の一様乱数をsize個の配列を生成
Ex. np.random.uniform(-1, 1, 100)の場合、
-1以上1未満の一様乱数を100個生成
[0.323, 0.313, 0.55,・・・]みたいな。
np.random.uniform(-1, 1, (100,1,1))の場合
reshape
配列の次元数や大きさを調査する。
X = np.arrange(9)
>>array([0, 1, 2, 3, 4, 5, 6, 7, 8])
X = np.arrange(9).reshape(3, 3)
>>array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
みたいに一次元配列を多次元に変えてくれる。
逆に多次元配列を一次元配列に変えるには
x.reshape(-1,)
>>array([0, 1, 2, 3, 4, 5, 6, 7, 8])となる
x.reshape(1, 100, 1, 1)の場合
GANで生成した画像をベクトル化するVevtorizer実装
VEVTORIZER実装続き
エラー
AttributeError: 'VectorizerUpdater' object has no attribute 'vec_optimizer'
vec_optimizerではなくget_optimizer修正
エラー
TypeError: 'type' object cannot be interpreted as an integer
z = Variable(xp.asarray(gen.make_hidden(batchsize, self.device)))#100次元ベクトルの生成
x_fake = gen(z)#3次元の偽画像をGeneraterで生成
vec_array = vec(x_fake)#偽画像をVectorizerで読み込み配列化
100次元の乱数ベクトルを生成するところをHiddenDatasetsというClassでデータセットとしてまとめていたが、よくわからなくなったのでVectorizerUpdater()に乱数ベクトルを生成する関数を追加した。
引数とかもよくわからなくなったので、
def __init__に
n_hidden = 100
self.n_hidden = n_hiddenを無理やり追加して初期値を設定した。
net.pyに作ったVectorizerのモデルは、Descripterのモデルの全結合層のところを変えて、出力が100次元になるようにした。
make_hiddenメソッドを二か所で用いて、二種類の乱数配列を生成していた。
なのでupdaterを大幅改変してデータセットで作った乱数配列を作るようにした。
二乗誤差関数
chainer.functions.mean_squared_error(random_array, vec_array)
random_arrayとvec_arrayの配列が[1,100,1,1]と[1,100]で誤差の計算が行えずにエラーが出た。
なのでデータセットで生成されるrandom_arrayの型を変更して型を合わせたらエラーが治った。
pythonのクラスとインスタンスについて
クラスとインスタンス
passは何も処理がないことを表す
クラスとは設計図のことで、クラスを実際に使えるものとして変換したものをインスタンスという。
インスタンスはクラス()とすることで生成できる。
クラスの中で定義した関数をメソッドと呼ぶ。
メソッドdef 関数名(self): 第一引数にselfを追加する必要がある。
例えば
Carというクラスを作って、インスタンス化して
car_1 = Car() に代入します。
クラスの中に変数を定義したいときは、
car_1.name = “TOYOTA”みたいに呼び出せます。
またクラスの中で定義したメソッドを呼び出したいときは
car_1.メソッド名()のようにして使用できます。
__init__メソッドはself.name = 値のように定義してあげると
インスタンス作成時にインスタンス変数として扱えるようになるというものです。
つまり
def __init__
self.name = ‘TOYOTA’
と定義しておけば
car_1 = Car()とインスタンスを生成しただけで、
car.nameは’TOYOTA’という文字列をを持っています。