Я новичок в машинном обучении Keras. Я пытаюсь понять порождающие состязательные сети (GAN). Для этого я пытаюсь запрограммировать простой пример. Я генерирую данные с помощью следующей функции:
def genReal(l):
realX = []
for i in range(l):
x = []
y = []
for i in np.arange(0.0, 1.0, 0.02):
x.append(i + np.random.normal(0,0.01))
y.append(-abs(i-0.5)+0.5+ np.random.normal(0,0.01))
data = np.array(list(zip(x, y)))
data = np.reshape(data, (100))
data.clip(0,1)
realX.append(data)
realX = np.array(realX)
return realX
Данные, полученные с помощью этой функции, похожи на эти примеры:
Теперь цель должна состоять в том, чтобы обучить нейронную сеть генерировать подобные данные.
Для GAN нам нужна Генератор Сеть, которую я смоделировал так:
generator = Sequential()
generator.add(Dense(128, input_shape=(100,), activation='relu'))
generator.add(Dropout(rate=0.2))
generator.add(Dense(128, activation='relu'))
generator.add(Dropout(rate=0.2))
generator.add(Dense(100, activation='sigmoid'))
generator.compile(loss='mean_squared_error', optimizer='adam')
дискриминатор, который выглядит так:
discriminator = Sequential()
discriminator.add(Dense(128, input_shape=(100,), activation='relu'))
discriminator.add(Dropout(rate=0.2))
discriminator.add(Dense(128, activation='relu'))
discriminator.add(Dropout(rate=0.2))
discriminator.add(Dense(1, activation='sigmoid'))
discriminator.compile(loss='mean_squared_error', optimizer='adam')
комбинированная модель:
ganInput = Input(shape=(100,))
x = generator(ganInput)
ganOutput = discriminator(x)
GAN = Model(inputs=ganInput, outputs=ganOutput)
GAN.compile(loss='binary_crossentropy', optimizer='adam')
У меня есть функция, которая генерирует шум (случайный массив)
def noise(l):
noise = np.array([np.random.uniform(0, 1, size=[l, ])])
return noise
А потом я тренирую модель:
for i in range(1000000):
fake = generator.predict(noise(100))
print(i, "==>", discriminator.predict(fake))
discriminator.train_on_batch(genReal(1), np.array([1]))
discriminator.train_on_batch(fake, np.array([0]))
discriminator.trainable = False
GAN.train_on_batch(noise(100), np.array([1]))
discriminator.trainable = True
Как вы можете видеть, я уже пытался обучить модель для 1. Mio итераций. Но генератор выводит данные, которые потом выглядят так (несмотря на разные входы):
Определенно не то, что я хотел. Итак, мой вопрос: 1. Mio Iterations недостаточно, или что-то не так в концепции моей программы
редактирование:
Это функция, с которой я строю свои данные:
def plotData(data):
x = np.reshape(data,(50,2))
x = x.tolist()
plt.scatter(list(zip(*x))[0],list(zip(*x))[1], c=col)