#python #tensorflow #tensorflow2.0 #tensorflow-datasets
Вопрос:
Я пытаюсь обучить CNN с помощью TFRecordDataset
(что, я думаю, не связано, но это мой случай) и получаю следующую ошибку:
Ошибка значения: индекс среза 0 измерения 0 выходит за пределы. для ‘{{узел strided_slice}} = StridedSlice[Индекс=DT_INT32, T=DT_INT32, begin_mask=0, ellipsis_mask=0, end_mask=0, new_axis_mask=0, shrink_axis_mask=1](Форма, strided_slice/стек, strided_slice/stack_1, strided_slice/stack_2)’ с входными формами: [0], [1], [1], [1] и с вычисленными входными тензорами: вход[1] = <0>, вход[2] = <0><1>, ввод[3] = <1><1>.
В качестве примера, это код, который я выполняю:
CNN:
import tensorflow as tf
def get_cnn_model(input_shape=(31, 31, 9), n_outputs=4, convolutions=3, optimizer='adam', seed=26):
tf.random.set_seed(seed=seed)
_input = layers.Input(shape=input_shape, name='input')
x = layers.Conv2D(64, (4, 4), activation='relu', padding='same', name=f'conv_0')(_input)
x = layers.MaxPooling2D(2)(x)
for i in range(convolutions - 1):
x = layers.Conv2D(64, (4, 4), activation='relu', padding='same', name=f'conv_{i 1}')(x)
x = layers.MaxPooling2D(2)(x)
x = layers.Flatten()(x)
x = layers.Dense(128, activation='relu', name='dense_1')(x)
x = layers.Dropout(0.35, name='dropout_1')(x)
x = layers.Dense(128, activation='relu', name='dense_2')(x)
x = layers.Dropout(0.35, name='dropout_2')(x)
p = layers.Dense(n_outputs, activation='tanh', name='p')(x)
v = layers.Dense(1, activation='tanh', name='v')(x)
cnn_model = Model(inputs=_input, outputs=[v, p])
losses = {
"v": 'mean_squared_error',
"p": keras.losses.BinaryCrossentropy()
}
cnn_model.compile(loss=losses, optimizer=optimizer)
return cnn_model
cnn = get_cnn_model((31, 31, 9), n_outputs=16, convolutions=3, optimizer='adam', seed=26)
Это образец набора данных:
import numpy as np
import tensorflow as tf
v = 0.9
p = np.random.randn(16)
state = np.random.randn(31*31*9)
sample = tf.train.Example(
features = tf.train.Features(
feature = {
'v': tf.train.Feature(float_list=tf.train.FloatList(value=[v])),
'p': tf.train.Feature(float_list=tf.train.FloatList(value = p)),
's': tf.train.Feature(float_list=tf.train.FloatList(value = state))
}
)
)
with tf.io.TFRecordWriter('tf_record_data') as f:
f.write(sample.SerializeToString())
Это процесс обучения, в котором я получаю ошибку, описанную выше:
def read_tfrecord(example):
feature_desc = {
'v': tf.io.FixedLenFeature([], tf.float32),
'p': tf.io.VarLenFeature(tf.float32),
's': tf.io.VarLenFeature(tf.float32)
}
sample = tf.io.parse_single_example(example, feature_desc)
x = tf.reshape(tf.sparse.to_dense(parsed['s']), (1,31,31, 9))
y = {'v':sample['v'], 'p': tf.sparse.to_dense(sample['p'])}
return x, y
ds = tf.data.TFRecordDataset(['tf_record_data'])
ds = ds.map(read_tfrecord)
cnn.fit(ds)
Интересно то, что когда я предсказываю по набору данных, это действительно работает:
import numpy as np
for serialized in tf.data.TFRecordDataset(['tf_record_data']):
parsed = tf.io.parse_single_example(serialized, feature_desc)
st= tf.sparse.to_dense(parsed['s'])
t = tf.reshape(st, (1, 31, 31, 9))
print(cnn.predict(t))
Как я могу исправить эту ошибку?
Ответ №1:
Я изменил карту для записи данных на следующую:
def read_tfrecord(example):
feature_desc = {
'v': tf.io.FixedLenFeature([], tf.float32),
'p': tf.io.VarLenFeature(tf.float32),
's': tf.io.VarLenFeature(tf.float32)
}
sample = tf.io.parse_single_example(example, feature_desc)
x = tf.reshape(tf.sparse.to_dense(parsed['s']), (1,rows,cols, layers))
p = tf.reshape(tf.sparse.to_dense(parsed['p']), (1, 16))
v = tf.reshape(sample['v'], (1, 1))
y = {'v':v, 'p': p}
return x, y
изменение формы выходных данных устранило проблему