Однако производительность потерь генератора и дискриминатора Cgan не очень идеальна. Когда я ранее генерировал другие подобные данные, кривая потерь генератора и кривая потерь дискриминатора имели тенденцию стабилизироваться около 0,69 после периода обучения. Как показано ниже.
Введите здесь описание изображения
Но моя текущая кривая выглядит вот так
введите здесь описание изображения
Я не понимаю, куда движется кривая, и не знаю, где сейчас оптимизировать.
Это мой код инициализации cgan
Код: Выделить всё
def __init__(self):
self.rows = 64
self.cols = 32
self.shape = (self.rows,self.cols)
self.num_classes = 28
self.latent_dim = 4096
self.generator = self.build_generator()
self.discriminator = self.build_discriminator()
self.discriminator.compile(loss=['binary_crossentropy'],optimizer=Adam(0.0001,0.1),metrics=['accuracy'])
noise = Input(shape(self.latent_dim,))
label = Input(shape(1,))
img = self.generator([noise,label])
self.discriminator.trainable = False
valid = self.discriminator([img,label])
self.combined = Model([noise,label],valid)
self.combined.compile(loss=['binary_crossentropy'],optimizer=Adam(0.0002,0.5),metrics=['accuracy'])
Код: Выделить всё
def build_generator(self):
model = Sequential()
model.add(Dense(512,input_dim = self.latent_dim))
model.add(LeakyReLU(alpha=0.05))
model.add(BatchNormalization(momentum=0.9))
model.add(Dense(512))
model.add(LeakyReLU(alpha=0.05))
model.add(BatchNormalization(momentum=0.9))
model.add(Dense(1024))
model.add(LeakyReLU(alpha=0.05))
model.add(BatchNormalization(momentum=0.9))
model.add(Dense(1024))
model.add(LeakyReLU(alpha=0.05))
model.add(BatchNormalization(momentum=0.9))
model.add(Dense(1024))
model.add(LeakyReLU(alpha=0.05))
model.add(BatchNormalization(momentum=0.9))
model.add(Dense(1024))
model.add(LeakyReLU(alpha=0.05))
model.add(BatchNormalization(momentum=0.9))
model.add(Dense(np.prod(self.shape), activation='tanh'))
model.add(Reshape(self.shape))
model.summary()
noise = Input(shape=(self.latent_dim,))
label = Input(shape=(1,), dtype='int32')
label_embedding = Flatten()(Embedding(self.num_classes, self.latent_dim)(label))
model_input = multiply([noise, label_embedding])
img = model(model_input)
return Model([noise, label], img)
Код: Выделить всё
def build_discriminator(self):
model = Sequential()
model.add(Dense(256,input_dim=np.prod(self.shape)))
model.add(LeakyReLU(alpha=0.1))
model.add(Dense(256))
model.add(LeakyReLU(alpha=0.1))
model.add(Dropout(0.2))
model.add(Dense(256))
model.add(LeakyReLU(alpha=0.1))
model.add(Dropout(0.2))
model.add(Dense(256))
model.add(LeakyReLU(alpha=0.1))
model.add(Dropout(0.2))
model.add(Dense(256))
model.add(LeakyReLU(alpha=0.1))
model.add(Dropout(0.2))
model.add(Dense(1,activation='sigmoid'))
model.summary()
img = Input(shape=self.shape)
label = Input(shape=(1,),dtype='int32')
label_embedding = Flatten()(Embedding(self.num_classes,np.prod(self.shape))(label))
flat_img = Flatten()(img)
model_input = multiply([flat_img,label_embedding])
validity = model(model_input)
return Model([img,label],validity)
Код: Выделить всё
def train(self,epochs,X_data,y_data,batch_size,sample_interval):
X_train = X_data
Y_train = y_data
Y_train = np.array(Y_train)
valid = np.ones((batch_size, 1))
fake = np.zeros((batch_size, 1))
d_loss_history = []
g_losses = []
for epoch in range(epochs):
idx = np.random.randint(0,X_train.shape[0],int(batch_size))
imgs,labels = X_train[idx],Y_train[idx]
noise = np.random.normal(0,1,(int(batch_size),self.latent_dim))
gen_imgs = self.generator.predict([noise,labels])
d_loss_real = self.discriminator.train_on_batch([imgs,labels],valid)
d_loss_fake = self.discriminator.train_on_batch([gen_imgs,labels],fake)
d_loss = 0.5*np.add(d_loss_real,d_loss_fake)
d_loss_history.append(d_loss[0])
noise = np.random.normal(0,1,(int(batch_size),self.latent_dim))
possible_values = np.arange(1, 28)
sampled_label = np.random.choice(possible_values, size=batch_size)
sampled_label = sampled_label.reshape(batch_size, 1)
g_loss = self.combined.train_on_batch([noise,sampled_label],valid)
g_losses.append(g_loss[0])
print("%d [D loss:%f,acc:%.2f%%][G loss:%f]" % (epoch,float(d_loss[0]),float(100*d_loss[1]),float(g_loss[0])))
plt.plot(d_loss_history, label='Discriminator Loss',color=(223/255, 122/255, 94/255))
plt.plot(g_losses, label='Generator Loss',color=(130/255, 178/255, 154/255))
plt.legend()
plt.xlabel('Epoch',fontsize = 12)
plt.ylabel('Loss',fontsize = 12)
plt.show()
Подробнее здесь: https://stackoverflow.com/questions/784 ... ve-adversa