見出し画像

GANの学習-1-【オートエンコーダ】

初歩の初歩からしかしちょっと早めに習得する事を目的にアウトプットします。

GANはいろいろな応用が効くアルゴリズムですが、その中で使いたい内容。

特定の画像から、目的の画像に変換する。
例えばピクトを書いたら、肉付けされた可愛いキャラにそのポーズに画像が生成されるみたいな。

ビフォーアフターの衛生画像から新しい建物の生成する事を目的とする。

考えではビフォーアフターの画像は合成し差分だすわけではなく、重ねることでも差分は表現できると考え、その重なった画像から一枚の新しい建物の画像を生成すると考えてみようと思います。

うまく行くか不明。

とりあえずGANで生成することしか思いつかない。

のでGANの学習をするが今日はオートエンコーダから

オートエンコーダ

自己符号化器。どいうこと?

自分をスケールダウンしてまた自分を表現する。
何のため?

ノイズ消す&異常検知&勾配消失なくす&過学習抑制

コードの内容


import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

digits_data = datasets.load_digits()

n_img = 10  # 表示する画像の数
plt.figure(figsize=(10, 4))
for i in range(n_img):
    # 入力画像
    ax = plt.subplot(2, 5, i+1)
    plt.imshow(digits_data.data[i].reshape(8,8), cmap="Greys_r")
    ax.get_xaxis().set_visible(False)  # 軸を非表示に
    ax.get_yaxis().set_visible(False)
plt.show()

print("データの形状:", digits_data.data.shape)
print("ラベル:", digits_data.target[:n_img])
digits_data["data"][0].reshape(2,32)

なんとなく一番大きな数字は?

digits_data.data.max()

16 でした。

画像の幅と高さが8ピクセルなので、入力層には8×8=64のニューロンが必要になります。
また、出力が入力を再現するように学習するので、出力層のニューロン数は入力層と同じになります。
中間層にはこれらよりも少ないニューロンを配置します。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

import torch
from torch.utils.data import DataLoader

# -- 各設定値 --
img_size = 8  # 画像の高さと幅
n_in_out = img_size * img_size  # 入出力層のニューロン数
n_mid = 16  # 中間層のニューロン数

eta = 0.01  # 学習係数
epochs = 100
batch_size = 16
interval = 10  # 経過の表示間隔
# -- 訓練データ --
digits_data = datasets.load_digits()
x_train = np.asarray(digits_data.data)
x_train /= 16  # 0-1の範囲に
 #この状態ではまだarray 
x_train
 #ここでtensorの状態になる 。(全部でまとめてtensor)
x_train = torch.tensor(x_train, dtype=torch.float)
x_train
 #ここで1個ずつがtwensorになる
train_dataset = torch.utils.data.TensorDataset(x_train)
for x in train_dataset[0]:
print(x)
 #DataLoaderは 、Datasetを受け取ってデータからミニバッチを取り出す#DataLoaderは、配列ではなくイテラブルとなり、For文等でデータ使える #ミニバッチでDataをランダムに取り出すことができる  #PyTorchで学習するための型で返してくれる  #ここでshuffle =Trueシャッフルしている。
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
 #試しに1個だけ出してみた 。シャッフルされている。0個目が上と違う。
for j, (x,) in enumerate(train_loader):
 if j == 0:
 print(x)


モデルの構築は次回。。。

この記事が気に入ったらサポートをしてみませんか?