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])