'use part of Keras Sequential model to predict
In the following code I have defined a Sequential model, that contains two parts conv_encoder and conv_decoder. After training the model I want to use conv_encoder to predict.
How Can I access the trained conv_encoder? (See the last line of the code bellow)
And also I want to it from inside of a fucntion.
from tensorflow.keras.layers import Conv2D, Flatten ,BatchNormalization ,MaxPooling2D
from tensorflow.keras.layers import Reshape, Conv2DTranspose
# network parameters
input_shape = (200,300,3)
batch_size = 20
import tensorflow as tf
import keras
from keras.applications.vgg16 import VGG16
from skimage.feature import hog
import pandas as pd
# Defining a custom metric
def rounded_accuracy(y_true, y_pred):
return keras.metrics.binary_accuracy(tf.round(y_true), tf.round(y_pred))
# Create the CAE model
def create_cae():
# Define encoder
conv_encoder = keras.models.Sequential([
keras.layers.Conv2D(256, kernel_size=3, padding="SAME", activation="relu", input_shape=[200, 300, 3]),
keras.layers.BatchNormalization(),
keras.layers.Conv2D(128, kernel_size=3, padding="SAME", activation="relu"),
keras.layers.MaxPool2D(pool_size=2),
keras.layers.Conv2D(64, kernel_size=3, padding="SAME", activation="relu"),
keras.layers.BatchNormalization(),
keras.layers.MaxPool2D(pool_size=2),
])
# Define decoder
conv_decoder = keras.models.Sequential([
keras.layers.Conv2DTranspose(128, kernel_size=3, strides=2, padding="SAME", activation="relu",input_shape=[50, 75, 64]),
keras.layers.BatchNormalization(),
keras.layers.Conv2DTranspose(256, kernel_size=3, strides=2, padding="SAME", activation="relu"),
keras.layers.BatchNormalization(),
keras.layers.Conv2DTranspose(3, kernel_size=3, strides=1, padding="SAME", activation="sigmoid"),
])
# Define AE
conv_ae = keras.models.Sequential([conv_encoder, conv_decoder])
# Display the model's architecture
conv_encoder.summary()
conv_decoder.summary()
# Compile the model
conv_ae.compile(loss="mse", optimizer=keras.optimizers.Adam(),
metrics=[rounded_accuracy])
return conv_ae
# Create CAE
conv_ae = create_cae()
print("New CAE model created")
history=conv_ae.fit(gaussian_noise_imgs,sample_train_imgs,epochs=5)
sample_train = conv_ae.predict(gaussian_noise_imgs)
N_bin=50
F= encoder.predict( sample_train )
Solution 1:[1]
After training your model, you can retrieve the encoder from the trained model like so:
encoder = keras.Model(inputs=conv_ae.layers[0].input, outputs=conv_ae.layers[0].layers[-1].output)
Solution 2:[2]
I spend a bit time on Gaussian model for comapres original image and I think it is one identity you are trying to find the scopes !
You may doing with ( 1 ), return queue !
model = models.Sequential()
for layer in mainQ_outputs:
model.add(layer)
model.add(tf.keras.layers.Flatten() )
model.add(tf.keras.layers.Dense(6, activation=tf.nn.softmax))
You also doing with ( 2 ), callbacks !
class custom_callback(tf.keras.callbacks.Callback):
log_write_dir = log_dir
val_dir = os.path.join(log_dir, 'validation')
print('val_dir: ' + val_dir) # F:\models\weights\characters\minds\validation
tf.summary.create_file_writer(val_dir)
def _val_writer(self):
if 'val' not in self._writers:
self._writers['val'] = tf.summary.create_file_writer(val_dir)
return self._writers['val']
def on_epoch_end(self, epoch, logs={}):
print(self.model.inputs) # [<KerasTensor: shape=(None, 1, 32, 32, 3) dtype=float32 (created by layer 'input_1')>]
feature_extractor = tf.keras.Model(inputs=self.model.inputs, outputs=[layer.output for layer in self.model.layers], )
x = tf.ones((32, 32, 3))
print(np.asarray(feature_extractor))
# [<KerasTensor: shape=(None, 1, 32, 32, 3) dtype=float32 (created by layer 'input_1')>]
# <keras.engine.functional.Functional object at 0x000001450EFC4670>
input('Press AnyKey!')
custom_callback = custom_callback()
** You can do with ( 3 ), layer access or references !**
group_1_ShoryuKen_Left = tf.reshape(group_1_ShoryuKen_Left, [1, 1, 48])
predictions = model.predict(group_1_ShoryuKen_Left)
layer_1 = model.get_layer( name="LSTM_32" )
# layer_1 = model.get_layer( name="Dense_64" ) # , index=None
# <keras.layers.core.dense.Dense object at 0x0000023959FB24C0>
print(layer_1)
print(layer_1.get_weights()[0].shape)
print(layer_1.get_weights()[1].shape)
Input:
image_original = plt.imread( 'C:\\Users\\Jirayu Kaewprateep\\Pictures\\Cats\\samples\\08_resizes.jpg' )
image_original = tf.keras.preprocessing.image.img_to_array(image_original)
image_original = tf.expand_dims(image_original, 0)
image = tfa.image.gaussian_filter2d( image_original, (3, 3), 1.0, 'REFLECT', 0, name='gaussian_filter2d' )
history=conv_ae.fit(image,image_original,epochs=5)
sample_train = conv_ae.predict(image)
N_bin=50
F= conv_encoder.predict( sample_train )
print(F)
Output:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 184, 136, 256) 7168
batch_normalization (BatchN (None, 184, 136, 256) 1024
ormalization)
conv2d_1 (Conv2D) (None, 184, 136, 128) 295040
max_pooling2d (MaxPooling2D (None, 92, 68, 128) 0
)
conv2d_2 (Conv2D) (None, 92, 68, 64) 73792
batch_normalization_1 (Batc (None, 92, 68, 64) 256
hNormalization)
max_pooling2d_1 (MaxPooling (None, 46, 34, 64) 0
2D)
=================================================================
Total params: 377,280
Trainable params: 376,640
Non-trainable params: 640
_________________________________________________________________
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_transpose (Conv2DTra (None, 92, 68, 128) 73856
nspose)
batch_normalization_2 (Batc (None, 92, 68, 128) 512
hNormalization)
conv2d_transpose_1 (Conv2DT (None, 184, 136, 256) 295168
ranspose)
batch_normalization_3 (Batc (None, 184, 136, 256) 1024
hNormalization)
conv2d_transpose_2 (Conv2DT (None, 184, 136, 3) 6915
ranspose)
=================================================================
Total params: 377,475
Trainable params: 376,707
Non-trainable params: 768
_________________________________________________________________
rounded_accuracy:
<function rounded_accuracy at 0x0000027BDFF65160>
New CAE model created
Epoch 1/5
2022-03-09 14:03:44.440068: I tensorflow/stream_executor/cuda/cuda_dnn.cc:368] Loaded cuDNN version 8100
1/1 [==============================] - 3s 3s/step - loss: 0.1221 - accuracy: 0.3148
Epoch 2/5
1/1 [==============================] - 0s 31ms/step - loss: 0.0645 - accuracy: 0.3573
Epoch 3/5
1/1 [==============================] - 0s 31ms/step - loss: 0.0512 - accuracy: 0.4318
Epoch 4/5
1/1 [==============================] - 0s 31ms/step - loss: 0.0439 - accuracy: 0.4564
Epoch 5/5
1/1 [==============================] - 0s 31ms/step - loss: 0.0385 - accuracy: 0.4731
[[[[-0.06346278 0.04637233 -0.02261382 ... 0.12098984 0.12070955
-0.0229062 ]
[-0.06346278 0.02278995 -0.02261382 ... 0.09531078 0.14106335
-0.0229062 ]
[-0.06346278 0.02279395 -0.02261382 ... 0.09496372 0.14070679
-0.0229062 ]
...
[-0.06346278 0.02212192 -0.02261382 ... 0.09469274 0.13895339
-0.0229062 ]
[-0.06346278 0.02219885 -0.02261382 ... 0.09484547 0.13892566
-0.0229062 ]
[-0.06346278 0.02447954 -0.02261382 ... 0.09182414 0.13579121
-0.0229062 ]]
[[-0.06346278 0.05012855 -0.02261382 ... 0.11684484 0.13889702
-0.0229062 ]
[-0.06346278 0.00757721 -0.02261382 ... 0.09060126 0.15116212
-0.0229062 ]
[-0.06346278 0.0072485 -0.02261382 ... 0.09044676 0.15090142
-0.0229062 ]
...
[-0.06346278 0.00701569 -0.02261382 ... 0.08867537 0.14858139
-0.0229062 ]
[-0.06346278 0.00706555 -0.02261382 ... 0.08872169 0.14858797
-0.0229062 ]
[-0.06346278 0.00225088 -0.02261382 ... 0.08776829 0.14434732
-0.0229062 ]]
[[-0.06346278 0.05006471 -0.02261382 ... 0.11678799 0.13892303
-0.0229062 ]
[-0.06346278 0.00763592 -0.02261382 ... 0.09031729 0.15117022
-0.0229062 ]
[-0.06346278 0.00749015 -0.02261382 ... 0.08962523 0.1507562
-0.0229062 ]
...
[-0.06346278 0.00702977 -0.02261382 ... 0.08858776 0.14859283
-0.0229062 ]
[-0.06346278 0.00706691 -0.02261382 ... 0.0886265 0.14861022
-0.0229062 ]
[-0.06346278 0.00223099 -0.02261382 ... 0.08776259 0.14446442
-0.0229062 ]]
...
[[-0.06346278 0.04950596 -0.02261382 ... 0.11570842 0.13801728
-0.0229062 ]
[-0.06346278 0.00701035 -0.02261382 ... 0.09086572 0.15059042
-0.0229062 ]
[-0.06346278 0.00680097 -0.02261382 ... 0.09112303 0.15117684
-0.0229062 ]
...
[-0.06346278 0.00777188 -0.02261382 ... 0.09041971 0.15148866
-0.0229062 ]
[-0.06346278 0.00767549 -0.02261382 ... 0.08995029 0.15114011
-0.0229062 ]
[-0.06346278 0.00224462 -0.02261382 ... 0.08866782 0.14654928
-0.0229062 ]]
[[-0.06346278 0.0488665 -0.02261382 ... 0.11492367 0.13678226
-0.0229062 ]
[-0.06346278 0.00693866 -0.02261382 ... 0.08889158 0.14880367
-0.0229062 ]
[-0.06346278 0.00687002 -0.02261382 ... 0.08928787 0.14929299
-0.0229062 ]
...
[-0.06346278 0.00782898 -0.02261382 ... 0.0905409 0.15163733
-0.0229062 ]
[-0.06346278 0.00775734 -0.02261382 ... 0.09018187 0.15157235
-0.0229062 ]
[-0.06346278 0.00236158 -0.02261382 ... 0.08874947 0.14714159
-0.0229062 ]]
[[-0.06346278 0.04358848 -0.02261382 ... 0.1652938 0.13935538
-0.0229062 ]
[-0.06346278 -0.00824893 -0.02261382 ... 0.1715379 0.1541569
-0.0229062 ]
[-0.06346278 -0.00822318 -0.02261382 ... 0.17140017 0.15413304
-0.0229062 ]
...
[-0.06346278 -0.00843395 -0.02261382 ... 0.1756423 0.1577251
-0.0229062 ]
[-0.06346278 -0.00859166 -0.02261382 ... 0.17557691 0.15755029
-0.0229062 ]
[-0.06346278 -0.01292683 -0.02261382 ... 0.18822822 0.1533695
-0.0229062 ]]]]
...
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Ali Haider |
Solution 2 | General Grievance |