我正在编写一个非常简单的网络:
import tensorflow as tfimport matplotlib.pyplot as pltimport numpy as nptraining_data = np.array([[1, 1, 1], [2, 3, 1], [0, -1, 4], [0, 3, 0], [10, -6, 8], [-3, -12, 4]])testing_data = np.array([6, 11, 1, 9, 10, -38])model = tf.keras.Sequential()model.add(tf.keras.layers.Dense(units = 1, activation = tf.keras.activations.relu, input_shape = (3, )))model.compile(optimizer = tf.keras.optimizers.RMSprop(0.001), loss = tf.keras.losses.mean_squared_error, metrics = tf.keras.metrics.mean_squared_error)model.summary()model.fit(training_data, testing_data, epochs = 1, verbose = 'False')print("Traning completed.")model.predict(np.array([1, 1, 1]))
目标是训练权重以实现如下形式: aX + bY + cZ = (输出)
但是我遇到了错误
ValueError: 层 sequential_54 的输入 0 与该层不兼容: 期望输入形状的轴 -1 的值为 3,但接收到的输入形状为 [None, 1]
我无法理解这些维度,我做错了什么!有谁能帮帮我吗?
回答:
在 Keras 中,当你指定输入形状时,批量大小会被忽略,详细信息请参考 这里。你的 input_shape = (3, )
声明是正确的,但在进行推理时,你也需要考虑批量大小,通过为其添加一个额外的维度,因此你需要将 np.array([1, 1, 1])
改为 np.array([[1, 1, 1]])
。
import tensorflow as tfimport matplotlib.pyplot as pltimport numpy as nptraining_data = np.array([[1, 1, 1], [2, 3, 1], [0, -1, 4], [0, 3, 0], [10, -6, 8], [-3, -12, 4]])testing_data = np.array([6, 11, 1, 9, 10, -38])model = tf.keras.Sequential()model.add(tf.keras.layers.Dense(units = 1, activation = tf.keras.activations.relu, input_shape = (3,)))model.compile(optimizer = tf.keras.optimizers.RMSprop(0.001), loss = tf.keras.losses.mean_squared_error, metrics = [tf.keras.metrics.mean_squared_error])model.summary()model.fit(training_data, testing_data, epochs = 1, verbose = 'False')print("Traning completed.")model.predict(np.array([[1, 2, 1]]))array([[0.08026636]], dtype=float32)