Как tf.dataset взаимодействует с keras.conv1D? - PullRequest
0 голосов
/ 13 января 2020

Я использую tf 1.15, я пытаюсь выполнить задачу регрессии, используя сигнал.

Прежде всего я загружаю свои сигналы в конвейер, у меня есть несколько файлов, здесь я моделирую загрузку используя np.zeros, чтобы сделать код пригодным для использования вами. Каждый файл имеет эту форму (?, 75000, 3), где? случайное число элементов, 75000 - количество выборок в каждом элементе, а 3 - количество сигналов.

Используя tf.data, я распаковываю их и получаю набор данных, который выводит сигналы с этой формой ( 75000,), и я использую их в моей модели keras.

Все должно быть хорошо, пока я не создаю модель keras, я скопировал свой входной конвейер, потому что во время моих тестов я получал различные ошибки, используя обобщенный c tf .data.dataset или используя набор данных, построенный таким образом.

import numpy as np
import tensorflow as tf

# called in the dataset pipeline
def my_func(x):
    p = np.zeros([86, 75000, 3])
    x = p[:,:,0]
    y = p[:, :, 1]
    z = p[:, :, 2]
    return x, y, z

# called in the dataset pipeline
def load_sign(path):
    func = tf.compat.v1.numpy_function(my_func, [path], [tf.float64, tf.float64, tf.float64])
    return func

# Dataset pipeline
s = [1, 2]  # here i have the file paths, i simulate it with numbers
AUTOTUNE = tf.data.experimental.AUTOTUNE  
ds = tf.data.Dataset.from_tensor_slices(s)
# ds = ds.map(load_sign, num_parallel_calls=AUTOTUNE)
ds = ds.map(load_sign, num_parallel_calls=AUTOTUNE).unbatch()
itera = tf.data.make_one_shot_iterator(ds)
ABP, ECG, PLETH = itera.get_next() 

# Until there everything should be fine
# Here i create my convolutional network
signal = tf.keras.layers.Input(shape=(None,75000), dtype='float32')
x = tf.compat.v1.keras.layers.Conv1D(64, (1), strides=1, padding='same')(signal)
x = tf.keras.layers.Dense(75000)(x)
model = tf.keras.Model(inputs=signal, outputs=x, name='resnet18')

# And finally i try to insert my signal into model
logits = model(PLETH)

Я получаю эту ошибку:

ValueError: Вход 0 слоя conv1d несовместим со слоем: его ранг не определен, но слой требует определенного ранга.

Почему? И как я могу сделать это работает? Также входной размер моего net должен быть таким согласно документации:

3D-тензор с формой: (batch_size, steps, input_dim)

Что такое шаги? В моем случае я предполагаю, что это должно быть (batch_size, 1, 75000), верно?

...