Conditional GANのone-hot表現を利用した条件付けのコードを読む

データのロード部分の実装を読む

次元をひとつ追加している  (60000, 28, 28)->(60000, 28, 28,1)

(X_train, y_train), (_, _) = mnist.load_data()
 X_train = (X_train.astype(np.float32) - 127.5)/127.5
 X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], X_train.shape[2],1)

学習用のデータ整形

r_img = X_train[index*batch_size:(index+1)*batch_size] #スライスによって実データの画像をバッチサイズ分切り出している (32, 28, 28, 1)
label_batch = y_train[index*batch_size:(index+1)*batch_size] #スライスによってバッチサイズ一つぶんのラベルを切り出している
r_img_10 = np.array([label2images(i) for i in label_batch]) # 実データラベルの10ch画像 r_img_10.shape=(batch_size, img_row, img_col, num_classes)

Discriminatorへのone-hotベクトルの埋め込みの実装を読む

r_imgとr_img_10をcondcatenateしてr_img_11を作るときの次元について

r_imgの次元は(batch_size,img_col,img_row,1) r_img_10の次元は(batch_size,img_col,img_row,num_classes) これをconcatenateする

r_img_11 = np.concatenate((r_img, r_img_10),axis=3)

11次元のベクトルがbatch_sizeimg_colimg_row個並んでるtensorというイメージ アルゴリズムとしては画像を11枚用意してつなぐと説明されるが、実装は異なる

埋め込みに使われたtensor(f_img)の次元について

下記のlabel2image関数はone-hotベクトル化されたラベルを画像の次元(mnistなら28*28)用意する。

 def label2images(label):
        images = np.zeros((img_width,img_height,num_classes))#img=(5,5)の場合
        images[:,:,label] += 1
        return images
array([[[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]],

       [[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]],

       [[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]],

       [[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]],

       [[0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]]])


noise_y_intによって条件付けに使うラベルをランダムにバッチサイズの個数用意する

noise_y_int = np.random.randint(0,num_classes,batch_size) # label番号を生成する乱数,batch_size=4で考える
noise_y_int
array([1, 6, 6, 0])

参考

github.com