如何解决使用Generator的TensorFlow中的多输入建模
import numpy as np
import tensorflow as tf
class ProbDistWRTChoices(tf.keras.layers.Layer):
def __init__(self,maxChoice):
super().__init__()
self.maxChoice = maxChoice
def call(self,inputs):
utility,rowlengths = inputs
utility = tf.reshape(utility,-1)
utility = tf.RaggedTensor.from_row_lengths(values = utility,row_lengths = rowlengths)
utility = utility.to_tensor(default_value = -1e9,shape = (None,self.maxChoice))
prob = tf.nn.softmax(utility,axis=-1)
return prob
class MNLogit(tf.keras.Model):
def __init__(self,maxChoice):
super(MNLogit,self).__init__()
self.dense = tf.keras.layers.Dense(1,use_bias = False,kernel_initializer = 'glorot_uniform',activation=None)
self.probabilityCalculator = ProbDistWRTChoices(maxChoice)
def call(self,inputs):
print(inputs)
x,rowlengths = inputs
print (x.shape,rowlengths.shape)
x = self.dense(x)
x = self.probabilityCalculator([x,rowlengths])
print (x.shape)
print(x.numpy())
print( "++++++++++=========++++++++++")
return x
model = MNLogit(maxChoice=100)
model.compile(
optimizer = tf.keras.optimizers.Adam(),loss = tf.keras.losses.SparseCategoricalCrossentropy(),metrics = [
tf.keras.metrics.SparseTopKCategoricalAccuracy(k = 1,name = 'Accuracy'),tf.keras.metrics.SparseTopKCategoricalAccuracy(k = 5,name = 'Top5_Accuracy'),tf.keras.metrics.SparseTopKCategoricalAccuracy(k = 10,name = 'Top10_Accuracy')
]
)
row_lengths = np.array([100,100,88,68,99,46,87,74,100])
targets = np.array([ 4,8,53,36,13,31,7,3,91,75,66,86,55,20,1,6,42,97,9,37,16,14,26,57])
X = np.random.random((3062,10))
values = [([X,row_lengths],targets) for i in range(100)]
def generator(values):
"""
Yields the next training batch.
"""
iterator = iter(values)
while True:
yield next(iterator)
train_gen = generator(values)
model.fit(train_gen,epochs=10,steps_per_epoch = 1)
**O/P because of the print statement:**
> (<tf.Tensor: shape=(3062,10),dtype=float32,numpy=
> array([[0.45570728,0.2092263,0.68047154,...,0.7563979,0.5050498
>,> 0.679467 ],> [0.78198177,0.39459062,0.1891338,0.34017387,0.93216115,> 0.05743273],> [0.37135497,0.88671786,0.08154485,0.4763579,0.49207243,> 0.01604719],> ...,> [0.99842083,0.41491947,0.17116761,0.27906555,0.10698277,> 0.52499497],> [0.06340311,0.14407901,0.8654476,0.74813706,0.18045615,> 0.6346456 ],> [0.54209155,0.22341223,0.5253111,0.86075026,0.79696625,> 0.80810267]],dtype=float32)>,<tf.Tensor: shape=(32,),dtype=int64,numpy= array([100,> 100,> 100,> 87,100])>) (3062,10) (32,) (32,100) [[0.00836133 0.00883811 0.01003097 ... 0.01875334 0.00826117
> 0.00648314] [0.01327305 0.01223391 0.00698607 ... 0.00874015 0.01100503 0.01377677] [0.01167065 0.00867095 0.00506141 ... 0.00904635 0.01058154 0.00611446] ... [0.01133993 0.01008244 0.01226319 ... 0. 0. 0. ] [0.01300668 0.01112028 0.00956304 ... 0.02183897 0.00758292 0.0092134 ] [0.00588106 0.00859331 0.01139334 ... 0.01909281 0.00397551
> 0.01512818]]
> ++++++++++=========++++++++++ Epoch 1/10 (<tf.Tensor 'IteratorGetNext:0' shape=(None,None) dtype=float32>,<tf.Tensor
> 'ExpandDims:0' shape=(None,1) dtype=int64>) (None,None) (None,1)
> --------------------------------------------------------------------------- ValueError
我不明白为什么第二次模型没有从生成器接收任何输入(它应该是基本上生成相同数据的生成器)。
输入是有意随机的。我的发电机有问题吗?我知道这不是一个好习惯,但从逻辑上讲,我认为它应该有助于建立榜样。但是我被困住了。
我特意添加了一些打印声明,以理解和解释目的。
解决方法
我认为您在此行中有一个错误:
X = np.random.random((3062,10))
应该是:
X = np.random.random((32,10))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。