#python #tensorflow #deep-learning #autoencoder
#питон #тензорный поток #глубокое обучение #автоэнкодер
Вопрос:
Я пытаюсь создать автоэнкодер шумоподавления для данных временных рядов. Но я получаю сообщение «Преобразование строки в float не поддерживается», когда пытаюсь обучить модель.
Данные, которые я использовал, имеют следующую форму:
print(np.shape(noisy_samples))
print(np.shape(samples))
Вывод:
(98, 8000, 2) (98, 8000, 2)
Тип данных изменен на numpy array:
data_noisy=np.array(noisy_samples)
data_pure=np.array(samples)
print(type(data_pure))
print(type(data_noisy))
Вывод:
<класс ‘numpy.ndarray’> <класс ‘numpy.ndarray’>
Модель автоэнкодера:
import tensorflow.keras
from tensorflow.keras.models import Sequential, save_model, Model
from tensorflow.keras.layers import Conv1D, Conv1DTranspose, Input, MaxPooling1D, Flatten, Dense, Reshape, UpSampling1D
from tensorflow.keras.constraints import max_norm
import matplotlib.pyplot as plt
import numpy as np
import math
batch_size = 5
no_epochs = 5
train_test_split = 0.3
validation_split = 0.2
verbosity = 1
max_norm_value = 2.0
input_sig = Input(batch_shape=(1,8000,2))
x = Conv1D(16, 3, activation="relu", padding="same")(input_sig)
#x = BatchNormalization()(x)
x = MaxPooling1D(2, padding="same")(x)
x = Conv1D(1, 3, activation="relu", padding="same")(x)
#x = BatchNormalization()(x)
encoded = MaxPooling1D(2, padding="same")(x)
encoder = Model(input_sig, encoded)
x = Conv1D(1, 3, activation="relu", padding="same")(encoded)
#x = BatchNormalization()(x)
x = UpSampling1D(2)(x)
x = Conv1D(16, 2, activation='relu', padding="same")(x)
#x = BatchNormalization()(x)
x = UpSampling1D(2)(x)
decoded = Conv1D(2, 3, activation='sigmoid', padding='same')(x)
model = Model(input_sig, decoded)
model.summary()
model.compile(optimizer='adam', loss='binary_crossentropy')
model.fit(data_noisy, data_pure, epochs = no_epochs, batch_size =batch_size )
Вывод:
Модель: «model_1» _________________________________________________________________ Слой (тип) Параметр формы вывода #
================================================================= input_1 (InputLayer) [(1, 8000, 2)] 0
_________________________________________________________________ conv1d (Conv1D) (1, 8000, 16) 112
_________________________________________________________________ max_pooling1d (MaxPooling1D) (1, 4000, 16) 0
_________________________________________________________________ conv1d_1 (Conv1D) (1, 4000, 1) 49
_________________________________________________________________ max_pooling1d_1 (MaxPooling1 (1, 2000, 1) 0
_________________________________________________________________ conv1d_2 (Conv1D) (1, 2000, 1) 4
_________________________________________________________________ up_sampling1d (UpSampling1D) (1, 4000, 1) 0
_________________________________________________________________ conv1d_3 (Conv1D) (1, 4000, 16) 48
_________________________________________________________________ up_sampling1d_1 (UpSampling1 (1, 8000, 16) 0
_________________________________________________________________ conv1d_4 (Conv1D) (1, 8000, 2) 98
================================================================= Всего параметров: 311 Обучаемых параметров: 311 Нет-обучаемые параметры: 0 _________________________________________________________________ Эпоха 1/5 ————————————————————————— Обратная трассировка невыполненной ошибки (последний последний вызов) в () 46 model.summary() 47 model.compile(optimizer=’adam’, loss=’binary_crossentropy’) —> 48 model.fit(data_noisy, data_pure, epochs = no_epochs, batch_size =batch_size ) 496 кадров /usr/local/lib/python3.6/dist-packages/tensorflow/python/нетерпеливый / выполнить.py в quick_execute(op_name, num_outputs, inputs, attrs, ctx, name) 58 ctx.ensure_initialized() 59 тензоры = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name, —> 60 входов, attrs, num_outputs) 61, кроме ядра._NotOkStatusException как e: 62, если имя не равно None:
UnimplementedError: приведение строки к плавающей не поддерживается [[модель узла_1/ Приведение (определено в:48) ]] [Op:__вывод_поезд_функция_79115]
Стек вызовов функций: train_function
Я попытался проверить свои образцы данных, они не содержат никаких строковых значений.
Комментарии:
1. Вы уверены, что все значения в ваших массивах являются числовыми?
2. Пожалуйста, проверьте типы элементов вашего массива. Кажется, что по крайней мере один из них является строкой, и что ваши внутренние процессы принимают значение float . Большинство этих подпрограмм ожидают, что вы очистите входные данные; вам придется преобразовать в float перед вызовом.
Ответ №1:
Просто запустите проверку своих массивов, чтобы увидеть, где у вас может быть строковое значение. Сделайте что-то вроде (если arr
это ваш массив):
q = []
for i in arr:
try:
q.append(np.float(i))
except ValueError as e:
q.append(np.nan)
baz = np.where(np.isnan(q))