- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Ubuntu - 20.04, tensorflow - 2.2.0,张量板 - 2.2.1
我有read需要重新实现 config
方法才能使自定义层可序列化。
我有一个自定义层,它在其 __init__
中接受参数。它使用另一个自定义层,并在其 __init__
中使用参数。我可以:
没有 Tensorboard 回调:
tf.saved_model.save
并顺利执行tf.saved_model.load
加载这样保存的模型,它会加载上面2.中保存的模型model(input)
加载的模型。我也可以调用“call_and_return_all_conditional_losses(input)”,它们也能正常运行使用 Tensorboard 回调:
以上所有(可以.fit,保存,加载,从加载中预测等)除了..在运行时我得到警告:tensorflow:模型无法序列化为 JSON。忽略...层 PREPROCESS_MONSOON 在 `__init__` 中有参数,因此必须覆盖 `get_config`。
将可以端到端运行的整个代码粘贴到此处。你只需要安装 tensorflow 2。请删除/添加回调(只有 tensorboard 回调)到 .fit
以查看上述两种行为
import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers as l
from tensorflow import keras as k
import numpy as np
##making empty directories
import os
os.makedirs('r_data',exist_ok=True)
os.makedirs('r_savedir',exist_ok=True)
#Preparing the dataset
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train_ = pd.DataFrame(x_train.reshape(60000,-1),columns = ['col_'+str(i) for i in range(28*28)])
x_test_ = pd.DataFrame(x_test.reshape(10000,-1),columns = ['col_'+str(i) for i in range(28*28)])
x_train_['col_cat1'] = [np.random.choice(['a','b','c','d','e','f','g','h','i']) for i in range(x_train_.shape[0])]
x_test_['col_cat1'] = [np.random.choice(['a','b','c','d','e','f','g','h','i','j']) for i in range(x_test_.shape[0])]
x_train_['col_cat2'] = [np.random.choice(['a','b','c','d','e','f','g','h','i']) for i in range(x_train_.shape[0])]
x_test_['col_cat2'] = [np.random.choice(['a','b','c','d','e','f','g','h','i','j']) for i in range(x_test_.shape[0])]
x_train_[np.random.choice([True,False],size = x_train_.shape,p=[0.05,0.95]).reshape(x_train_.shape)] = np.nan
x_test_[np.random.choice([True,False],size = x_test_.shape,p=[0.05,0.95]).reshape(x_test_.shape)] = np.nan
x_train_.to_csv('r_data/x_train.csv',index=False)
x_test_.to_csv('r_data/x_test.csv',index=False)
pd.DataFrame(y_train).to_csv('r_data/y_train.csv',index=False)
pd.DataFrame(y_test).to_csv('r_data/y_test.csv',index=False)
#**THE MAIN LAYER THAT WE ARE TALKING ABOUT**
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow import feature_column
import os
class NUM_TO_DENSE(layers.Layer):
def __init__(self,num_cols):
super().__init__()
self.keys = num_cols
self.keys_all = self.keys+[str(i)+'__nullcol' for i in self.keys]
# def get_config(self):
# config = super().get_config().copy()
# config.update({
# 'keys': self.keys,
# 'keys_all': self.keys_all,
# })
# return config
def build(self,input_shape):
def create_moving_mean_vars():
return tf.Variable(initial_value=0.,shape=(),dtype=tf.float32,trainable=False)
self.moving_means_total = {t:create_moving_mean_vars() for t in self.keys}
self.layer_global_counter = tf.Variable(initial_value=0.,shape=(),dtype=tf.float32,trainable=False)
def call(self,inputs, training = True):
null_cols = {k:tf.math.is_finite(inputs[k]) for k in self.keys}
current_means = {}
def compute_update_current_means(t):
current_mean = tf.math.divide_no_nan(tf.reduce_sum(tf.where(null_cols[t],inputs[t],0.),axis=0),\
tf.reduce_sum(tf.cast(tf.math.is_finite(inputs[t]),tf.float32),axis=0))
self.moving_means_total[t].assign_add(current_mean)
return current_mean
if training:
current_means = {t:compute_update_current_means(t) for t in self.keys}
outputs = {t:tf.where(null_cols[t],inputs[t],current_means[t]) for t in self.keys}
outputs.update({str(k)+'__nullcol':tf.cast(null_cols[k],tf.float32) for k in self.keys})
self.layer_global_counter.assign_add(1.)
else:
outputs = {t:tf.where(null_cols[t],inputs[t],(self.moving_means_total[t]/self.layer_global_counter))\
for t in self.keys}
outputs.update({str(k)+'__nullcol':tf.cast(null_cols[k],tf.float32) for k in self.keys})
return outputs
class PREPROCESS_MONSOON(layers.Layer):
def __init__(self,cat_cols_with_unique_values,num_cols):
'''cat_cols_with_unqiue_values: (dict) {'col_cat':[unique_values_list]}
num_cols: (list) [num_cols_name_list]'''
super().__init__()
self.cat_cols = cat_cols_with_unique_values
self.num_cols = num_cols
# def get_config(self):
# config = super().get_config().copy()
# config.update({
# 'cat_cols': self.cat_cols,
# 'num_cols': self.num_cols,
# })
# return config
def build(self,input_shape):
self.ntd = NUM_TO_DENSE(self.num_cols)
self.num_colnames = self.ntd.keys_all
self.ctd = {k:layers.DenseFeatures\
(feature_column.embedding_column\
(feature_column.categorical_column_with_vocabulary_list\
(k,v),tf.cast(tf.math.ceil(tf.math.log(tf.cast(len(self.cat_cols[k]),tf.float32))),tf.int32).numpy()))\
for k,v in self.cat_cols.items()}
self.cat_colnames = [i for i in self.cat_cols]
self.dense_colnames = self.num_colnames+self.cat_colnames
def call(self,inputs,training=True):
dense_num_d = self.ntd(inputs,training=training)
dense_cat_d = {k:self.ctd[k](inputs) for k in self.cat_colnames}
dense_num = tf.stack([dense_num_d[k] for k in self.num_colnames],axis=1)
dense_cat = tf.concat([dense_cat_d[k] for k in self.cat_colnames],axis=1)
dense_all = tf.concat([dense_num,dense_cat],axis=1)
return dense_all
##Inputs
label_path = 'r_data/y_train.csv'
data_path = 'r_data/x_train.csv'
max_epochs = 100
batch_size = 32
shuffle_seed = 42
##Creating layer inputs
dfs = pd.read_csv(data_path,nrows=1)
cdtypes_x = dfs.dtypes
nc = list(dfs.select_dtypes(include=[int,float]).columns)
oc = list(dfs.select_dtypes(exclude=[int,float]).columns)
cdtypes_y = pd.read_csv(label_path,nrows=1).dtypes
dfc = pd.read_csv(data_path,usecols=oc)
ccwuv = {i:list(pd.Series(dfc[i].unique()).dropna()) for i in dfc.columns}
preds_name = pd.read_csv(label_path,nrows=1).columns
##creating datasets
dataset = tf.data.experimental.make_csv_dataset(
'r_data/x_train.csv',batch_size, column_names=cdtypes_x.index,prefetch_buffer_size=1,
shuffle=True,shuffle_buffer_size=10000,shuffle_seed=shuffle_seed)
labels = tf.data.experimental.make_csv_dataset(
'r_data/y_train.csv',batch_size, column_names=cdtypes_y.index,prefetch_buffer_size=1,
shuffle=True,shuffle_buffer_size=10000,shuffle_seed=shuffle_seed)
dataset = tf.data.Dataset.zip((dataset,labels))
##CREATING NETWORK
p = PREPROCESS_MONSOON(cat_cols_with_unique_values=ccwuv,num_cols=nc)
indict = {}
for i in nc:
indict[i] = k.Input(shape = (), name=i,dtype=tf.float32)
for i in ccwuv:
indict[i] = k.Input(shape=(), name=i,dtype=tf.string)
x = p(indict)
x = l.BatchNormalization()(x)
x = l.Dense(10,activation='relu',name='dense_1')(x)
predictions = l.Dense(10,activation=None,name=preds_name[0])(x)
model = k.Model(inputs=indict,outputs=predictions)
##Compiling model
model.compile(optimizer=k.optimizers.Adam(),
loss=k.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['sparse_categorical_accuracy'])
##callbacks
log_dir = './tensorboard_dir/no_config'
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)
## Fit model on training data
history = model.fit(dataset,
batch_size=64,
epochs=30,
steps_per_epoch=5,
validation_split=0.,
callbacks = [tensorboard_callback])
#saving the model
tf.saved_model.save(model,'r_savedir')
#loading the model
model = tf.saved_model.load('r_savedir')
##Predicting on loaded model
for i in dataset:
print(model(i[0],training=False))
break
我已经从代码中注释掉了我在自定义层中覆盖配置文件的部分,您可以在其中注释它们,关于层不可序列化的警告将会消失。
问题:我是否需要重写 config
方法以使自定义层接受 __init__
中的参数可序列化?
提前感谢您的帮助
最佳答案
您必须在代码中添加“get_config”
def get_config(self):
config = super().get_config()
return config
NUM_TO_DENSE 类必须是这样的
class NUM_TO_DENSE(layers.Layer):
def __init__(self,num_cols):
super().__init__()
self.keys = num_cols
self.keys_all = self.keys+[str(i)+'__nullcol' for i in self.keys]
def get_config(self):
config = super().get_config()
return config
关于tensorflow - 在 tensorflow 中,对于在实例化时需要参数的自定义层,get_config 方法是否需要覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61947226/
我在加载之前保存的模型时遇到问题。 这是我的保存: def build_rnn_lstm_model(tokenizer, layers): model = tf.keras.Sequenti
当我使用 ipython notebook 时,我想运行一个笔记本服务器。我关注了官方tutorial但是,当我想按照教程中的说明获取 get_config() 函数时,遇到了名称 get_confi
我希望能够查看传递给 keras 的 RandomForestModel 的超参数。我认为这应该可以通过 model.get_config() 实现。但是,在创建和训练模型后,get_config()
我正在使用以下类定义的残差单元训练卷积神经网络(根据 Aurelien Geron 的“使用 Scikit-Learn、Keras 和 Tensorflow 进行机器学习动手”中的第 478 页) c
Ubuntu - 20.04, tensorflow - 2.2.0,张量板 - 2.2.1 我有read需要重新实现 config 方法才能使自定义层可序列化。 我有一个自定义层,它在其 __ini
我想创建一个使用自定义重定向来验证用户身份的 jupyterhub 安装。用户将输入我们 Jupyterhub 的 URL,被重定向到一个单独的身份验证系统,然后返回到应用程序,绕过 login.ht
我已经使用 tf.keras 创建了一个自定义计划,并且在保存模型时遇到了这个错误: NotImplementedError: Learning rate schedule must override
我尝试使用 model.save() 保存我的 TensorFlow 模型,但是 - 我收到此错误。 此处提供了模型摘要: Model Summary 变压器模型的代码: def transforme
我正在从某个函数创建的配置字典中加载 keras 中的模型。我已经在许多其他模型中尝试过此方案,没有出现任何问题,但这是我使用tensorflow.keras.layers.Attention的第一个
我的笔记本一直工作到今天。在我的 colab 笔记本开始时,我每晚安装 tf-night,但现在它给了我这个错误 -------------------------------------------
我正在运行 keras tensorflow 2.0 并试图创建一个模型,训练它,然后保存它。我的代码如下(简化): model = Model() model.save("saved
根据custom layers TensorFlow Keras 指南部分有一个可选的 get_config 方法实现: def get_config(self): base_config
请帮我解决以下问题。我似乎无法保存我的模型。如您所见,我确实引用了 Sequential() 方法的实例 model = tf.keras.models.Sequential() model.add(
我是一名优秀的程序员,十分优秀!