如何解决AttributeError:“发电机”对象没有属性“形状”
我正在尝试构建一些自定义生成器,并将其返回值放入keras层中以进行浴池大小的训练。 它说我有一些属性问题,但是由于这个问题我遭受了超过5天的苦难,所以我不知道如何解决它。 你能帮我吗? 下面是代码。
from sys import stdout #for progressing bar function
import numpy as np
import tensorflow as tf
import keras
from sklearn.preprocessing import StandardScaler #Normalization
from keras.callbacks import EarlyStopping #EearlyStopping
from keras.callbacks import ModelCheckpoint #Extract best model from early stopping method
from keras.models import load_model #to load the saved model
from keras.models import Model #for 1d convolution network
from keras.layers import Input #for 1d convolution network
from keras.layers import Dense #for 1d convolution network
from keras.layers import Flatten #for 1d convolution network
from keras.layers import BatchNormalization #for vanishing gradient problem
from keras.layers import Dropout #for vanishing gradient problem
from keras.layers.convolutional import Conv1D #for 1d convolution network
from keras.layers.convolutional import MaxPooling1D #for 1d convolution network
from keras.layers.merge import concatenate
from keras.layers.experimental.preprocessing import Rescaling
from keras import backend as K #for clearning flash memory and using GPU forcefully
from keras.utils import HDF5Matrix #Load HDF5
from keras.utils import Sequence #For batch generation
import h5py #Load HDF5
import matplotlib.pyplot as plt
import matplotlib
class Mygenerator(Sequence):
def __init__(self,x_set,y_set,batch_size):
self.x,self.y = np.array(x_set),np.array(y_set)
self.batch_size = batch_size
def __len__(self):
return int(np.ceil(len(self.x[1]) / float(self.batch_size)))
def __getitem__(self,idx):
X = np.array(self.x[:][int(idx * self.batch_size):int((idx + 1) * self.batch_size)[:]])
y = np.array(self.y[:][int(idx * self.batch_size):int((idx + 1) * self.batch_size)])
yield X,y
X_tr_list = HDF5Matrix("/content/gdrive/My Drive/contest/data/X_train_set.hdf5","data")
Y_tr = HDF5Matrix("/content/gdrive/My Drive/contest/data/Y_train_set.hdf5","data")
X_te_list = HDF5Matrix("/content/gdrive/My Drive/contest/data/X_test_set.hdf5","data")
Y_te = HDF5Matrix("/content/gdrive/My Drive/contest/data/Y_test_set.hdf5","data")
#Training
input_x = list()
output_y = list()
if g == 0: #The inintial training
print("Sangwoo : Model set up of the input parts begins!")
for i in range(14400):
visible = Input(shape=(n_steps,n_features))
cnn = Conv1D(filters=24,kernel_size=2,activation= lambda x : tf.nn.leaky_relu(x,alpha=0.2))(visible)
cnn = MaxPooling1D(pool_size=2)(cnn)
cnn_output = Flatten()(cnn)
input_x.append(visible)
output_y.append(cnn_output)
update_progress(i/(14400))
print("Sangwoo : Model set up of the output parts begins!")
# merge input models
merge = concatenate([output_y[s] for s in range(len(output_y))])
listDense = list()
for x in range(7): #len(floodplain)
output = Dense(1,alpha=0.2),name="output{}".format(x+1))(dense)
listDense.append(output)
update_progress((x+1)/7)
model = Model(inputs=input_x,outputs=listDense)
model.compile(optimizer='adam',loss='mse')
#model.summary()
#averaging loss and accuracy
checkpoint = MergeMetrics()
#early stopping
es = EarlyStopping(monitor='val_loss',patience=10)
best = ModelCheckpoint(filepath='/content/gdrive/My Drive/contest/best_model.h5',monitor='val_loss',save_best_only=True)
print("Sangwoo : The training begins!")
print("X_tr_list",(np.shape(X_tr_list[1]),"Y_tr_list",(np.shape(Y_tr[1]))))
# fit model
#hist = model.fit([X_tr_list[i] for i in range(len(X_tr_list))],[Y_tr[i] for i in range(Y_tr.shape[0])],epochs=1000,verbose=1,callbacks=[checkpoint,es,best],validation_data = ([X_te_list[x] for x in range(len(X_te_list))],[Y_te[i] for i in range(Y_te.shape[0])]))
hist = model.fit(Mygenerator([X_tr_list[i] for i in range(len(X_tr_list))],32),steps_per_epoch=(X_tr_list.shape[1]//32),validation_data=Mygenerator([X_te_list[i] for i in range(len(X_te_list))],[Y_te[i] for i in range(Y_te.shape[0])],32))
fig = plt.figure()
错误消息如下所示。
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/data_adapter.py in __init__(self,x,y,sample_weights,workers,use_multiprocessing,max_queue_size,model,**kwargs)
794 lambda x: model(x,training=False),args=(concrete_x,))
795
--> 796 self._first_batch_size = int(nest.flatten(peek)[0].shape[0])
797
798 def _get_dynamic_shape(t):
AttributeError: 'generator' object has no attribute 'shape'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。