Ejemplo n.º 1
0
    def __init__(self):
        self.G_is_train = tf.placeholder(tf.bool)
        self.D_is_train = tf.placeholder(tf.bool)
        self.input_X = tf.placeholder(tf.float32, shape=(None, 28 * 28))

        # t0は0のラベルを格納し、t1は1のラベルを格納する
        self.label_t0 = tf.placeholder(tf.float32, shape=(None, 1))
        self.label_t1 = tf.placeholder(tf.float32, shape=(None, 1))

        # Generator
        self.generator = gen.Generator(device_name=self.device_name)
        # 生成モデルに必要なノイズの入れ物
        self.gen_z = tf.placeholder(tf.float32, shape=(None, 100))
        # Discrimitor
        self.discrimitor = dis.Discrimitor(device_name=self.device_name)

        # weight decay
        gen_norm_term = tf.nn.l2_loss(self.generator.gen_w2) + tf.nn.l2_loss(
            self.generator.gen_w3)
        gen_lambda_ = 0.001

        dis_norm_term = tf.nn.l2_loss(self.discrimitor.dis_w2) + tf.nn.l2_loss(
            self.discrimitor.dis_w3)
        dis_lambda_ = 0.001

        # 訓練データの識別予測
        input_X = self.discrimitor.run(self.input_X,
                                       is_train=self.D_is_train,
                                       device_name=self.device_name)

        # 生成されたデータの識別予測
        generated_X = self.discrimitor.run(self.generator.run(
            z=self.gen_z,
            is_train=self.G_is_train,
            device_name=self.device_name),
                                           is_train=self.D_is_train,
                                           device_name=self.device_name)

        self.dis_entropy_X = tf.nn.sigmoid_cross_entropy_with_logits(
            labels=self.label_t1, logits=input_X)
        self.dis_entropy_G = tf.nn.sigmoid_cross_entropy_with_logits(
            labels=self.label_t0, logits=generated_X)

        self.dis_loss = tf.reduce_mean(self.dis_entropy_X + self.dis_entropy_G
                                       ) + dis_norm_term * dis_lambda_

        self.gen_entropy = tf.nn.sigmoid_cross_entropy_with_logits(
            labels=self.label_t1, logits=generated_X)
        self.gen_loss = tf.reduce_mean(
            self.gen_entropy)  #+ gen_norm_term * gen_lambda_

        # 最適化する際にDならDのみのパラメータを、GならGのみのパラメータを更新するようにしたいのでモデル別の変数を取得する
        dis_vars = [x for x in tf.trainable_variables() if "dis_" in x.name]
        gen_vars = [x for x in tf.trainable_variables() if "gen_" in x.name]

        # 識別モデルDの最適化
        self.opt_d = tf.train.AdamOptimizer(0.0002, beta1=0.1).minimize(
            self.dis_loss, var_list=[dis_vars])
        # 生成モデルGの最適化
        self.opt_g = tf.train.AdamOptimizer(0.0002, beta1=0.5).minimize(
            self.gen_loss, var_list=[gen_vars])