Keras 中的生成对抗网络没有像预期的那样工作
Generative Adversarial Networks in Keras doesn't work like expected
我是 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 网络,我这样建模:
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)
您的实现的问题是 discriminator.trainable = False
在编译 discriminator
后没有任何效果。因此,当您执行 GAN.train_on_batch
.
时,所有权重(来自鉴别器和生成器网络)都是可训练的
这个问题的解决方法是在编译discriminator
之后和编译GAN
之前设置discriminator.trainable = False
:
discriminator.compile(loss='mean_squared_error', optimizer='adam')
discriminator.trainable = False
ganInput = Input(shape=(100,))
x = generator(ganInput)
ganOutput = discriminator(x)
GAN = Model(inputs=ganInput, outputs=ganOutput)
GAN.compile(loss='binary_crossentropy', optimizer='adam')
注意。我已经绘制了您的数据,它看起来更像这样:
我是 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
使用此函数生成的数据类似于以下示例:
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)
您的实现的问题是 discriminator.trainable = False
在编译 discriminator
后没有任何效果。因此,当您执行 GAN.train_on_batch
.
这个问题的解决方法是在编译discriminator
之后和编译GAN
之前设置discriminator.trainable = False
:
discriminator.compile(loss='mean_squared_error', optimizer='adam')
discriminator.trainable = False
ganInput = Input(shape=(100,))
x = generator(ganInput)
ganOutput = discriminator(x)
GAN = Model(inputs=ganInput, outputs=ganOutput)
GAN.compile(loss='binary_crossentropy', optimizer='adam')
注意。我已经绘制了您的数据,它看起来更像这样: