【发布时间】:2019-08-28 09:34:06
【问题描述】:
我有一个带有 4 个张量输入和一个数组输出的 Keras 模型。使用model.fit 方法可以正常工作
model.fit([inputUM, inputMU, inputUU, inputMM],outputY , validation_data=([inputTestUM, inputTestMU, inputTestUU, inputTestMM],outputTest), batch_size=None, epochs=3, steps_per_epoch=200,validation_steps=200, callbacks=[checkpointer])
现在我将model.fit 更改为model.fit_generator
batchSize = 10
samples = int(outputY.shape[0]) #number of all samples
stepsPerEpoch = int(samples/batchSize)
model.fit_generator(dataGenerator(inputUM, inputMU, inputUU, inputMM, outputY, batchSize),
steps_per_epoch=stepsPerEpoch,
epochs=2,
verbose=1,
callbacks=[checkpointer],
validation_data=dataGenerator(inputTestUM, inputTestMU, inputTestUU, inputTestMM, outputTest, batchSize),
validation_steps=stepsPerEpoch))
在dataGenerator 中,每个张量都被切片如下
def dataGenerator(inputUM, inputMU, inputUU, inputMM, outputY, batchSize):
samples = int(outputY.shape[0]) #number of all samples
batchNumber = int(samples/batchSize) #number of batches
counter=0
while True:
if counter > batchNumber: #restart counter at the end of each epoch
counter = 0
inUM = tf.slice(inputUM,[counter*batchSize,0,0],[batchSize,60,1])
inMU = tf.slice(inputMU,[counter*batchSize,0,0],[batchSize,60,1])
inUU = tf.slice(inputUU,[counter*batchSize,0,0],[batchSize,60,1])
inMM = tf.slice(inputMM,[counter*batchSize,0,0],[batchSize,60,1])
outY = outputY[counter*batchSize:(counter+1)*batchSize]
counter += 1
yield ([inUM, inMU, inUU, inMM], outY)
但是我得到了这个错误:
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
execfile(filename, namespace)
File "C:\ProgramData\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "mycode.py", line 529, in <module>
main(data)
File "mycode.py", line 236, in main
initial_epoch=0)
File "C:\ProgramData\Anaconda3\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training.py", line 1418, in fit_generator
initial_epoch=initial_epoch)
File "C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\training_generator.py", line 223, in fit_generator
callbacks.on_batch_end(batch_index, batch_logs)
File "C:\ProgramData\Anaconda3\lib\site-packages\keras\callbacks.py", line 115, in on_batch_end
callback.on_batch_end(batch, logs)
File "C:\ProgramData\Anaconda3\lib\site-packages\keras\callbacks.py", line 238, in on_batch_end
self.totals[k] = v * batch_size
File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\framework\tensor_shape.py", line 410, in __rmul__
return self * other
TypeError: unsupported operand type(s) for *: 'Dimension' and 'float'
我知道它需要一些整数变量,但是它会获取其他类型的数据。我不明白哪个参数类型是错误的。我将stepsPerEpoch 和samples 等所有1 个变量转换为整数。此外,生成器似乎工作正常,在调试模式下它返回[<tf.Tensor 'Slice_48:0' shape=(100, 60, 1) dtype=float32>, <tf.Tensor 'Slice_49:0' shape=(100, 60, 1) dtype=float32>, <tf.Tensor 'Slice_50:0' shape=(100, 60, 1) dtype=float32>, <tf.Tensor 'Slice_51:0' shape=(100, 60, 1) dtype=float32>] 作为输入,array([4., 5., 4., ..., 4., 4., 5.]) 作为输出。
【问题讨论】:
-
尝试在切片时将
counter*batchSize和batchSize转换为 int。inUM = tf.slice(inputUM,[int(counter*batchSize),0,0],[int(batchSize),60,1])因为可能问题出在batch_size中,如日志中所示。 -
谢谢@Anakin,什么都没发生,我得到了同样的错误。
标签: python tensorflow keras