Q1:我有一个维度为 44 和 5 的矩阵,代表 5 个特征向量。我定义了两个模型:第一个是基本的神经网络结构,第二个使用卷积层。我对输入层和大小不太了解。所以,我需要一些反馈来确认代码是否正确。
X_train = np.random.rand(44, 5)
y_train = np.random.rand(44, 1)
X_rem = np.random.rand(11, 5)
X_train= np.asarray(X_train).astype(np.float32)
X_rem= np.asarray(X_rem).astype(np.float32)
y_train= np.asarray(y_train).astype(np.float32)
train_dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train))
BATCH_SIZE = 44
train_dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train))
test_dataset = tf.data.Dataset.from_tensor_slices((X_rem, y_rem))
.
model1 = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(5,)),
tf.keras.layers.Dense(10, activation='relu'),
#tf.keras.layers.Dense(5, activation='relu'),
tf.keras.layers.Dense(1)
])
.
model2 = tf.keras.Sequential([
tf.keras.layers.Input(shape=(5,)),
tf.keras.layers.Reshape((5, 1)),
tf.keras.layers.Conv1D(1, kernel_size=1, activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(12, activation='linear'),
tf.keras.layers.Dense(1)
])
model1.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.2),
loss='mean_absolute_error',
metrics=['mean_absolute_error'])
model2.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.2),
loss='mean_absolute_error',
metrics=['mean_absolute_error'])
Q2:如果代码正确,我有一个维度为 (44, 5) 的矩阵。那么,为什么输入形状指定为(5,)呢?据我了解,该模型需要以下格式的输入形状(批量大小、高度、宽度)。不过,我以前没有重塑过它们。
Q3:为什么使用“model1.predict(X_rem)”和“model2.predict(X_rem)”后,X_rem 中的所有值都得到相同的值? 'model1.fit(X_train, y_train, epochs=100)' 和 'model1.fit(train_dataset, epochs=100)' 这两个函数的用法有区别吗?
我尝试在定义模型之前重塑输入数据。我从未完全理解其背后的概念。
Q1 : Yes, the code is correct.
Q2: The input shape is defined as `(5,)` because you are using `Conv1D`. If you use `Conv2D` then you need to add one dimension more.
When using `Conv1d` , the convolution takes place on one axis (the first axis).
When using `Conv2D`, the convolution uses 2 dimensions, so 2 axis.
Q3:您收到相同的值有两个原因:
你的学习率非常大,因此模型无法获得正确的梯度。
您仅使用
Conv1d
和 1 个过滤器,因此您只需传递数组的值。如果您忽略此层或使用例如 tf.keras.layers.Conv1D(10, kernel_size=1, activation='relu')
,您会发现您没有获得相同的值。
train_dataset
是张量流数据集,如果使用X_train and y_train
,调用fit时没有区别。不过效率更高。