试验数据集
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)
重塑数据
最后,您应该停止使用 sum
和 input
等变量名称。这些是保留关键字,在其中存储变量可能会导致意外结果。
像这样创建数据集应该可行。需要对数据集进行批处理。在此示例中,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)
我正在尝试使用以下代码,它非常适合训练。
作为练习,我尝试将其转换为数据集并在数据集上进行训练,但未能成功。
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)
最后,您应该停止使用 sum
和 input
等变量名称。这些是保留关键字,在其中存储变量可能会导致意外结果。
像这样创建数据集应该可行。需要对数据集进行批处理。在此示例中,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)