Tensor has no attrbute assign
一、keras生成器重心
我是在使用keras生成器时出现了这个报错并引发后续一系列报错
keras生成器使用的是studyer_domi:《2020-12-11 keras通过model.fit_generator训练模型(节省内存)》链接: l2020-12-11 keras通过model.fit_generator训练模型(节省内存).
其实根本不用管yield的问题,生成器就是起到连续调用函数,可以遍历return结果的方式。
因而keras生成器处重点反而在于keras网络配置上的不一样的地方
二、keras生成器
def data_generate(lis):
count=1
batch_size = 10
while 1:
batch_x = [x[0] for x in lis[(count - 1) * batch_size:count * batch_size]]
batch_y = [y[1] for y in lis[(count - 1) * batch_size:count * batch_size]]
batch_x = np.array([np.asarray(get_wav_mfcc(i)) for i in batch_x])
batch_y =np.array(batch_y)
count = count + 1
yield batch_x, batch_y
"""lis的形状为[["xxx.wav",[0. 1. 0. 0. 0.]],
["sss.wav",[0. 0. 1. 0. 0.]],
["zzz.wav",[0. 0. 0. 0. 1.]],]
这样二维张量形式"""
#其中“xxx.wav”等就是需要处理文件的路径,我的是音频文件,如上所述,get_wav_mfcc(i)对音频进行读取并返回数值型的数据
#而[0. 1. 0. 0. 0.]是已经编码好的one-hot标签
#两个格式都是numpy.array
具体格式如下:
三、报错
在此处记录遇到的报错,这些报告基本与keras有关,也是我之前在model.fit()中没有修改过来的地方
报错一:
ValueError: Please provide as model inputs either a single array or a list of arrays. You passed: x=<generator object data_generate at 0x0000028725967D68>
这是由于model.fit()没有修改为model.fit_generator()
报错二:
RuntimeError: You must compile your model before using it.
这是由于没有设置input_shape,但是在model.fit()中不用设置这一参数也可训练
应该修改为:
model = Sequential()
model.add(Dense(2048, activation='relu',input_shape=(32000,)))
第三个报错:
Tensor object has no attrbute 'assign'
将
model.add(Dense(num_class, activation='softmax'))
修改为
model.add(Dense(11, activation='softmax'))
11是我自己标签种类,需要按自己的标签种类设置
tf.assign是变量替换,tf.assign(x,new_x) 等价于x = new_x
上述修改完成后就可以训练了