# Input Layer
encoder_inputs = Input(shape=(maxlen,), name="encode_input")
decoder_inputs = Input(shape=(None,), name="decode_input")
# Encoder Layer
encoder = Encoder(vectors,maxlen,vocab_size, embedding_dim, hidden_units)
enc_outputs, enc_state_h, enc_state_c = encoder(encoder_inputs)
dec_states_inputs = [enc_state_h, enc_state_c]
# Decoder Layer
decoder = Decoder(vectors,maxlen,vocab_size, embedding_dim, hidden_units)
attention_output, dec_state_h, dec_state_c = decoder(enc_outputs, decoder_inputs, dec_states_inputs)
# Dense Layer
dense_outputs = Dense(vocab_size, activation='softmax', name="dense")(attention_output)
# seq2seq model
model = Model(inputs=[encoder_inputs, decoder_inputs], outputs=dense_outputs)
return model
模型结构如图:
我的输入有两个,name分别为encode_input,和decode_input,输出有一个,名字为dense。
这样子,在写自己的数据生成器generator时,要特别注意yield返回的格式,必须是元组,元组内为inputs和outputs两个字典,字典的key为对应模型中的name,我的inputs = {'encode_input':e,'decode_input':d},outputs = {'dense':t},最后yield返回的应该是这样的( {'encode_input':e,'decode_input':d}, {'dense':t})
我的生成器代码如下
def get_train_batch(source_input_ids,target_input_ids,target_output_ids, batch_size):
train_dataset:所有数据,为source_data_ids,target_input_ids,target_output_ids, batch_size
batch_size:批次
一个generator,( inputs = {'encode_input':e,'decode_input':d},outputs = {'dense':t})
while 1:
for i in range(0, len(source_input_ids), batch_size):
e = source_input_ids[i:i+batch_size]
d = target_input_ids[i:i+batch_size]
t = target_output_ids[i:i+batch_size]
e = np.array(e)
d = np.array(d)
t = np.array(t)
yield ({'encode_input':e,'decode_input':d},{'dense':t})
最后整个输入模型是这样的:
model.fit(get_train_batch(source_input_ids[:num_split],target_input_ids[:num_split],target_output_ids[:num_split], batch_size),
batch_size=batch_size,
epochs=1,
steps_per_epoch = num_split//batch_size,
alidation_steps = validation_steps,
verbose=1,
validation_data=get_train_batch(source_input_ids[num_split:],target_input_ids[num_split:],target_output_ids[num_split:], batch_size))
加上测试集,边训练边测试。
训练结束可以按照平常方法保存啦~
关于model.fit_generator(直接上截图介绍)
官方将会在未来的版本删掉这个方法,不过它所支持的利用生成器训练在model.fit
中同样支持,所以,直接会一个就model.fit
足够使用了。
x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None,
validation_split=0.0, validation_data=None, shuffle=True, class_weight=None,
sample_weight=None, initial_epoch=0, steps_per_epoch=None,
validation_steps=None, validation_batch_size=None, validation_freq=1,
max_queue_size=10, workers=1, use_multiprocessing=False
Input data. It could be:
A Numpy array (or array-like), or a list of arrays (in case the model has multiple inputs).
A TensorFlow tensor, or a list of tensors (in case the model has multiple inputs).
A dict mapping input names to the corresponding array/tensors, if the model has named inputs.
A tf.data dataset. Should return a tuple of either (inputs, targets) or (inputs, targets, sample_weights).
A generator or keras.utils.Sequence returning (inputs, targets) or (inputs, targets, sample_weights). A more detailed description of unpacking behavior for iterator types (Dataset, generator, Sequence) is given below.
Target data. Like the input data x, it could be either Numpy array(s) or TensorFlow tensor(s). It should be consistent with x (you cannot have Numpy inputs and tensor targets, or inversely). If x is a dataset, generator, or keras.utils.Sequence instance, y should not be specified (since targets will be obtained from x).
Input data输入可以是numpy数组、tensor张量(有多个tensor张量输入的列表)、字典(以模型输入为key命名的字典,value可以是数组或者张量,ps:对应上生成器了)、tf.data的数据集(类似minst数据集或者自己创建的tf.data,这里传入的是数组,ps:对应自己创建的生成器的输出)还有生成器(keras.utils.Sequence不太了解
)。
Target data类似input data,不过当输入的是一个生成器时,就不需要再输入Target data了。
写这个主要是因为我在用generator这点搞了一天,看tensorflow官方文档是说fit里可以直接传入一个生成器,这个生成器要是什么样子的只说在tf.data里自己找(是我菜,没看懂官方文档),倒是有个from_tensor_slices
后接着 shuffle
的,我太菜了 ,有多个input的整不来 ,于是我不停的百度看官方文档 终于成功了。
感谢参考链接的作者,大救星!
https://blog.csdn.net/weixin_42744102/article/details/87272950
https://blog.csdn.net/weixin_42744102/article/details/87193271
文章目录一、概述1.模型存储2.量化方法二、基于安卓的TF模型三、基于IOS的TF模型四、基于嵌入式设备的TF模型
TensorFlow Lite的两个主要部分:转换器和解释器。
转换器的主要作用是将TF模型转换为轻量化的可被解释器读取的模型结构,解释器主要是为了在不同的平台上进行部署。下图为TensorFlow Lite的结构:
由于移动设备的计算能力限制,我们需要对模型进行优化,优化方法如下:
量化(主要):降低模型权重和偏差中数字的精度,float32->int8
剪枝:减少参数总
【转载并参考】model.fit() fit函数_a1111h的博客-CSDN博客 https://blog.csdn.net/a1111h/article/details/82148497
fit( x, y, batch_size=32, epochs=10, verbose=1, callbacks=None,
validation_split=0.0, validation_data=None, shuffle=True,
class_weight=None, sample_weight=N.
TensorFlow训练网络有两种方式,一种是基于tensor(array),另外一种是迭代器
两种方式区别是:
第一种是要加载全部数据形成一个tensor,然后调用model.fit()然后指定参数batch_size进行将所有数据进行分批训练
第二种是自己先将数据分批形成一个迭代器,然后遍历这个迭代器,分别训练每个批次的数据
model.fit(x, y, batch_size=数值, epochs=数值, verbose=数值,
validation_split=数值, validation_data=None, validation_freq=数值)
model.fit( ) 参数解释:
训练数据的输入
训练数据的输出
batch_size
每一个batch的大小
epochs
迭代次数,训练达到
TensorFlow实现多
输入多输出模型
有
时我们的
输入数据不只一个,会存在
多个输入源,
多个输出源,对于这种情况我们
使用Sequential显然是不行的,因为
Sequential只能够搭建线性拓扑模型,对于那种流水线型的模型较为适合,如果是非线性拓扑,复杂的拓扑
使用Sequential是不能够实现的,这是我们就需要
使用Function API,它会使我们处理多
输入多输出变得简单。
例如,如果您要构建一个系统,该系统按照优先级对自定义问题工单进行排序,然后将工单传送到正确的部门,则此模型将具有三个
输入:
非常感谢您对我的了解和提问。我理解您的问题是关于 RNN 的 seq_len 输入是否需要一致的问题。
通常情况下,RNN 的 seq_len 输入应该是一致的。因为 RNN 是一种序列模型,它的每一个时间步都需要输入一个固定长度的向量。如果输入的序列长度不一致,那么就需要对短序列进行填充或者对长序列进行截断,这样会对模型的性能造成一定的影响。
但是在某些情况下,比如在使用变长 RNN 或者注意力机制时,序列长度不需要一致。在这些情况下,模型会自动对序列进行处理,从而实现不同长度的序列输入。
因此,针对您的问题,如果您的 RNN 模型需要固定长度的输入,那么 seq_len 输入需要一致。如果您的模型支持变长输入或者注意力机制,那么 seq_len 输入可以不一致。
最后,我希望我的回答能够帮助您解决问题。如果您还有任何其他问题,请随时向我提出。