gho*_* 88 17 python arrays keras tensorflow
我正在制作一个 MLP 模型,它需要两个输入并产生一个输出。
I have two input arrays (one for each input) and 1 output array. The neural network has 1 hidden layer with 2 neurons. Each array has 336 elements.
model0 = keras.Sequential([
keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True),
keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True),
])
# Compile the neural network #
model0.compile(
optimizer = keras.optimizers.RMSprop(lr=0.02,rho=0.9,epsilon=None,decay=0),
loss = 'mean_squared_error',
metrics=['accuracy']
)
Run Code Online (Sandbox Code Playgroud)
I tried two ways, both of them are giving errors.
model0.fit(numpy.array([array_1, array_2]),output, batch_size=16, epochs=100)
Run Code Online (Sandbox Code Playgroud)
ValueError: Error when checking input: expected dense_input to have shape (2,) but got array with shape (336,)
The second way:
model0.fit([array_1, array_2],output, batch_size=16, epochs=100)
Run Code Online (Sandbox Code Playgroud)
ValueError: Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 1 array(s), but instead got the following list of 2 arrays:
Similar question. But not using sequential model.
Mit*_*iku 26
要解决此问题,您有两种选择。
1. 使用顺序模型
在馈入网络之前,您可以将两个数组连接为一个。假设两个数组的形状为 (Number_data_points, ),现在可以使用numpy.stack方法合并数组。
merged_array = np.stack([array_1, array_2], axis=1)
Run Code Online (Sandbox Code Playgroud)
model0 = keras.Sequential([
keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True),
keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True),
])
model0.fit(merged_array,output, batch_size=16, epochs=100)
Run Code Online (Sandbox Code Playgroud)
2. 使用函数式 API。
当模型有多个输入时,这是最推荐使用的方法。
input1 = keras.layers.Input(shape=(1, ))
input2 = keras.layers.Input(shape=(1,))
merged = keras.layers.Concatenate(axis=1)([input1, input2])
dense1 = keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True)(merged)
output = keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True)(dense1)
model10 = keras.models.Model(inputs=[input1, input2], output=output)
Run Code Online (Sandbox Code Playgroud)
现在您可以使用您尝试适应模型的第二种方法
model0.fit([array_1, array_2],output, batch_size=16, epochs=100)
Run Code Online (Sandbox Code Playgroud)
与您链接的答案一样,您不能Sequential出于上述原因使用API。您应该使用ModelAPI,也称为功能 API。在架构上,您需要为模型定义如何将输入与 Dense 层相结合,即您希望如何创建中间层,即。合并/添加或减去等/构建嵌入层等),或者您可能想要 2 个神经网络,每个输入 1 个,并且只想在最后一层合并输出。上述每个的代码都会有所不同。
这是一个可行的解决方案,假设您要将输入合并为形状为 672 的向量,然后在该输入上构建神经网络:
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.optimizers import Adam, RMSprop
import numpy as np
input1 = Input(shape=(336,))
input2 = Input(shape=(336,))
input = Concatenate()([input1, input2])
x = Dense(2)(input)
x = Dense(1)(x)
model = Model(inputs=[input1, input2], outputs=x)
model.summary()
Run Code Online (Sandbox Code Playgroud)
你会注意到这个模型合并或连接了两个输入,然后在其上构建了一个神经网络:
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) (None, 336) 0
__________________________________________________________________________________________________
input_2 (InputLayer) (None, 336) 0
__________________________________________________________________________________________________
concatenate (Concatenate) (None, 672) 0 input_1[0][0]
input_2[0][0]
__________________________________________________________________________________________________
dense (Dense) (None, 2) 1346 concatenate[0][0]
__________________________________________________________________________________________________
dense_1 (Dense) (None, 1) 3 dense[0][0]
==================================================================================================
Total params: 1,349
Trainable params: 1,349
Non-trainable params: 0
Run Code Online (Sandbox Code Playgroud)
如果您有其他首选方法来创建中间层,则应Concatenate使用代码中的行替换该行。
然后,您可以编译并拟合模型:
model.compile(
optimizer = RMSprop(lr=0.02,rho=0.9,epsilon=None,decay=0),
loss = 'mean_squared_error'
)
x1, x2 = np.random.randn(100, 336),np.random.randn(100, 336,)
y = np.random.randn(100, 1)
model.fit([x1, x2], y)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32723 次 |
| 最近记录: |