如何解决TensorFlow ValueError:无法将NumPy数组转换为Tensor不支持的对象类型列表
我正在尝试将this code写入colab。有趣的是,几天前我在colab中运行了相同的代码,但现在无法正常工作。该代码也可以在kaggle内核中使用。我尝试更改TensorFlow版本,但它们都给出了不同的错误。为什么您认为我无法运行此代码?如果您需要更多信息,则为colab notebook。 预先感谢!
DisasterDetector类:
def __init__(self,tokenizer,bert_layer,max_len =30,lr = 0.0001,epochs = 15,batch_size = 32,dtype = tf.int32,activation = 'sigmoid',optimizer = 'SGD',beta_1=0.9,beta_2=0.999,epsilon=1e-07,metrics = 'accuracy',loss = 'binary_crossentropy'):
self.lr = lr
self.epochs = epochs
self.max_len = max_len
self.batch_size = batch_size
self.tokenizer = tokenizer
self.bert_layer = bert_layer
self.models = []
self.activation = activation
self.optimizer = optimizer
self.dtype = dtype
self.beta_1 = beta_1
self.beta_2 = beta_2
self.epsilon =epsilon
self.metrics = metrics
self.loss = loss
def encode(self,texts):
all_tokens = []
masks = []
segments = []
for text in texts:
tokenized = self.tokenizer.convert_tokens_to_ids(['[CLS]'] + self.tokenizer.tokenize(text) + ['[SEP]'])
len_zeros = self.max_len - len(tokenized)
padded = tokenized + [0] * len_zeros
mask = [1] * len(tokenized) + [0] * len_zeros
segment = [0] * self.max_len
all_tokens.append(padded)
masks.append(mask)
segments.append(segment)
print(len(all_tokens[0]))
return np.array(all_tokens),np.array(masks),np.array(segments)
def make_model(self):
input_word_ids = Input(shape = (self.max_len,),dtype=tf.int32,name = 'input_word_ids')
input_mask = Input(shape = (self.max_len,name = 'input_mask')
segment_ids = Input(shape = (self.max_len,name = 'segment_ids')
#pooled output is the output of dimention and
pooled_output,sequence_output = self.bert_layer([input_word_ids,input_mask,segment_ids])
clf_output = sequence_output[:,:]
out = tf.keras.layers.Dense(1,activation = self.activation)(clf_output)
#out = tf.keras.layers.Dense(1,input_shape = (clf_output,) )(clf_output)
model = Model(inputs = [input_word_ids,segment_ids],outputs = out)
if self.optimizer is 'SGD':
optimizer = SGD(learning_rate = self.lr)
elif self.optimizer is 'Adam':
optimizer = Adam(learning_rate = self.lr,beta_1=self.beta_1,beta_2=self.beta_2,epsilon=self.epsilon)
model.compile(loss = self.loss,optimizer = self.optimizer,metrics = [self.metrics])
return model
def train(self,x,k = 3):
kfold = StratifiedKFold(n_splits = k,shuffle = True)
for fold,(train_idx,val_idx) in enumerate(kfold.split(x['cleaned_text'],x['target'])):
print('fold: ',fold)
x_trn = self.encode(x.loc[train_idx,'cleaned_text'])
x_val = self.encode(x.loc[val_idx,'cleaned_text'])
y_trn = np.array(x.loc[train_idx,'target'],dtype = np.uint8)
y_val = np.array(x.loc[val_idx,dtype = np.uint8)
print('the data type of y train: ',type(y_trn))
print('x_val shape',x_val[0].shape)
print('x_trn shape',x_trn[0].shape)
model = self.make_model()
print('model made.')
model.fit(x_trn,tf.convert_to_tensor(y_trn),validation_data = (x_val,tf.convert_to_tensor(y_val)),batch_size=self.batch_size,epochs = self.epochs)
self.models.append(model)
并且在调用该类的训练函数后,我得到了该错误。
classifier = DisasterDetector(tokenizer = tokenizer,bert_layer = bert_layer,max_len = max_len,epochs = 10,epsilon=1e-07)
classifier.train(train_cleaned)
这是错误:
ValueError Traceback (most
recent call last)
<ipython-input-10-106c756f2e47> in <module>()
----> 1 classifier.train(train_cleaned)
8 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/constant_op.py in convert_to_eager_tensor(value,ctx,dtype)
96 dtype = dtypes.as_dtype(dtype).as_datatype_enum
97 ctx.ensure_initialized()
---> 98 return ops.EagerTensor(value,ctx.device_name,dtype)
99
100
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).
解决方法
好吧,事实证明,由于没有给出适当的最大序列长度,TensorFlow会引发此错误。通过将max_len变量更改为54,我可以毫无困难地运行程序。因此,问题不在于输入的类型或numpy数组。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。