python - 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, activation= lambda x : tf.nn.leaky_relu(x, 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))], [Y_tr[i] for i in range(Y_tr.shape[0])], 32), steps_per_epoch=(X_tr_list.shape[1]//32), epochs=1000, verbose=1, callbacks=[checkpoint, es, best], 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'
解决方案
推荐阅读
- r - 使用二进制而不是源文件在 R 中安装包:如何更改默认值
- google-app-engine - 谷歌应用引擎 api_server vs 模块
- ios - 为什么 uncaughtexceptionhandler 在发布版本中不起作用
- c# - 如何在.net core的库中包含文件
- ruby-on-rails - 为什么我的副本也会影响原件?
- javascript - 附加base64编码文件nodejs
- python - 在 Python 中传递指向 DLL 函数的指针
- qt - 如何将渐变设置为 QML TreeView 背景?
- python - python - 尝试使用 Apache 和 mod_wsgi 运行 Django 应用程序时,request.get("https://www.example.com") 不起作用
- python - 我完成了文档上的所有说明,但我仍然收到此错误