CGAN: потеря генератора и потеря дискриминатора условной генеративно-состязательной сети.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 CGAN: потеря генератора и потеря дискриминатора условной генеративно-состязательной сети.

Сообщение Anonymous »

Узнав, что gan можно использовать для генерации данных изображения, я захотел использовать gan для генерации данных массива. Поскольку данные моего массива имеют метки, я решил использовать cGAN для завершения этой работы.
Однако производительность потерь генератора и дискриминатора 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)
вот весь код Train

Код: Выделить всё

   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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»