试验数据集

Experimenting with data set

我正在尝试使用以下代码,它非常适合训练。

作为练习,我尝试将其转换为数据集并在数据集上进行训练,但未能成功。

def gen_labels(series, nums):
  raw_labels=[]
  labels =[]
  for i in range(0,nums):
    sum = 0
    for j in range(0,28):
      for k in range(0,28):        
        sum+=(math.cos(series[i][j][k])+j*2-k*2)*(math.sin(series[i][j][k])+j*2-k*2)
    n = random.random()
    sum = sum+(n-0.5)*28*28*100
    raw_labels.append(sum)   
    if sum > 405000:
      sum = 1.0
    else:
      sum = 0.0
    labels.append(sum)  
  print(raw_labels)  
  return np.asarray(labels)

num_samples = 100
series = np.random.rand(num_samples,28,28)
labels = gen_labels(series,num_samples)

valid_series = np.random.rand(num_samples,28,28)
valid_labels = gen_labels(valid_series,num_samples)


input = tf.keras.layers.Input((28,28,1))
x = tf.keras.layers.Conv2D(64, (3,3), activation="relu")(input)
x = tf.keras.layers.Flatten()(x)

model = tf.keras.Model(input, x)
model.compile(loss='mse',
              optimizer='adam',
              metrics=['accuracy'])

history = model.fit(series, labels, epochs=30,verbose=2, validation_data = (valid_series, valid_labels))

我尝试了一些尝试,例如尝试合并系列和标签,但我没有这样做:

train_ds = tf.data.Dataset.from_tensor_slices(series)
...
history = model.fit(train_ds, epochs=30,verbose=2, validation_data = vtrain_ds)

我尝试的最后一件事是使我的系列成为 (100,28,28,1) 形状并将结果存储在最后一个维度上。

def gen_labels(series, nums):
  raw_labels=[]
  labels =[]
  series = np.expand_dims(series, axis=-1)
  for i in range(0,nums):
    sum = 0
    for j in range(0,28):
      for k in range(0,28):        
        sum+=(math.cos(series[i][j][k])+j*2-k*2)*(math.sin(series[i][j][k])+j*2-k*2)
    n = random.random()
    sum = sum+(n-0.5)*28*28*100
    raw_labels.append(sum)   
    if sum > 405000:
      sum = 1.0
    else:
      sum = 0.0
    labels.append(sum)
    series[i][j][k][0] = sum
  print(series)    
  return series 

但是在训练时我会得到: WARNING:tensorflow:Model 是用形状 (None, 28, 28, 1) 构造的,用于输入 KerasTensor(type_spec=TensorSpec(shape=(None, 28, 28, 1), dtype=tf.float32, name='input_6'), name='input_6', description="created by layer 'input_6'"), 但它是在形状不兼容的输入上调用的 (28, 28, 1, 1) 最初我想做一些类似于时间序列的事情,我会使用 map 方法将最后一列放入一个单独的维度,即

dataset = dataset.map(lambda w: (w[:-1], w[1:]))

如果我想在这种情况下使用数据集,您认为最好的方法是什么?

不确定您的数据是什么,但您需要在创建数据集时指定标签,如下所示:train_ds = tf.data.Dataset.from_tensor_slices((series,labels))

另外,如果是二分类问题,用loss='binary_crossentropy'比较合适。

您还需要使用 data.reshape(28,28,1)

重塑数据

最后,您应该停止使用 suminput 等变量名称。这些是保留关键字,在其中存储变量可能会导致意外结果。

像这样创建数据集应该可行。需要对数据集进行批处理。在此示例中,series 的形状为 (n_samples,28,28,1)

train_ds = tf.data.Dataset.from_tensor_slices((series,labels)).batch(5)
valid_ds = tf.data.Dataset.from_tensor_slices((valid_series,valid_labels)).batch(5)