Tensorflow - ValueError: NumPy 배열을 Tensor로 변환하지 못했습니다(지원되지 않는 개체 유형 플로트).
이전 질문의 계속:Tensorflow - TypeError: 'int' 개체는 주목할 만하다.
제 교육 데이터는 각각 1,000개의 플로트로 구성된 목록입니다.를 들면, 들면를예,x_train[0] =
[0.0, 0.0, 0.1, 0.25, 0.5, ...]
제 모델은 다음과 같습니다.
model = Sequential()
model.add(LSTM(128, activation='relu',
input_shape=(1000, 1), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
opt = tf.keras.optimizers.Adam(lr=1e-3, decay=1e-5)
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
다음과 같은 오류가 발생합니다.
Traceback (most recent call last):
File "C:\Users\bencu\Desktop\ProjectFiles\Code\Program.py", line 88, in FitModel
model.fit(x_train, y_train, epochs=3, validation_data=(x_test, y_test))
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 728, in fit
use_multiprocessing=use_multiprocessing)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 224, in fit
distribution_strategy=strategy)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 547, in _process_training_inputs
use_multiprocessing=use_multiprocessing)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py", line 606, in _process_inputs
use_multiprocessing=use_multiprocessing)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\data_adapter.py", line 479, in __init__
batch_size=batch_size, shuffle=shuffle, **kwargs)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\keras\engine\data_adapter.py", line 321, in __init__
dataset_ops.DatasetV2.from_tensors(inputs).repeat()
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\data\ops\dataset_ops.py", line 414, in from_tensors
return TensorDataset(tensors)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\data\ops\dataset_ops.py", line 2335, in __init__
element = structure.normalize_element(element)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\data\util\structure.py", line 111, in normalize_element
ops.convert_to_tensor(t, name="component_%d" % i))
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1184, in convert_to_tensor
return convert_to_tensor_v2(value, dtype, preferred_dtype, name)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1242, in convert_to_tensor_v2
as_ref=False)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\ops.py", line 1296, in internal_convert_to_tensor
ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\tensor_conversion_registry.py", line 52, in _default_conversion_function
return constant_op.constant(value, dtype, name=name)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\constant_op.py", line 227, in constant
allow_broadcast=True)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\constant_op.py", line 235, in _constant_impl
t = convert_to_eager_tensor(value, ctx, dtype)
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\constant_op.py", line 96, in convert_to_eager_tensor
return ops.EagerTensor(value, ctx.device_name, dtype)
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type float).
오류를 직접 검색해 봤는데, 사용하는 방법에 대해 뭔가를 발견했습니다.tf.convert_to_tensor
. 및 교육 및 테스트 목록을 전달하려고 했지만 기능이 받지 않습니다.
TL;DR 몇 가지 가능한 오류, 대부분 수정됨x = np.asarray(x).astype('float32')
.
잘못된 데이터 전처리일 수도 있습니다. 모든 형식(범주, Nan, 문자열 등)이 올바른지 확인하십시오.아래는 모델이 기대하는 바를 보여줍니다.
[print(i.shape, i.dtype) for i in model.inputs]
[print(o.shape, o.dtype) for o in model.outputs]
[print(l.name, l.input_shape, l.dtype) for l in model.layers]
문제는 Numpy 어레이와 달리 목록을 입력으로 사용하는 것에 뿌리를 두고 있습니다. Keras/TF는 Numpy 어레이를 지원하지 않습니다.간단한 변환은 다음과 같습니다.x_array = np.asarray(x_list)
.
LSTM의 , 입니다. LSTM은 3D 텐서입니다.(batch_size, timesteps, features)
에 상응하는, 또는그동게하등와,,(num_samples, timesteps, channels)
마지막으로 디버그 프로팁으로 데이터에 대한 모든 모양을 인쇄합니다.아래 위의 모든 사항을 충족하는 코드:
Sequences = np.asarray(Sequences)
Targets = np.asarray(Targets)
show_shapes()
Sequences = np.expand_dims(Sequences, -1)
Targets = np.expand_dims(Targets, -1)
show_shapes()
# OUTPUTS
Expected: (num_samples, timesteps, channels)
Sequences: (200, 1000)
Targets: (200,)
Expected: (num_samples, timesteps, channels)
Sequences: (200, 1000, 1)
Targets: (200, 1)
보너스 팁으로, 저는 당신이 다음을 통해 달리고 있다는 것을 알아챘습니다.main()
따라서 당신의 IDE는 아마도 주피터와 같은 셀 기반 실행이 부족할 것입니다. 저는 Spyder IDE를 강력히 추천합니다.간단히 추가할 수 있습니다.# In[]
그고다치는그리는치를 누릅니다.Ctrl + Enter
아래:아래:아래:

사용된 기능:
def show_shapes(): # can make yours to take inputs; this'll use local variable values
print("Expected: (num_samples, timesteps, channels)")
print("Sequences: {}".format(Sequences.shape))
print("Targets: {}".format(Targets.shape))
위의 모든 것을 시도했지만 성공하지 못했고, 제 문제는 제 데이터의 열 중 하나가boolean
가치. 을 모든것로변것환는으로 변환하는 것.np.float32
문제를 해결했습니다!
import numpy as np
X = np.asarray(X).astype(np.float32)
이렇게 하면 효과가 있습니다.
x_train = np.asarray(x_train).astype(np.float32)
y_train = np.asarray(y_train).astype(np.float32)
이는 기본적으로 플로트와 아무런 관련이 없는 일반적인 오류이기 때문에 매우 오해의 소지가 있는 오류입니다.
를 들어, 제 했습니다.np.NaN
그 안에 있는 가치들.계산해 보세요!
빈 문자열로 대체하여 수정:
df.fillna(value='', inplace=True)
또는 문자열(예: 'object') 열에 대해서만 이 작업을 수행하는 것이 더 구체적입니다.
cols = df.select_dtypes(include=['object'])
for col in cols.columns.values:
df[col] = df[col].fillna('')
np.float32를 tf.float32(케라 및 텐서 흐름을 읽는 데이터 형식)로 변환해 보십시오.
tf.convert_to_tensor(X_train, dtype=tf.float32)
저는 많은 다양한 입력과 목표 변수가 있었고 어떤 변수가 문제의 원인인지 알지 못했습니다.
경로가 스택 추적에 지정되어 있는 라이브러리 패키지에 인쇄 값을 추가하면 어떤 변수가 중단되는지 확인할 수 있습니다.
File "C:\Users\bencu\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow_core\python\framework\constant_op.py", line 96, in convert_to_eager_tensor
return ops.EagerTensor(value, ctx.device_name,
추가print
코드의 이 부분에 있는 문장을 통해 어떤 입력이 문제의 원인인지 알 수 있었습니다.
constant_op.py
:
....
dtype = dtype.as_datatype_enum
except AttributeError:
dtype = dtypes.as_dtype(dtype).as_datatype_enum
ctx.ensure_initialized()
print(value) # <--------------------- PUT PRINT HERE
return ops.EagerTensor(value, ctx.device_name, dtype)
어느 값에서 변환이 문제가 되는지 관찰한 후int
astype(np.float32)
문제를 해결했습니다.
버전의 차이로 인해 발생할 수도 있습니다(이 문제를 해결하기 위해 텐서플로 2.1.0에서 2.0.0.beta1로 다시 이동해야 했습니다).
위의처럼, 위의대의사대것답처럼변한이, 터환이데부람분으로 하는 것.np.float32 / float32
이미 여기서 말한 여러 가지 방법으로
" 렇게하동다안음같은오발경우생할그류가과는▁which우▁error▁while그▁"▁you▁is▁another▁get▁if▁so▁doing"라는 다른 오류가 발생하면 다음과 같습니다.ValueError: setting an array element with a sequence
".
를 이경데이다변보환십해시오로음으로 해 보세요.type list
아까 시도했던 것처럼 유형 텐서로 변환합니다.
당신은 이것을 사용하는 것이 좋을 것입니다, 그것은 호환되지 않는 버전의 케라 버전 때문입니다.
from keras import backend as K
X_train1 = K.cast_to_floatx(X_train)
y_train1 = K.cast_to_floatx(y_train)
을 력입 데 이 터 세 또 배 데 유 터 확 다 있 니 다 습 수 할 변 환 로 으 음 고 하 인 을 형 이 트 의 는 열 ▁it ▁you ▁types ▁want ▁to ▁and ▁convert ▁set ▁in ▁check ▁input ▁array ▁may ▁data ▁data ▁than ▁to▁or 입 력 다 니float32
:
train_X[:2, :].view()
#array([[4.6, 3.1, 1.5, 0.2],
# [5.9, 3.0, 5.1, 1.8]], dtype=object)
train_X = train_X.astype(np.float32)
#array([[4.6, 3.1, 1.5, 0.2],
# [5.9, 3. , 5.1, 1.8]], dtype=float32)
DataFrame을 사용하고 여러 개의 열 유형이 있는 경우 이 옵션을 사용합니다.
numeric_list = df.select_dtypes(include=[np.number]).columns
df[numeric_list] = df[numeric_list].astype(np.float32)
동일한 문제가 발생했습니다. 예상했던 것처럼 배열이 아닌 배열 개체의 배열을 전달하려고 했기 때문입니다.이것이 미래에 누군가에게 도움이 되기를 바랍니다!
해라
X_train =t ensorflow.convert_to_tensor(X_train, dtype=tensorflow.float32)
y_train = tensorflow.convert_to_tensor(y_train, dtype=tensorflow.float32)
X_test = tensorflow.convert_to_tensor(X_test, dtype=tensorflow.float32)
y_test = tensorflow.convert_to_tensor(y_test, dtype=tensorflow.float32)
제 경우엔, 제가 캐스팅을 할 수가 없었어요.np.float32
.
중에되었습니다.tf.data.Dataset.from_generator
의 으로서.fit()
가 전화를 때, 만제가전화하를려했을때고하지▁),때했을▁),▁when▁i하▁but려고하지▁to▁call▁trying.predict()
사용)에서 (np.array는 다음과 같습니다.)
을 다시 .x_array.reshape(1, -1)
예측을 호출하기 전에 성공했습니다.
데이터를 가져오는 동안 부동 소수점 형식을 적용하여 이 문제를 방지했습니다.
df = pd.read_csv("csv"), dtype='csv')
OverLord GoldDragon의 선택된 답변은 제 상황에서 귀중한 단서를 제공했지만, 저는 제 특정 상황을 바로잡기 위해 몇 시간을 소비해야 했습니다.여기에 비슷한 상황에 있는 다른 사람들을 돕기 위한 메모를 추가합니다.
저는 제 케라에 대한 입력을 생산하고 있습니다. 순적model.fit()
"Timeseries Generator"의 합니다.keras.preprocessing.sequences
모듈.이 클래스는 다음과 같은 구조를 가진 내장형/부동형의 파이썬으로 5D 시퀀스를 출력하고 있었습니다.
- 레벨 5 - 배치(1000개의 항목이 포함된 교육 세트에 대해 배치 크기가 100개의 샘플이었기 때문에 10개의 배치 두 개)
- 레벨 4 - X 및 Y 변수(하나는 x 변수를 나타내고 다른 하나는 배치에 대한 y 변수를 나타내는 2개의 n차원 numpy 배열의 튜플)
- 100개의 샘플로 구성된 레벨 33 차원 numpy 배열 - X 변수의 경우 100(배치 크기)x20(시퀀스 길이)x10(피처 없음) 배열 - Y 변수의 경우 마지막 차원이 10이 아니라 1 크기입니다.
- 수준 2 - 각 표본은 x의 경우 20(시퀀스 길이)x10(피쳐 없음), y 변수의 경우 20x1(피쳐 없음)의 2D 배열입니다.
- 레벨 1 - 네이티브 파이썬 유형의 스칼라입니다.
이 를 여에있조언따에로 하려고 했을 때.x = np.asarray(x).astype('float32')
Timeseries Generator의 표준 출력에는 처음 두 수준의 배열/목록 대신 길이가 불변하고 균질하지 않은 튜플이 있기 때문에 실패했습니다(마지막 배치는 잔여 샘플 수만 수용할 수 있기 때문에 다른 배치보다 샘플 수가 적습니다(내 경우 79개).
저는 이 캐스팅이 타임즈 시리즈의 출력물에 효과가 있도록 하기 위해 많은 노력을 했습니다.Generator, 하지만 마지막으로 가장 간단한 해결책은 제안된 방법을 사용하여 Timeseries Generator 생성자에 입력을 명시적으로 캐스팅하는 것이었습니다.x = np.asarray(x).astype('float32')
) 및 문제는 이러한 numpind 배열이 네이티브 pythonint 및 float 유형을 유지하는 전처리 파이프라인에 의해 출력된다는 것이었습니다.이러한 배열을 numpy float32 유형으로 캐스트하면 model.fit()가 NumpyArray를 텐서 흐름으로 변환하지 못한 경우 ValueError를 제공하지 않습니다.
이 노트가 이 문제에 직면한 다른 사람에게 도움이 되기를 바랍니다.
나는 몇몇 판다 시리즈에서 같은 문제를 마주쳤고, 생각했습니다.
data = my_series.to_numpy()
충분하지만 Objectd 유형만 제공하고 64를 강제로 띄우거나 작동하지 않는 것만 제공합니다.
이 문제는 다음을 사용하여 해결되었습니다.
data = my_series.to_list()
대신.그리고나서
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
의도한 대로 작동했습니다.
언급URL : https://stackoverflow.com/questions/58636087/tensorflow-valueerror-failed-to-convert-a-numpy-array-to-a-tensor-unsupporte
'programing' 카테고리의 다른 글
장고에서 한 앱에서 다른 앱으로 외부 키. (0) | 2023.07.23 |
---|---|
SpringCloud Gateway - 수신 요청 URL 및 해당 경로 URI 기록 (0) | 2023.07.18 |
사전의 값과 키를 교환하려면 어떻게 해야 합니까? (0) | 2023.07.18 |
장고 1.7은 장고.core.exceptions를 던집니다.AppRegistryNotReady: 모델이 아직 로드되지 않았습니다. (0) | 2023.07.18 |
Oracle에서 데이터베이스 개체가 테이블 또는 보기인지 확인하는 방법 (0) | 2023.07.18 |