programing

Tensorflow - ValueError: NumPy 배열을 Tensor로 변환하지 못했습니다(지원되지 않는 개체 유형 플로트).

subpage 2023. 7. 18. 21:45
반응형

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)

어느 값에서 변환이 문제가 되는지 관찰한 후intastype(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 시퀀스를 출력하고 있었습니다.

  1. 레벨 5 - 배치(1000개의 항목이 포함된 교육 세트에 대해 배치 크기가 100개의 샘플이었기 때문에 10개의 배치 두 개)
  2. 레벨 4 - X 및 Y 변수(하나는 x 변수를 나타내고 다른 하나는 배치에 대한 y 변수를 나타내는 2개의 n차원 numpy 배열의 튜플)
  3. 100개의 샘플로 구성된 레벨 33 차원 numpy 배열 - X 변수의 경우 100(배치 크기)x20(시퀀스 길이)x10(피처 없음) 배열 - Y 변수의 경우 마지막 차원이 10이 아니라 1 크기입니다.
  4. 수준 2 - 각 표본은 x의 경우 20(시퀀스 길이)x10(피쳐 없음), y 변수의 경우 20x1(피쳐 없음)의 2D 배열입니다.
  5. 레벨 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

반응형