1
votes

I learned a network with two inputs.it works as an autoencoder. In the first part of the network, the inputs are fed to network and after some processing and passing from gaussian noise layer the second part of network is used. During learning all the network learnd together, but for test I need to spilit it to two part. First part gets two inputs and the second network gets an input that was the output of first network. So when I want to make two models for each part, it said the second part does not have an input. Could you please tell me what shoud I do? Is it possible to make a same nework for second part but learn with first network's weights? I will put the code very soon. I am working in keras. Thank you

my code is :

wt_random=np.random.randint(2, size=(49999,4,4))
w_expand=wt_random.astype(np.float32)
wv_random=np.random.randint(2, size=(9999,4,4))
wv_expand=wv_random.astype(np.float32)
x,y,z=w_expand.shape
w_expand=w_expand.reshape((x,y,z,1))
x,y,z=wv_expand.shape
wv_expand=wv_expand.reshape((x,y,z,1))

#-----------------building w test---------------------------------------------
w_test = np.random.randint(2,size=(1,4,4))
w_test=w_test.astype(np.float32)
w_test=w_test.reshape((1,4,4,1))


#-----------------------encoder------------------------------------------------
#------------------------------------------------------------------------------
wtm=Input((4,4,1))
image = Input((28, 28, 1))
conv1 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl1e')(image)
conv2 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl2e')(conv1)
conv3 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl3e')(conv2)
BN=BatchNormalization()(conv3)
encoded =  Conv2D(1, (5, 5), activation='relu', padding='same',name='encoded_I')(BN)


wpad=Kr.layers.Lambda(lambda xy: xy[0] + Kr.backend.spatial_2d_padding(xy[1], padding=((0, 24), (0, 24))))
encoded_merged=wpad([encoded,wtm])


deconv1 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl1d')(encoded_merged)
deconv2 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl2d')(deconv1)
deconv3 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl3d')(deconv2)
deconv4 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl4d')(deconv3)
BNd=BatchNormalization()(deconv4)

decoded = Conv2D(1, (5, 5), activation='sigmoid', padding='same', name='decoder_output')(BNd) 

model=Model(inputs=[image,wtm],outputs=decoded)

decoded_noise = GaussianNoise(0.5)(decoded)

convw1 = Conv2D(64, (5,5), activation='relu', name='conl1w')(decoded_noise)#24
convw2 = Conv2D(64, (5,5), activation='relu', name='convl2w')(convw1)#20
convw3 = Conv2D(64, (5,5), activation='relu' ,name='conl3w')(convw2)#16
convw4 = Conv2D(64, (5,5), activation='relu' ,name='conl4w')(convw3)#12
convw5 = Conv2D(64, (5,5), activation='relu', name='conl5w')(convw4)#8
convw6 = Conv2D(64, (5,5), activation='relu', name='conl6w')(convw5)#4
convw7 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl7w',dilation_rate=(2,2))(convw6)#4
convw8 = Conv2D(64, (5,5), activation='relu', padding='same',name='conl8w',dilation_rate=(2,2))(convw7)#4
convw9 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl9w',dilation_rate=(2,2))(convw8)#4
convw10 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl10w',dilation_rate=(2,2))(convw9)#4
BNed=BatchNormalization()(convw10)
pred_w = Conv2D(1, (1, 1), activation='sigmoid', padding='same', name='reconstructed_W',dilation_rate=(2,2))(BNed)  
model2=Model(inputs=decoded_noise,outputs=pred_w)
w_extraction=Model(inputs=[image,wtm],outputs=[decoded,pred_w])

w_extraction.summary()

the error:

Traceback (most recent call last):

File "", line 55, in model2=Model(inputs=decoded_noise,outputs=pred_w)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper return func(*args, **kwargs)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", line 93, in init self._init_graph_network(*args, **kwargs)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", line 231, in _init_graph_network self.inputs, self.outputs)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", line 1443, in _map_graph_network str(layers_with_complete_input))

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_14:0", shape=(?, 28, 28, 1), dtype=float32) at layer "input_14". The following previous layers were accessed without issue: []

the new code

wtm=Input((4,4,1))
image = Input((28, 28, 1))

#your code:
conv1 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl1e')(image)
conv2 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl2e')(conv1)
conv3 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl3e')(conv2)
BN=BatchNormalization()(conv3)
encoded =  Conv2D(1, (5, 5), activation='relu', padding='same',name='encoded_I')(BN)


wpad=Kr.layers.Lambda(lambda xy: xy[0] + Kr.backend.spatial_2d_padding(xy[1], padding=((0, 24), (0, 24))))
encoded_merged=wpad([encoded,wtm])
#end of your code

encoder = Model([image, wtm], encoded_merged)

encoded_input = Input((28,28,1))

#your code
deconv1 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl1d')(encoded_input)
deconv2 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl2d')(deconv1)
deconv3 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl3d')(deconv2)
deconv4 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl4d')(deconv3)
BNd=BatchNormalization()(deconv4)

decoded = Conv2D(1, (5, 5), activation='sigmoid', padding='same', name='decoder_output')(BNd) 

#end of your code

decoder = Model(encoded_input, decoded)

decoded_input = Input((28,28,1))

#your code
decoded_noise = GaussianNoise(0.5)(decoded_input)

convw1 = Conv2D(64, (5,5), activation='relu', name='conl1w')(decoded_noise)#24
convw2 = Conv2D(64, (5,5), activation='relu', name='convl2w')(convw1)#20
convw3 = Conv2D(64, (5,5), activation='relu' ,name='conl3w')(convw2)#16
convw4 = Conv2D(64, (5,5), activation='relu' ,name='conl4w')(convw3)#12
convw5 = Conv2D(64, (5,5), activation='relu', name='conl5w')(convw4)#8
convw6 = Conv2D(64, (5,5), activation='relu', name='conl6w')(convw5)#4
convw7 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl7w',dilation_rate=(2,2))(convw6)#4
convw8 = Conv2D(64, (5,5), activation='relu', padding='same',name='conl8w',dilation_rate=(2,2))(convw7)#4
convw9 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl9w',dilation_rate=(2,2))(convw8)#4
convw10 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl10w',dilation_rate=(2,2))(convw9)#4
BNed=BatchNormalization()(convw10)
pred_w = Conv2D(1, (1, 1), activation='sigmoid', padding='same', name='reconstructed_W',dilation_rate=(2,2))(BNed)  

#end of your code
noiseNet = Model(inputs=decoded_input,outputs=pred_w)

#input for full nets
full_wtm = Input((4,4,1))
full_image = Input((28, 28, 1)) 

#encoded 
full_encoded = encoder([full_image, full_wtm])

#decoded
full_decoded = decoder(full_encoded)

#with noise
full_w = noiseNet(full_decoded)

#autoencoder
autoencoder = Model([full_image,full_wtm], full_decoded)

#full net
w_extraction = Model([full_image, full_wtm], [full_decoded, full_w])

(x_train, _), (x_test, _) = mnist.load_data()
x_validation=x_train[1:10000,:,:]
x_train=x_train[10001:60000,:,:]
#
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_validation = x_validation.astype('float32') / 255.
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))  # adapt this if using `channels_first` image data format
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))  # adapt this if using `channels_first` image data format
x_validation = np.reshape(x_validation, (len(x_validation), 28, 28, 1))

#---------------------compile and train the model------------------------------
#opt=SGD(momentum=0.99)
w_extraction.compile(optimizer='adam', loss={'decoder_output':'mse','reconstructed_W':'binary_crossentropy'}, loss_weights={'decoder_output': 0.45, 'reconstructed_W': 1.0},metrics=['mae'])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=20)
#rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=20, min_delta=1E-4, verbose=1)
mc = ModelCheckpoint('best_model_5x5F_dil_Los751.h5', monitor='val_loss', mode='min', verbose=1, save_best_only=True)
history=w_extraction.fit([x_train,w_expand], [x_train,w_expand],
          epochs=200,
          batch_size=16, 
          validation_data=([x_validation,wv_expand], [x_validation,wv_expand]),
          callbacks=[TensorBoard(log_dir='E:/concatnatenetwork', histogram_freq=0, write_graph=False),es,mc])
w_extraction.summary()

the produced error:

Traceback (most recent call last):

File "", line 136, in w_extraction.compile(optimizer='adam', loss={'decoder_output':'mse','reconstructed_W':'binary_crossentropy'}, loss_weights={'decoder_output': 0.45, 'reconstructed_W': 1.0},metrics=['mae'])

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\training.py", line 119, in compile str(self.output_names))

ValueError: Unknown entry in loss dictionary: "decoder_output". Only expected the following keys: ['model_17', 'model_18']

1

1 Answers

0
votes

Ideally, you should have created the models separate in the first place.

net1 = createNet1()
net2 = createNet2()

net2OutFrom1 = net2(net1.output)

entireModel = Model(net1.input, net2OutFrom1)

Then you train entireModel and you can automatically use net1 and net2 without any trouble.

Doing it when your net was made as a single net.

You need to create a new input:

net2Input = Input(input_shape)

Then pass it through all layers of the second net.

out = originalNet.layers[firstLayerOfNet2](net2Input)
out = originalNet.layers[secondLayerOfNet2](out)
out = originalNet.layers[thirdLayerOfNet2](out)
....

Then create the second net separately:

net2 = Model(net2Input, out)

The first net can still be easily created:

net1 = Model(originalNet.input, originalNet.layers[lastLayerOfNet1].output)

With your example

Individual nets

wtm=Input((4,4,1))
image = Input((28, 28, 1))

#your code:
conv1 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl1e')(image)
conv2 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl2e')(conv1)
conv3 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl3e')(conv2)
BN=BatchNormalization()(conv3)
encoded =  Conv2D(1, (5, 5), activation='relu', padding='same',name='encoded_I')(BN)


wpad=Kr.layers.Lambda(lambda xy: xy[0] + Kr.backend.spatial_2d_padding(xy[1], padding=((0, 24), (0, 24))))
encoded_merged=wpad([encoded,wtm])
#end of your code

encoder = Model([image, wtm], encoded_merged)
encoded_input = Input(shape_of_encoded_merged_without_batch_size)

#your code
deconv1 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl1d')(encoded_input)
deconv2 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl2d')(deconv1)
deconv3 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl3d')(deconv2)
deconv4 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl4d')(deconv3)
BNd=BatchNormalization()(deconv4)

decoded = Conv2D(1, (5, 5), activation='sigmoid', padding='same', name='decoder_output')(BNd) 

#end of your code

decoder = Model(encoded_input, decoded)
decoded_input = Input(shape_of_decoded_without_batch_size)

#your code
decoded_noise = GaussianNoise(0.5)(decoded_input)

convw1 = Conv2D(64, (5,5), activation='relu', name='conl1w')(decoded_noise)#24
convw2 = Conv2D(64, (5,5), activation='relu', name='convl2w')(convw1)#20
convw3 = Conv2D(64, (5,5), activation='relu' ,name='conl3w')(convw2)#16
convw4 = Conv2D(64, (5,5), activation='relu' ,name='conl4w')(convw3)#12
convw5 = Conv2D(64, (5,5), activation='relu', name='conl5w')(convw4)#8
convw6 = Conv2D(64, (5,5), activation='relu', name='conl6w')(convw5)#4
convw7 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl7w',dilation_rate=(2,2))(convw6)#4
convw8 = Conv2D(64, (5,5), activation='relu', padding='same',name='conl8w',dilation_rate=(2,2))(convw7)#4
convw9 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl9w',dilation_rate=(2,2))(convw8)#4
convw10 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl10w',dilation_rate=(2,2))(convw9)#4
BNed=BatchNormalization()(convw10)
pred_w = Conv2D(1, (1, 1), activation='sigmoid', padding='same', name='reconstructed_W',dilation_rate=(2,2))(BNed)  

#end of your code
noiseNet = Model(inputs=noiseInput,outputs=pred_w)

Joining nets

#input for full nets
full_wtm = Input((4,4,1))
full_image = Input((28, 28, 1)) 

#encoded 
full_encoded = encoder([full_image, full_wtm])

#decoded
full_decoded = decoder(full_encoded)

#with noise
full_w = noiseNet(full_decoded)

#autoencoder
autoencoder = Model([full_image,full_wtm], full_decoded)

#full net
w_extraction = Model([full_image, full_wtm], [full_decoded, full_w])

You need to train again with this solution. Any net you train will train all the others.