wxy*_*wxy 8 python keras tensorflow tensorflow-datasets
我是 tensorflow keras 和数据集的新手。谁能帮我理解为什么下面的代码不起作用?
import tensorflow as tf
import tensorflow.keras as keras
import numpy as np
from tensorflow.python.data.ops import dataset_ops
from tensorflow.python.data.ops import iterator_ops
from tensorflow.python.keras.utils import multi_gpu_model
from tensorflow.python.keras import backend as K
data = np.random.random((1000,32))
labels = np.random.random((1000,10))
dataset = tf.data.Dataset.from_tensor_slices((data,labels))
print( dataset)
print( dataset.output_types)
print( dataset.output_shapes)
dataset.batch(10)
dataset.repeat(100)
inputs = keras.Input(shape=(32,)) # Returns a placeholder tensor
# A layer instance is callable on a tensor, and returns a tensor.
x = keras.layers.Dense(64, activation='relu')(inputs)
x = keras.layers.Dense(64, activation='relu')(x)
predictions = keras.layers.Dense(10, activation='softmax')(x)
# Instantiate the model given inputs and outputs.
model = keras.Model(inputs=inputs, outputs=predictions)
# The compile step specifies the training configuration.
model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
# Trains for 5 epochs
model.fit(dataset, epochs=5, steps_per_epoch=100)
Run Code Online (Sandbox Code Playgroud)
它失败并出现以下错误:
model.fit(x=dataset, y=None, epochs=5, steps_per_epoch=100)
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 1510, in fit
validation_split=validation_split)
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 994, in _standardize_user_data
class_weight, batch_size)
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 1113, in _standardize_weights
exception_prefix='input')
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_utils.py", line 325, in standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking input: expected input_1 to have 2 dimensions, but got array with shape (32,)
Run Code Online (Sandbox Code Playgroud)
根据 tf.keras 指南,我应该能够直接将数据集传递给 model.fit,如下例所示:
输入 tf.data 数据集
使用数据集 API 扩展到大型数据集或多设备训练。将 tf.data.Dataset 实例传递给 fit 方法:
# Instantiates a toy dataset instance:
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)
dataset = dataset.repeat()
Run Code Online (Sandbox Code Playgroud)
steps_per_epoch在调用fit数据集时不要忘记指定。model.fit(dataset, epochs=10, steps_per_epoch=30) 这里,fit 方法使用steps_per_epoch 参数——这是模型在移动到下一个epoch 之前运行的训练步数。由于数据集会生成批量数据,因此此代码段不需要 batch_size。
数据集也可用于验证:
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32).repeat()
val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_labels))
val_dataset = val_dataset.batch(32).repeat()
model.fit(dataset, epochs=10, steps_per_epoch=30,
validation_data=val_dataset,
validation_steps=3)
Run Code Online (Sandbox Code Playgroud)
我的代码有什么问题,正确的做法是什么?
关于您为什么收到错误的原始问题:
Error when checking input: expected input_1 to have 2 dimensions, but got array with shape (32,)
Run Code Online (Sandbox Code Playgroud)
您的代码中断的原因是因为您没有将.batch()back应用于dataset变量,如下所示:
dataset = dataset.batch(10)
Run Code Online (Sandbox Code Playgroud)
您只需调用dataset.batch().
这会中断,因为没有batch()输出张量不会批量处理,即您得到的是 shape(32,)而不是(1,32).
小智 3
您缺少定义迭代器,这就是出现错误的原因。
data = np.random.random((1000,32))
labels = np.random.random((1000,10))
dataset = tf.data.Dataset.from_tensor_slices((data,labels))
dataset = dataset.batch(10).repeat()
inputs = Input(shape=(32,)) # Returns a placeholder tensor
# A layer instance is callable on a tensor, and returns a tensor.
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)
# Instantiate the model given inputs and outputs.
model = keras.Model(inputs=inputs, outputs=predictions)
# The compile step specifies the training configuration.
model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),
loss='categorical_crossentropy',
metrics=['accuracy'])
# Trains for 5 epochs
model.fit(dataset.make_one_shot_iterator(), epochs=5, steps_per_epoch=100)
Run Code Online (Sandbox Code Playgroud)
Epoch 1/5 100/100 [================================] - 1s 8ms/步 - 损失:11.5787 - acc :0.1010
Epoch 2/5 100/100 [================================] - 0s 4ms/步 - 损失:11.4846 - acc :0.0990
Epoch 3/5 100/100 [================================] - 0s 4ms/步 - 损失:11.4690 - acc :0.1270
Epoch 4/5 100/100 [================================] - 0s 4ms/步 - 损失:11.4611 - acc :0.1300
Epoch 5/5 100/100 [================================] - 0s 4ms/步 - 损失:11.4546 - acc :0.1360
这是我的系统上的结果。
| 归档时间: |
|
| 查看次数: |
12373 次 |
| 最近记录: |