gpt4 book ai didi

python - 从串联中保存 Keras 值层

转载 作者:行者123 更新时间:2023-12-04 10:03:33 27 4
gpt4 key购买 nike

我需要在我的模型中存储串联值以供离线使用。

我需要通过 CNN 连接功能保存、加载和循环。

 class DCNN(tf.keras.Model):
def __init__(self, nb_filters=50, FFN_units=512, nb_classes=2, dropout_rate=0.1, name="dncc"):
super(DCNN, self).__init__(name=name)

self.bert_layer = hub.KerasLayer("https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/1",trainable=False)

self.feature_size = nb_filters * len([2, 3, 4])
self.num_filters_total = nb_filters * len([2, 3, 4])

# self.features_before = tf.placeholder(tf.float32, [None, 3, self.feature_size], name="features_before")
self.features_before = [] #K.placeholder(shape=(None, 3, self.feature_size), name="features_before")

self.bigram = layers.Conv1D(filters=nb_filters,
kernel_size=2,
padding='valid',
activation='relu')

self.trigram = layers.Conv1D(filters=nb_filters,
kernel_size=3,
padding='valid',
activation='relu')

self.fourgram = layers.Conv1D(filters=nb_filters,
kernel_size=5,
padding='valid',
activation='relu')

self.pool = layers.GlobalMaxPooling1D()

self.dense1 = layers.Dense(units=FFN_units, activation='relu')

self.dropout = layers.Dropout(rate=dropout_rate)

if nb_classes == 2:
self.last_dense = layers.Dense(units=1, activation='sigmoid')
else:
self.last_dense = layers.Dense(units=nb_classes, activation='softmax')

def embed_with_bert(self,all_tokens):
#first: all sentence , second: tokens accesss = get ids:0 masks:1 segments:2
_, embds = self.bert_layer([all_tokens[:,0,:],
all_tokens[:,1,:],
all_tokens[:,2,:]])
return embds

def call(self, inputs):

x = self.embed_with_bert(inputs)
x_1 = self.bigram(x)
x_1 = self.pool(x_1) # dim = batchsize x nb_filters

x_2 = self.trigram(x)
x_2 = self.pool(x_2) # dim = batchsize x 50

x_3 = self.fourgram(x)
x_3 = self.pool(x_3) # dim = batchsize x 50

merged = tf.concat([x_1, x_2, x_3], axis=1) # batchsize x 3*nb_filters = batchsize x 150

h_pool_flat = tf.reshape(merged, [-1, self.num_filters_total])

# features_before: list, 3D tensor of [batch_size, timestep_size, feature_size]
# [batch_size, timestep_size, feature_size]
t = tf.math.log(tf.expand_dims(h_pool_flat, axis=1))
self.features_before.append(t)


merged = self.dense1(merged)


merged = self.dropout(merged)

output = self.last_dense(merged)

return output

def inference(self):
return ft.stack(self.features_before)

我试过这个:
Making a list and appending to it in TensorFlow

但我收到以下错误:

ValueError: Tensor("dncc/Log:0", shape=(None, 1, 96), dtype=float32) must be from the same graph as Tensor("dncc/Log:0", shape=(None, 1, 96), dtype=float32).



我应该怎么做才能解决这个错误

最佳答案

您可以使用 callbacks model.fit() 中的功能.自定义回调是在训练、评估或推理期间自定义 Keras 模型行为的强大工具,包括读取/更改 Keras 模型。

在下面的程序中,我创建了一个简单的模型。在模型中,我们捕获了 layers[2]每个之前的权重 epoch始于 list .我创建了名为 my_list 的列表,并在每个时期开始之前使用 on_epoch_begin 捕获权重的 callbacks .我正在使用 append将新纪元权重添加到列表中。最后,我已经转换了这个listndarray为简单起见。

注意:您可以从 here 下载我在程序中使用的数据集.

代码 -

%tensorflow_version 1.x
# MLP for Pima Indians Dataset saved to single file
import numpy as np
from numpy import loadtxt
import tensorflow as tf
print(tf.__version__)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import model_from_json

# load pima indians dataset
dataset = np.loadtxt("/content/pima-indians-diabetes.csv", delimiter=",")

# split into input (X) and output (Y) variables
X = dataset[:,0:8]
Y = dataset[:,8]

# define model
model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

# compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Model Summary
model.summary()

my_list = []

# Define the Required Callback Function
class ListAppend(tf.keras.callbacks.Callback):
def on_epoch_begin(self, epoch, logs={}):
weights = model.layers[2].get_weights()[0]
my_list.append(weights)

listappend = ListAppend()

# Fit the model
model.fit(X, Y, epochs=150, batch_size=10, verbose=0, callbacks = [listappend])

# evaluate the model
scores = model.evaluate(X, Y, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

# (7) Convert to a 2 dimensiaonal array of (epoch, gradients) type
my_list = np.asarray(my_list)
print("my_list Array has the shape:",my_list.shape)

输出 -
1.15.2
Model: "sequential_8"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_24 (Dense) (None, 12) 108
_________________________________________________________________
dense_25 (Dense) (None, 8) 104
_________________________________________________________________
dense_26 (Dense) (None, 1) 9
=================================================================
Total params: 221
Trainable params: 221
Non-trainable params: 0
_________________________________________________________________
acc: 78.26%
my_list Array has the shape: (150, 8, 1)

你可以引用这个官方的tensorflow link了解有关 tf.keras.callbacks.Callback 中可用的不同方法的更多信息.你可以引用这个官方的tensorflow link对于 Keras 自定义回调示例。

希望这能回答你的问题。快乐学习。

关于python - 从串联中保存 Keras 值层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61705743/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com