Подход к тензорному потоку, входные данные проверки (данные, (target1, target2)), получил ошибку: «не ожидал данных, но получил:» - PullRequest
0 голосов
/ 11 февраля 2019

Создайте подклассную модель с несколькими выходами, используйте наборы данных tenorflow в качестве входных данных.Пользовательские наборы данных.

Использовать керас, подходящие для модели поезда.

Когда я использую только набор данных поезда, он может работать.Но как только я использую наборы данных того же типа в качестве входных данных для проверки, происходит следующее: «Ошибка при проверке целевого объекта модели: ожидалось, что нет данных, но получено:«

Тип данных похож на «tuple (data, (target [0»)], target [1])) '

tenorflow-gpu == 1,12, tenorflow.keras

Неверная информация

File "/home/god/anaconda3/envs/tensorflow_n/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1574, in fit
steps=validation_steps)    

File "/home/god/anaconda3/envs/tensorflow_n/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 992, in _standardize_user_data
class_weight, batch_size)

File "/home/god/anaconda3/envs/tensorflow_n/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 1154, in _standardize_weights
exception_prefix='target')

File "/home/god/anaconda3/envs/tensorflow_n/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_utils.py", line 257, in standardize_input_data
'expected no data, but got:', data)

ValueError: ('Error when checking model target: expected no data, but got:', (<tf.Tensor 'IteratorGetNext_1:1' shape=(16, 16, 513) dtype=float32>, <tf.Tensor 'IteratorGetNext_1:2' shape=(16, 16, 513) dtype=float32>))

код упрощения вызывает ту же ошибку

import tensorflow as tf


class Model(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.dense1 = tf.keras.layers.Dense(units=16)
        self.dense2 = tf.keras.layers.Dense(units=16)

    def compute_output_shape(self, input_shape):
        return input_shape, input_shape

    def call(self, inputs, training=None, mask=None):
        out1 = self.dense1(inputs)
        out2 = self.dense2(inputs)
        return out1, out2


train_dataset = tf.data.Dataset.from_tensor_slices(
    (tf.constant(0., shape=[1024, 16]), (tf.constant(0., shape=[1024, 16]), tf.constant(0., shape=[1024, 16])))).repeat().batch(32)

valid_dataset = tf.data.Dataset.from_tensor_slices(
    (tf.constant(0., shape=[128, 16]), (tf.constant(0., shape=[128, 16]), tf.constant(0., shape=[128, 16])))).repeat(1).batch(32)

model = Model()
model.compile(
    optimizer=tf.train.AdamOptimizer(learning_rate=1e-4),
    loss=[tf.keras.losses.mse, tf.keras.losses.mse],
    loss_weights=[1, 1]
)
model.fit(
    train_dataset,
    validation_data=valid_dataset,
    epochs=10,
    steps_per_epoch=30,
    validation_steps=4,
)

1 Ответ

0 голосов
/ 11 февраля 2019

Keras не является PyTorch, вы не должны подкласс модели без очень продвинутой причины.

inputs = Input(input_shape)
out1 = Dense(16)(inputs)
out2 = Dense(16)(inputs)

model = tf.keras.Model(inputs, [out1,out2])

Разделите x и y при обучении:

x_train = your_tuple[0]
y_train = your_tuple[1]

model.fit(x_train, y_train, ....)
...