我正在尝试执行此代码。它是用2.x编写的,而我正在python 3.7中进行更改。我能够更改它并执行其中的90%。但是我收到类型错误。
我有一个文件train.py
import SceneDesc
import sys
def train(epoch):
sd = SceneDesc.scenedesc()
model = sd.create_model()
batch_size = 512
model.fit_generator(sd.data_process(batch_size=batch_size),
steps_per_epoch=sd.no_samples/batch_size, epochs=epoch, verbose=2,
callbacks=None)
model.save('Output/Model.h5', overwrite=True)
model.save_weights('Output/Weights.h5',overwrite=True)
if __name__=="__main__":
train(int(sys.argv[1]))
另一个文件是SceneDesc.py。在train.py中,我正在调用我在SceneDesc.py文件中创建的class scenedesc。
class scenedesc():
def __init__(self):
self.vocab_size = None
self.no_samples = None
self.max_length = None
self.index_word = None
self.word_index = None
file = open("image_encodings.p", "rb")
self.image_encodings = pickle.load(file, encoding='bytes')
self.captions = None
self.img_id = None
list(self.values())
在执行train.py文件时。我收到以下错误:
File "D:\Image-caption\Image-Captioning-master\SceneDesc.py", line 24,
in __init__
list(self.values())
TypeError: 'NoneType' object is not iterable
哪个位于第list(self.values())
行的SceneDesc.py文件中。我试图解决它,但是无法解决。请帮助我解决此错误。
答案 0 :(得分:0)
在类values()
中检出函数scenedesc()
,并确保它返回可迭代的内容,很可能是您在return
的末尾忘记了values()
关键字
一个好消息是没有关键字return
的函数,这意味着您没有显式地对函数进行编码以返回一些值,无论如何它将返回值None
。
答案 1 :(得分:0)
正如@zvone在评论中所暗示的那样,问题似乎集中在此行以及该行未产生您期望的值的事实:
list(self.values())
当self.values()
希望接受某种形式的可迭代值序列以使其产生None
时,对list()
的调用将返回一个list
值。 / p>
虽然这与您的问题没有特别关系,但我也想知道为什么您将self.values
转换为列表,却没有在任何地方保存该新值。
如前所述,该行将尝试在内存中创建一个列表,但不会将其保存在任何地方以备将来使用或处理。我期望像这样:
mylist = list(self.values())
没有看到与self.values()
生成的代码有关的实际代码,我很难进一步诊断。如@isaac Newton所提到的,如果您的self.values()
代码恰好缺少一个return
语句,Python将默认使该函数返回一个None
值。