Skip to content
Snippets Groups Projects
Commit 649bdcda authored by hannandarryl's avatar hannandarryl
Browse files

pnb app changes

parent b3e861a0
Branches
No related tags found
No related merge requests found
Showing
with 8453 additions and 73 deletions
This diff is collapsed.
......@@ -17,9 +17,10 @@ import tensorflow.keras as keras
from sparse_coding_torch.keras_model import SparseCode, PNBClassifier, PTXClassifier, ReconSparse
import glob
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--input_dir', default='/shared_data/bamc_pnb_data/full_training_data', type=str)
parser.add_argument('--input_dir', default='/shared_data/bamc_pnb_data/revised_training_data', type=str)
parser.add_argument('--kernel_size', default=15, type=int)
parser.add_argument('--kernel_depth', default=5, type=int)
parser.add_argument('--num_kernels', default=48, type=int)
......@@ -28,7 +29,7 @@ if __name__ == "__main__":
parser.add_argument('--activation_lr', default=1e-2, type=float)
parser.add_argument('--lam', default=0.05, type=float)
parser.add_argument('--sparse_checkpoint', default='sparse_coding_torch/output/sparse_pnb_48/sparse_conv3d_model-best.pt/', type=str)
parser.add_argument('--checkpoint', default='sparse_coding_torch/classifier_outputs/48_filters_6/best_classifier.pt/', type=str)
parser.add_argument('--checkpoint', default='sparse_coding_torch/classifier_outputs/48_filters_grouped/best_classifier.pt/', type=str)
parser.add_argument('--run_2d', action='store_true')
args = parser.parse_args()
......@@ -37,6 +38,7 @@ if __name__ == "__main__":
image_height = 285
image_width = 235
clip_depth = 5
if args.run_2d:
inputs = keras.Input(shape=(image_height, image_width, 5))
......@@ -45,7 +47,7 @@ if __name__ == "__main__":
filter_inputs = keras.Input(shape=(5, args.kernel_size, args.kernel_size, 1, args.num_kernels), dtype='float32')
output = SparseCode(batch_size=batch_size, image_height=image_height, image_width=image_width, in_channels=1, out_channels=args.num_kernels, kernel_size=args.kernel_size, stride=args.stride, lam=args.lam, activation_lr=args.activation_lr, max_activation_iter=args.max_activation_iter, run_2d=args.run_2d, padding='VALID')(inputs, filter_inputs)
output = SparseCode(batch_size=batch_size, image_height=image_height, image_width=image_width, clip_depth=clip_depth, in_channels=1, out_channels=args.num_kernels, kernel_size=args.kernel_size, kernel_depth=args.kernel_depth, stride=args.stride, lam=args.lam, activation_lr=args.activation_lr, max_activation_iter=args.max_activation_iter, run_2d=args.run_2d, padding='VALID')(inputs, filter_inputs)
sparse_model = keras.Model(inputs=(inputs, filter_inputs), outputs=output)
......@@ -58,7 +60,7 @@ if __name__ == "__main__":
transform = torchvision.transforms.Compose(
[VideoGrayScaler(),
MinMaxScaler(0, 255),
torchvision.transforms.Resize((285, 235))
torchvision.transforms.Resize((image_height, image_width))
])
all_predictions = []
......@@ -71,7 +73,9 @@ if __name__ == "__main__":
vc = tv.io.read_video(f)[0].permute(3, 0, 1, 2)
is_right = classify_nerve_is_right(yolo_model, vc)
vc_sub = vc[:, -5:, :, :]
all_preds = []
for i in range(1, 5):
vc_sub = vc[:, -5*(i+1):-5*i, :, :]
if vc_sub.size(1) < 5:
print(f + ' does not contain enough frames for processing')
continue
......@@ -79,13 +83,8 @@ if __name__ == "__main__":
### START time after loading video ###
start_time = time.time()
clip = None
i = 1
while not clip and i < 5:
if vc_sub.size(1) < 5:
break
clip = get_yolo_regions(yolo_model, vc_sub, is_right)
vc_sub = vc[:, -5*(i+1):-5*i, :, :]
i += 1
clip = get_yolo_regions(yolo_model, vc_sub, is_right, crop_width=image_width, crop_height=image_height)
if clip:
clip = clip[0]
......@@ -96,14 +95,15 @@ if __name__ == "__main__":
pred = tf.math.sigmoid(classifier_model(activations))
final_pred = tf.math.round(pred)
all_preds.append(pred)
if all_preds:
final_pred = np.round(np.mean(np.array(all_preds)))
if final_pred == 1:
str_pred = 'Positive'
else:
str_pred = 'Negative'
else:
print('here')
str_pred = "Positive"
end_time = time.time()
......
import torch
import os
from sparse_coding_torch.keras_model import SparseCode, PNBClassifier, PTXClassifier, ReconSparse
import time
import numpy as np
import torchvision
from sparse_coding_torch.video_loader import VideoGrayScaler, MinMaxScaler
from torchvision.datasets.video_utils import VideoClips
import csv
from datetime import datetime
from yolov4.get_bounding_boxes import YoloModel
import argparse
import tensorflow as tf
import tensorflow.keras as keras
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--input_dir', default='/shared_data/bamc_data/PTX_Sliding', type=str)
parser.add_argument('--kernel_size', default=15, type=int)
parser.add_argument('--kernel_depth', default=5, type=int)
parser.add_argument('--num_kernels', default=64, type=int)
parser.add_argument('--stride', default=2, type=int)
parser.add_argument('--max_activation_iter', default=100, type=int)
parser.add_argument('--activation_lr', default=1e-2, type=float)
parser.add_argument('--lam', default=0.05, type=float)
parser.add_argument('--sparse_checkpoint', default='converted_checkpoints/sparse.pt', type=str)
parser.add_argument('--checkpoint', default='converted_checkpoints/classifier.pt', type=str)
parser.add_argument('--run_2d', action='store_true')
parser.add_argument('--dataset', default='ptx', type=str)
args = parser.parse_args()
#print(args.accumulate(args.integers))
batch_size = 1
if args.dataset == 'pnb':
image_height = 250
image_width = 600
elif args.dataset == 'ptx':
image_height = 100
image_width = 200
else:
raise Exception('Invalid dataset')
if args.run_2d:
inputs = keras.Input(shape=(image_height, image_width, 5))
else:
inputs = keras.Input(shape=(5, image_height, image_width, 1))
filter_inputs = keras.Input(shape=(5, args.kernel_size, args.kernel_size, 1, args.num_kernels), dtype='float32')
output = SparseCode(batch_size=batch_size, image_height=image_height, image_width=image_width, in_channels=1, out_channels=args.num_kernels, kernel_size=args.kernel_size, stride=args.stride, lam=args.lam, activation_lr=args.activation_lr, max_activation_iter=args.max_activation_iter, run_2d=args.run_2d, padding='SAME')(inputs, filter_inputs)
sparse_model = keras.Model(inputs=(inputs, filter_inputs), outputs=output)
recon_inputs = keras.Input(shape=(1, image_height // args.stride, image_width // args.stride, args.num_kernels))
recon_outputs = ReconSparse(batch_size=batch_size, image_height=image_height, image_width=image_width, in_channels=1, out_channels=args.num_kernels, kernel_size=args.kernel_size, stride=args.stride, lam=args.lam, activation_lr=args.activation_lr, max_activation_iter=args.max_activation_iter, run_2d=args.run_2d)(recon_inputs)
recon_model = keras.Model(inputs=recon_inputs, outputs=recon_outputs)
if args.sparse_checkpoint:
recon_model = keras.models.load_model(args.sparse_checkpoint)
if args.checkpoint:
classifier_model = keras.models.load_model(args.checkpoint)
else:
classifier_inputs = keras.Input(shape=(1, image_height // args.stride, image_width // args.stride, args.num_kernels))
if args.dataset == 'pnb':
classifier_outputs = PNBClassifier()(classifier_inputs)
elif args.dataset == 'ptx':
classifier_outputs = PTXClassifier()(classifier_inputs)
else:
raise Exception('No classifier exists for that dataset')
classifier_model = keras.Model(inputs=classifier_inputs, outputs=classifier_outputs)
yolo_model = YoloModel()
transform = torchvision.transforms.Compose(
[VideoGrayScaler(),
MinMaxScaler(0, 255),
torchvision.transforms.Normalize((0.2592,), (0.1251,)),
torchvision.transforms.CenterCrop((100, 200))
])
all_predictions = []
all_files = list(os.listdir(args.input_dir))
for f in all_files:
print('Processing', f)
#start_time = time.time()
clipstride = 15
vc = VideoClips([os.path.join(args.input_dir, f)],
clip_length_in_frames=5,
frame_rate=20,
frames_between_clips=clipstride)
### START time after loading video ###
start_time = time.time()
clip_predictions = []
i = 0
cliplist = []
countclips = 0
for i in range(vc.num_clips()):
clip, _, _, _ = vc.get_clip(i)
clip = clip.swapaxes(1, 3).swapaxes(0, 1).swapaxes(2, 3).numpy()
bounding_boxes, classes = yolo_model.get_bounding_boxes(clip[:, 2, :, :].swapaxes(0, 2).swapaxes(0, 1))
bounding_boxes = bounding_boxes.squeeze(0)
if bounding_boxes.size == 0:
continue
#widths = []
countclips = countclips + len(bounding_boxes)
widths = [(bounding_boxes[i][3] - bounding_boxes[i][1]) for i in range(len(bounding_boxes))]
#for i in range(len(bounding_boxes)):
# widths.append(bounding_boxes[i][3] - bounding_boxes[i][1])
ind = np.argmax(np.array(widths))
#for bb in bounding_boxes:
bb = bounding_boxes[ind]
center_x = (bb[3] + bb[1]) / 2 * 1920
center_y = (bb[2] + bb[0]) / 2 * 1080
width=400
height=400
lower_y = round(center_y - height / 2)
upper_y = round(center_y + height / 2)
lower_x = round(center_x - width / 2)
upper_x = round(center_x + width / 2)
trimmed_clip = clip[:, :, lower_y:upper_y, lower_x:upper_x]
trimmed_clip = torch.tensor(trimmed_clip).to(torch.float)
trimmed_clip = transform(trimmed_clip)
trimmed_clip.pin_memory()
cliplist.append(trimmed_clip)
if len(cliplist) > 0:
with torch.no_grad():
trimmed_clip = torch.stack(cliplist)
images = trimmed_clip.permute(0, 2, 3, 4, 1).numpy()
activations = tf.stop_gradient(sparse_model([images, tf.stop_gradient(tf.expand_dims(recon_model.weights[0], axis=0))]))
pred = classifier_model(activations)
#print(torch.nn.Sigmoid()(pred))
clip_predictions = tf.math.round(tf.math.sigmoid(pred))
final_pred = torch.mode(torch.tensor(clip_predictions.numpy()).view(-1))[0].item()
if len(clip_predictions) % 2 == 0 and tf.math.reduce_sum(clip_predictions) == len(clip_predictions)//2:
#print("I'm here")
final_pred = torch.mode(torch.tensor(clip_predictions.numpy()).view(-1))[0].item()
if final_pred == 1:
str_pred = 'No Sliding'
else:
str_pred = 'Sliding'
else:
str_pred = "No Sliding"
print(str_pred)
end_time = time.time()
all_predictions.append({'FileName': f, 'Prediction': str_pred, 'TotalTimeSec': end_time - start_time})
with open('output_' + datetime.now().strftime("%Y%m%d-%H%M%S") + '.csv', 'w+', newline='') as csv_out:
writer = csv.DictWriter(csv_out, fieldnames=all_predictions[0].keys())
writer.writeheader()
writer.writerows(all_predictions)
import os
import time
import numpy as np
from yolov4.get_bounding_boxes import YoloModel
import argparse
import glob
from sklearn.linear_model import LogisticRegression
import torchvision as tv
from tqdm import tqdm
import random
def calc_yolo_dist(yolo_model, frame):
bounding_boxes, classes = yolo_model.get_bounding_boxes(frame.swapaxes(0, 2).swapaxes(0, 1).numpy())
bounding_boxes = bounding_boxes.squeeze(0)
classes = classes.squeeze(0)
needle = None
nerve = None
for bb, class_pred in zip(bounding_boxes, classes):
if class_pred == 0 and nerve is None:
nerve = np.array(bb)
elif class_pred == 2 and needle is None:
needle = np.array(bb)
if nerve is None or needle is None:
return None
return np.concatenate([nerve, needle])
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--input_dir', default='/shared_data/bamc_pnb_data/revised_training_data', type=str)
args = parser.parse_args()
yolo_model = YoloModel()
all_predictions = []
all_files = glob.glob(pathname=os.path.join(args.input_dir, '**', '*.mp4'), recursive=True)
all_data = []
print('Building dataset...')
for f in tqdm(all_files):
vc = tv.io.read_video(f)[0].permute(3, 0, 1, 2)
x = None
i = -1
while x is None and i >= -5:
x = calc_yolo_dist(yolo_model, vc[:, i, :, :])
i -= 1
if x is None:
continue
y = 1 if f.split('/')[-3] == 'Positives' else 0
all_data.append((x, y))
random.shuffle(all_data)
split = int(len(all_data) * 0.8)
train_data = all_data[:split]
test_data = all_data[split:]
print('Loaded {} train examples.'.format(len(train_data)))
print('Loaded {} test examples.'.format(len(test_data)))
train_x = [ex[0] for ex in train_data]
train_y = [ex[1] for ex in train_data]
test_x = [ex[0] for ex in test_data]
test_y = [ex[1] for ex in test_data]
print('Fitting to data...')
clf = LogisticRegression(random_state=0, max_iter=1000).fit(train_x, train_y)
print('Evaluating model...')
score = clf.score(test_x, test_y)
print(score)
\ No newline at end of file
......@@ -19,7 +19,10 @@ if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Python program for processing PNB data')
parser.add_argument('--classifier', type=str, default='sparse_coding_torch/mobile_output/pnb.tflite')
parser.add_argument('--input_dir', default='/shared_data/bamc_pnb_data/full_training_data', type=str)
parser.add_argument('--input_dir', default='/shared_data/bamc_pnb_data/revised_training_data', type=str)
parser.add_argument('--stride', default=30, type=int)
parser.add_argument('--image_width', default=400, type=int)
parser.add_argument('--image_height', default=285, type=int)
args = parser.parse_args()
interpreter = tf.lite.Interpreter(args.classifier)
......@@ -31,9 +34,9 @@ if __name__ == "__main__":
yolo_model = YoloModel()
transform = torchvision.transforms.Compose(
[#VideoGrayScaler(),
MinMaxScaler(0, 255),
# torchvision.transforms.Resize((285, 235))
[VideoGrayScaler(),
# MinMaxScaler(0, 255),
torchvision.transforms.Resize((args.image_height, args.image_width))
])
all_predictions = []
......@@ -46,24 +49,22 @@ if __name__ == "__main__":
vc = tv.io.read_video(f)[0].permute(3, 0, 1, 2)
is_right = classify_nerve_is_right(yolo_model, vc)
vc_sub = vc[:, -5:, :, :]
all_preds = []
for j in range(0, vc.size(1) - 5, args.stride):
vc_sub = vc[:, j:j+5, :, :]
if vc_sub.size(1) < 5:
print(f + ' does not contain enough frames for processing')
continue
### START time after loading video ###
start_time = time.time()
clip = None
i = 1
while not clip and i < 5:
if vc_sub.size(1) < 5:
break
clip = get_yolo_regions(yolo_model, vc_sub, is_right)
vc_sub = vc[:, -5*(i+1):-5*i, :, :]
i += 1
clip = get_yolo_regions(yolo_model, vc_sub, is_right, args.image_width, args.image_height)
if not clip:
continue
if clip:
clip = clip[0]
clip = transform(clip).to(torch.float32)
......@@ -74,11 +75,18 @@ if __name__ == "__main__":
output_array = np.array(interpreter.get_tensor(output_details[0]['index']))
pred = output_array[0][0]
print(pred)
final_pred = pred.round()
if final_pred == 1:
all_preds.append(final_pred)
print(all_preds)
if all_preds[-5:-2]:
video_pred = np.round(sum(all_preds[-5:-2]) / len(all_preds[-5:-2]))
if video_pred == 1:
str_pred = 'Positive'
else:
str_pred = 'Negative'
......
Namespace(batch_size=24, kernel_size=15, kernel_depth=5, num_kernels=32, stride=4, max_activation_iter=150, activation_lr=0.01, lr=0.003, epochs=20, lam=0.05, output_dir='sparse_coding_torch/classifier_outputs/32_filters_no_aug_9', sparse_checkpoint='sparse_coding_torch/output/sparse_pnb_32/sparse_conv3d_model-best.pt/', checkpoint=None, splits='k_fold', seed=26, train=True, num_positives=100, n_splits=5, save_train_test_splits=False, run_2d=False, balance_classes=False, dataset='pnb', train_sparse=False, mixing_ratio=1.0, sparse_lr=0.003, crop_height=285, crop_width=400, scale_factor=1, clip_depth=5, frames_to_skip=1)
\ No newline at end of file
root"_tf_keras_network*{"name": "model_2", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Functional", "config": {"name": "model_2", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_4"}, "name": "input_4", "inbound_nodes": []}, {"class_name": "PNBClassifier", "config": {"name": "pnb_classifier", "trainable": true, "dtype": "float32"}, "name": "pnb_classifier", "inbound_nodes": [[["input_4", 0, 0, {}]]]}], "input_layers": [["input_4", 0, 0]], "output_layers": [["pnb_classifier", 0, 0]]}, "shared_object_id": 2, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "ndim": 5, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "float32", "input_4"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "float32", "input_4"]}, "keras_version": "2.8.0", "backend": "tensorflow", "model_config": {"class_name": "Functional", "config": {"name": "model_2", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_4"}, "name": "input_4", "inbound_nodes": [], "shared_object_id": 0}, {"class_name": "PNBClassifier", "config": {"name": "pnb_classifier", "trainable": true, "dtype": "float32"}, "name": "pnb_classifier", "inbound_nodes": [[["input_4", 0, 0, {}]]], "shared_object_id": 1}], "input_layers": [["input_4", 0, 0]], "output_layers": [["pnb_classifier", 0, 0]]}}}2
 root.layer-0"_tf_keras_input_layer*{"class_name": "InputLayer", "name": "input_4", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_4"}}2
root.layer_with_weights-0"_tf_keras_layer*{"name": "pnb_classifier", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "PNBClassifier", "config": {"name": "pnb_classifier", "trainable": true, "dtype": "float32"}, "inbound_nodes": [[["input_4", 0, 0, {}]]], "shared_object_id": 1}2
  root.layer_with_weights-0.conv_1"_tf_keras_layer* {"name": "conv2d", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv2D", "config": {"name": "conv2d", "trainable": true, "dtype": "float32", "filters": 32, "kernel_size": {"class_name": "__tuple__", "items": [8, 8]}, "strides": {"class_name": "__tuple__", "items": [4, 4]}, "padding": "valid", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1, 1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 4, "axes": {"-1": 32}}, "shared_object_id": 7}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 68, 97, 32]}}2
  root.layer_with_weights-0.conv_2"_tf_keras_layer* {"name": "conv2d_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv2D", "config": {"name": "conv2d_1", "trainable": true, "dtype": "float32", "filters": 32, "kernel_size": {"class_name": "__tuple__", "items": [4, 4]}, "strides": {"class_name": "__tuple__", "items": [2, 2]}, "padding": "valid", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1, 1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 8}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 9}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 10, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 4, "axes": {"-1": 32}}, "shared_object_id": 11}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 16, 23, 32]}}2
 !root.layer_with_weights-0.flatten"_tf_keras_layer*{"name": "flatten", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Flatten", "config": {"name": "flatten", "trainable": true, "dtype": "float32", "data_format": "channels_last"}, "shared_object_id": 12, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 1, "axes": {}}, "shared_object_id": 13}}2
root.layer_with_weights-0.ff_2"_tf_keras_layer*{"name": "dense", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense", "trainable": true, "dtype": "float32", "units": 40, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 14}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 15}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 16, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 2240}}, "shared_object_id": 17}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2240]}}2
root.layer_with_weights-0.ff_3"_tf_keras_layer*{"name": "dense_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_1", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 18}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 19}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 20, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 40}}, "shared_object_id": 21}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 40]}}2
root.layer_with_weights-0.ff_4"_tf_keras_layer*{"name": "dense_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_2", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 24, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 20}}, "shared_object_id": 25}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 20]}}2
\ No newline at end of file
root"_tf_keras_network*{"name": "model_3", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Functional", "config": {"name": "model_3", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_5"}, "name": "input_5", "inbound_nodes": []}, {"class_name": "PNBClassifier", "config": {"name": "pnb_classifier_1", "trainable": true, "dtype": "float32"}, "name": "pnb_classifier_1", "inbound_nodes": [[["input_5", 0, 0, {}]]]}], "input_layers": [["input_5", 0, 0]], "output_layers": [["pnb_classifier_1", 0, 0]]}, "shared_object_id": 2, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "ndim": 5, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "float32", "input_5"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "float32", "input_5"]}, "keras_version": "2.8.0", "backend": "tensorflow", "model_config": {"class_name": "Functional", "config": {"name": "model_3", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_5"}, "name": "input_5", "inbound_nodes": [], "shared_object_id": 0}, {"class_name": "PNBClassifier", "config": {"name": "pnb_classifier_1", "trainable": true, "dtype": "float32"}, "name": "pnb_classifier_1", "inbound_nodes": [[["input_5", 0, 0, {}]]], "shared_object_id": 1}], "input_layers": [["input_5", 0, 0]], "output_layers": [["pnb_classifier_1", 0, 0]]}}}2
 root.layer-0"_tf_keras_input_layer*{"class_name": "InputLayer", "name": "input_5", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_5"}}2
root.layer_with_weights-0"_tf_keras_layer*{"name": "pnb_classifier_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "PNBClassifier", "config": {"name": "pnb_classifier_1", "trainable": true, "dtype": "float32"}, "inbound_nodes": [[["input_5", 0, 0, {}]]], "shared_object_id": 1}2
  root.layer_with_weights-0.conv_1"_tf_keras_layer* {"name": "conv2d_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv2D", "config": {"name": "conv2d_2", "trainable": true, "dtype": "float32", "filters": 32, "kernel_size": {"class_name": "__tuple__", "items": [8, 8]}, "strides": {"class_name": "__tuple__", "items": [4, 4]}, "padding": "valid", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1, 1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 4, "axes": {"-1": 32}}, "shared_object_id": 7}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 68, 97, 32]}}2
  root.layer_with_weights-0.conv_2"_tf_keras_layer* {"name": "conv2d_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv2D", "config": {"name": "conv2d_3", "trainable": true, "dtype": "float32", "filters": 32, "kernel_size": {"class_name": "__tuple__", "items": [4, 4]}, "strides": {"class_name": "__tuple__", "items": [2, 2]}, "padding": "valid", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1, 1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 8}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 9}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 10, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 4, "axes": {"-1": 32}}, "shared_object_id": 11}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 16, 23, 32]}}2
 !root.layer_with_weights-0.flatten"_tf_keras_layer*{"name": "flatten_1", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Flatten", "config": {"name": "flatten_1", "trainable": true, "dtype": "float32", "data_format": "channels_last"}, "shared_object_id": 12, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 1, "axes": {}}, "shared_object_id": 13}}2
root.layer_with_weights-0.ff_2"_tf_keras_layer*{"name": "dense_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_3", "trainable": true, "dtype": "float32", "units": 40, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 14}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 15}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 16, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 2240}}, "shared_object_id": 17}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2240]}}2
root.layer_with_weights-0.ff_3"_tf_keras_layer*{"name": "dense_4", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_4", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 18}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 19}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 20, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 40}}, "shared_object_id": 21}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 40]}}2
root.layer_with_weights-0.ff_4"_tf_keras_layer*{"name": "dense_5", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_5", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 24, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 20}}, "shared_object_id": 25}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 20]}}2
\ No newline at end of file
root"_tf_keras_network*{"name": "model_4", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Functional", "config": {"name": "model_4", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_6"}, "name": "input_6", "inbound_nodes": []}, {"class_name": "PNBClassifier", "config": {"name": "pnb_classifier_2", "trainable": true, "dtype": "float32"}, "name": "pnb_classifier_2", "inbound_nodes": [[["input_6", 0, 0, {}]]]}], "input_layers": [["input_6", 0, 0]], "output_layers": [["pnb_classifier_2", 0, 0]]}, "shared_object_id": 2, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "ndim": 5, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "float32", "input_6"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "float32", "input_6"]}, "keras_version": "2.8.0", "backend": "tensorflow", "model_config": {"class_name": "Functional", "config": {"name": "model_4", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_6"}, "name": "input_6", "inbound_nodes": [], "shared_object_id": 0}, {"class_name": "PNBClassifier", "config": {"name": "pnb_classifier_2", "trainable": true, "dtype": "float32"}, "name": "pnb_classifier_2", "inbound_nodes": [[["input_6", 0, 0, {}]]], "shared_object_id": 1}], "input_layers": [["input_6", 0, 0]], "output_layers": [["pnb_classifier_2", 0, 0]]}}}2
 root.layer-0"_tf_keras_input_layer*{"class_name": "InputLayer", "name": "input_6", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_6"}}2
root.layer_with_weights-0"_tf_keras_layer*{"name": "pnb_classifier_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "PNBClassifier", "config": {"name": "pnb_classifier_2", "trainable": true, "dtype": "float32"}, "inbound_nodes": [[["input_6", 0, 0, {}]]], "shared_object_id": 1}2
  root.layer_with_weights-0.conv_1"_tf_keras_layer* {"name": "conv2d_4", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv2D", "config": {"name": "conv2d_4", "trainable": true, "dtype": "float32", "filters": 32, "kernel_size": {"class_name": "__tuple__", "items": [8, 8]}, "strides": {"class_name": "__tuple__", "items": [4, 4]}, "padding": "valid", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1, 1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 4, "axes": {"-1": 32}}, "shared_object_id": 7}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 68, 97, 32]}}2
  root.layer_with_weights-0.conv_2"_tf_keras_layer* {"name": "conv2d_5", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv2D", "config": {"name": "conv2d_5", "trainable": true, "dtype": "float32", "filters": 32, "kernel_size": {"class_name": "__tuple__", "items": [4, 4]}, "strides": {"class_name": "__tuple__", "items": [2, 2]}, "padding": "valid", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1, 1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 8}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 9}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 10, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 4, "axes": {"-1": 32}}, "shared_object_id": 11}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 16, 23, 32]}}2
 !root.layer_with_weights-0.flatten"_tf_keras_layer*{"name": "flatten_2", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Flatten", "config": {"name": "flatten_2", "trainable": true, "dtype": "float32", "data_format": "channels_last"}, "shared_object_id": 12, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 1, "axes": {}}, "shared_object_id": 13}}2
root.layer_with_weights-0.ff_2"_tf_keras_layer*{"name": "dense_6", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_6", "trainable": true, "dtype": "float32", "units": 40, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 14}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 15}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 16, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 2240}}, "shared_object_id": 17}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2240]}}2
root.layer_with_weights-0.ff_3"_tf_keras_layer*{"name": "dense_7", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_7", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 18}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 19}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 20, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 40}}, "shared_object_id": 21}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 40]}}2
root.layer_with_weights-0.ff_4"_tf_keras_layer*{"name": "dense_8", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_8", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 24, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 20}}, "shared_object_id": 25}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 20]}}2
\ No newline at end of file
root"_tf_keras_network*{"name": "model_5", "trainable": true, "expects_training_arg": true, "dtype": "float32", "batch_input_shape": null, "must_restore_from_config": false, "class_name": "Functional", "config": {"name": "model_5", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_7"}, "name": "input_7", "inbound_nodes": []}, {"class_name": "PNBClassifier", "config": {"name": "pnb_classifier_3", "trainable": true, "dtype": "float32"}, "name": "pnb_classifier_3", "inbound_nodes": [[["input_7", 0, 0, {}]]]}], "input_layers": [["input_7", 0, 0]], "output_layers": [["pnb_classifier_3", 0, 0]]}, "shared_object_id": 2, "input_spec": [{"class_name": "InputSpec", "config": {"dtype": null, "shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "ndim": 5, "max_ndim": null, "min_ndim": null, "axes": {}}}], "build_input_shape": {"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "is_graph_network": true, "full_save_spec": {"class_name": "__tuple__", "items": [[{"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "float32", "input_7"]}], {}]}, "save_spec": {"class_name": "TypeSpec", "type_spec": "tf.TensorSpec", "serialized": [{"class_name": "TensorShape", "items": [null, 1, 68, 97, 32]}, "float32", "input_7"]}, "keras_version": "2.8.0", "backend": "tensorflow", "model_config": {"class_name": "Functional", "config": {"name": "model_5", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_7"}, "name": "input_7", "inbound_nodes": [], "shared_object_id": 0}, {"class_name": "PNBClassifier", "config": {"name": "pnb_classifier_3", "trainable": true, "dtype": "float32"}, "name": "pnb_classifier_3", "inbound_nodes": [[["input_7", 0, 0, {}]]], "shared_object_id": 1}], "input_layers": [["input_7", 0, 0]], "output_layers": [["pnb_classifier_3", 0, 0]]}}}2
 root.layer-0"_tf_keras_input_layer*{"class_name": "InputLayer", "name": "input_7", "dtype": "float32", "sparse": false, "ragged": false, "batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "config": {"batch_input_shape": {"class_name": "__tuple__", "items": [null, 1, 68, 97, 32]}, "dtype": "float32", "sparse": false, "ragged": false, "name": "input_7"}}2
root.layer_with_weights-0"_tf_keras_layer*{"name": "pnb_classifier_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "PNBClassifier", "config": {"name": "pnb_classifier_3", "trainable": true, "dtype": "float32"}, "inbound_nodes": [[["input_7", 0, 0, {}]]], "shared_object_id": 1}2
  root.layer_with_weights-0.conv_1"_tf_keras_layer* {"name": "conv2d_6", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv2D", "config": {"name": "conv2d_6", "trainable": true, "dtype": "float32", "filters": 32, "kernel_size": {"class_name": "__tuple__", "items": [8, 8]}, "strides": {"class_name": "__tuple__", "items": [4, 4]}, "padding": "valid", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1, 1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 4}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 5}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 6, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 4, "axes": {"-1": 32}}, "shared_object_id": 7}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 68, 97, 32]}}2
  root.layer_with_weights-0.conv_2"_tf_keras_layer* {"name": "conv2d_7", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Conv2D", "config": {"name": "conv2d_7", "trainable": true, "dtype": "float32", "filters": 32, "kernel_size": {"class_name": "__tuple__", "items": [4, 4]}, "strides": {"class_name": "__tuple__", "items": [2, 2]}, "padding": "valid", "data_format": "channels_last", "dilation_rate": {"class_name": "__tuple__", "items": [1, 1]}, "groups": 1, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 8}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 9}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 10, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 4, "axes": {"-1": 32}}, "shared_object_id": 11}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 16, 23, 32]}}2
 !root.layer_with_weights-0.flatten"_tf_keras_layer*{"name": "flatten_3", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Flatten", "config": {"name": "flatten_3", "trainable": true, "dtype": "float32", "data_format": "channels_last"}, "shared_object_id": 12, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 1, "axes": {}}, "shared_object_id": 13}}2
root.layer_with_weights-0.ff_2"_tf_keras_layer*{"name": "dense_9", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_9", "trainable": true, "dtype": "float32", "units": 40, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 14}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 15}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 16, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 2240}}, "shared_object_id": 17}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 2240]}}2
root.layer_with_weights-0.ff_3"_tf_keras_layer*{"name": "dense_10", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_10", "trainable": true, "dtype": "float32", "units": 20, "activation": "relu", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 18}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 19}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 20, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 40}}, "shared_object_id": 21}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 40]}}2
root.layer_with_weights-0.ff_4"_tf_keras_layer*{"name": "dense_11", "trainable": true, "expects_training_arg": false, "dtype": "float32", "batch_input_shape": null, "stateful": false, "must_restore_from_config": false, "class_name": "Dense", "config": {"name": "dense_11", "trainable": true, "dtype": "float32", "units": 1, "activation": "linear", "use_bias": true, "kernel_initializer": {"class_name": "GlorotUniform", "config": {"seed": null}, "shared_object_id": 22}, "bias_initializer": {"class_name": "Zeros", "config": {}, "shared_object_id": 23}, "kernel_regularizer": null, "bias_regularizer": null, "activity_regularizer": null, "kernel_constraint": null, "bias_constraint": null}, "shared_object_id": 24, "input_spec": {"class_name": "InputSpec", "config": {"dtype": null, "shape": null, "ndim": null, "max_ndim": null, "min_ndim": 2, "axes": {"-1": 20}}, "shared_object_id": 25}, "build_input_shape": {"class_name": "TensorShape", "items": [null, 20]}}2
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment