我想在 Keras 模型中添加一个函数。换句话说,我想建立一个带有固定函数鉴别器的 GAN 模型,并训练我的生成器来满足这个函数。我尝试将张量转换为 NumPy 数组以执行该功能,最后将 NumPy 数组转换为张量,为此我应该使用 tf.enable_eager_execution(),但是当我使用 eager_execution 时出现一些错误,例如 (tf.placeholder() is与急切执行不兼容)。
所以我想从我的模型中添加我的函数,我告诉训练有素的生成器来满足这个函数。
你能帮我解决这个问题吗?
zdim=100
img_shape = (1,)
num_classes=65535
Ninput = 16
Noutput = 3
mean=52.3
variance=11
def MUX(A, B, n1, n2, n3, n4, S):
if (S == 0):
OUT1 = A + n1
OUT2 = B + n2
elif (S == 1):
OUT1 = B + n3
OUT2 = A + n4
return (OUT1, OUT2)
def datagen(outgen,inp):
inp11=inp[0]
inp22=inp[0]
inp11[0:5]=[1,0,1,0,1]
#Output_data = arbiter(1, Ninput, Noutput, r1, r2, r3, r4, inp11)
Output_data = np.zeros((Noutput))
for n in range(Noutput):
A = 0.0001
B = 0.0001
for j in range(Ninput):
(A, B) = MUX(A, B, r1[n, j], r2[n, j], r3[n, j], r4[n, j], inp11[j])
if (A > B):
Output_data[n] = 1
elif (B >= A):
Output_data[n] = 0
print(Output_data)
error1 = np.mean(100-(abs(outgen - Output_data)) * 100.0)
inp22[-5:]=[0,1,0,1,0]
#Output_data2 = arbiter(1, Ninput, Noutput, r1, r2, r3, r4, inp22)
Output_data2 = np.zeros((Noutput))
for n in range(Noutput):
A = 0.0001
B = 0.0001
for j in range(Ninput):
(A, B) = MUX(A, B, r1[n, j], r2[n, j], r3[n, j], r4[n, j], inp11[j])
if (A > B):
Output_data2[n] = 1
elif (B >= A):
Output_data2[n] = 0
print(Output_data2)
error2 = np.mean(100-(abs(outgen - Output_data2)) * 100.0)
x = max(error2, error1)
return x
def build_gen(zdim):
model = Sequential()
model.add(Dense(256*7*7,input_dim=zdim))
model.add(Reshape((7,7,256)))
#14*14*128
model.add(Conv2DTranspose(128,kernel_size=3,strides=2,
padding='same'))
model.add(BatchNormalization())
model.add(LeakyReLU(alpha=0.01))
# 14*14*64
model.add(Conv2DTranspose(64,kernel_size=3,strides=1,
padding='same'))
model.add(BatchNormalization())
model.add(LeakyReLU(alpha=0.01))
#14*14*1
model.add(Conv2DTranspose(1,kernel_size=3,strides=1,
padding='same'))
model.add(Activation('tanh'))
model.add(Flatten())
model.add(Dense(16, activation='tanh'))
model.add(Dense(Noutput, activation='sigmoid'))
return model
def build_cgan(generator,input_Dataz):
z = Input(shape=(zdim,))
label = Input(shape=(1,),dtype='int32')
f_img = generator([z,label])
#proto_tensor = tf.make_tensor_proto(f_img)
#f_img1=tf.make_ndarray(proto_tensor)
#proto_tensorl = tf.make_tensor_proto(label)
#label1=tf.make_ndarray(proto_tensorl)
#with tf.compat.v1.Session() as sess:
# f_img1 = sess.run(f_img)
# lable1 = sess.run(label)
aloss=datagen(f_img,input_Dataz)
# classification = tf.convert_to_tensor(aloss, dtype=tf.float32)
model = Model([z,label],aloss)
return model
def build_cgen(zdim):
z = Input(shape=(zdim,))
label = Input(shape=(1, ),dtype='int32')
label_emb = Embedding(num_classes,zdim,input_length=1)(label)
#(batch_size,1,100)
label_emb = Flatten()(label_emb)
# (batch_size,100)
joined_rep = Multiply() ([z,label_emb])
gen_v = build_gen(zdim)
c_img = gen_v(joined_rep)
return Model([z,label],c_img)
def DataGenearte2(epocs,bt):
datain=np.ones((epocs,bt))
for x in range(epocs):
for i in range(bt):
datain[x,i]=random.randint(0,1)
datain =np.array(datain)
return datain
r1, r2, r3, r4 = delayGen(mean,variance, Ninput, Noutput)
input_Data=DataGenearte2(1,Ninput)
gen_v = build_cgen(zdim)
#dis_v.trainable=False
gan_v = build_cgan(gen_v,input_Data)
gan_v.compile(loss='binary_crossentropy',
optimizer=Adam()
)