Python 用于添加两个致密层的keras
有两个输入x和u,它们生成输出y。x、u和y之间存在线性关系,即y=xwx+uwx。我试图根据数据计算wx和wu。以下是模型构造/装配的代码Python 用于添加两个致密层的keras,python,tensorflow,keras,Python,Tensorflow,Keras,有两个输入x和u,它们生成输出y。x、u和y之间存在线性关系,即y=xwx+uwx。我试图根据数据计算wx和wu。以下是模型构造/装配的代码 n_train = 400 n_val = 100 train_u = u[:(n_train+n_val)] train_x = x[:(n_train+n_val)] train_y = y[:(n_train+n_val)] test_u = u[(n_train+n_val):] test_x
n_train = 400
n_val = 100
train_u = u[:(n_train+n_val)]
train_x = x[:(n_train+n_val)]
train_y = y[:(n_train+n_val)]
test_u = u[(n_train+n_val):]
test_x = x[(n_train+n_val):]
test_y = y[(n_train+n_val):]
val_u = train_u[-n_val:]
val_x = train_x[-n_val:]
val_y = train_y[-n_val:]
train_u = train_u[:-n_val]
train_x = train_x[:-n_val]
train_y = train_y[:-n_val]
# RNN derived classes want a shape of (batch_size, timesteps, input_dim)
# batch_size. One sequence is one sample. A batch is comprised of one or more samples.
# timesteps. One time step is one point of observation in the sample.
# input_dim. number of observation at a time step.
# I believe n_train = one_epoch = batch_size * time_steps, features = nx_lags or nu_lags
# I also thing an epoch is one pass through the training data
n_batches_per_epoch = 8
n_iterations_per_batch = round(n_train / n_batches_per_epoch)
batch_size = n_batches_per_epoch
time_steps = n_iterations_per_batch
features_x = train_x.shape[1]
features_u = train_u.shape[1]
features_y = train_y.shape[1]
keras_train_u = train_u.values.reshape((batch_size, time_steps, features_u))
keras_train_x = train_x.values.reshape((batch_size, time_steps, features_x))
keras_train_y = train_y.reshape((batch_size, time_steps, features_y))
keras_val_u = val_u.values.reshape((2, time_steps, features_u))
keras_val_x = val_x.values.reshape((2, time_steps, features_x))
keras_val_y = val_y.reshape((2, time_steps, features_y))
keras_test_u = test_u.values.reshape((1, test_u.shape[0], features_u))
keras_test_x = test_x.values.reshape((1, test_u.shape[0], features_x))
keras_test_y = test_y.reshape((1, test_u.shape[0], features_y))
print('u.values.shape: ', u.values.shape)
# Now try a tensorflow model
# x_input = keras.Input(shape=(batch_size, time_steps, features_x), name='x_input')
# u_input = keras.Input(shape=(batch_size, time_steps, features_u), name='u_input')
x_input = keras.Input(shape=(time_steps, features_x), name='x_input')
u_input = keras.Input(shape=(time_steps, features_u), name='u_input')
da = layers.Dense(ny, name='dense_a', use_bias=False)(x_input)
db = layers.Dense(ny, name='dense_b', use_bias=False)(u_input)
output = layers.Add()([da, db])
model = keras.Model(inputs=[x_input, u_input], outputs=output)
model.compile(optimizer=keras.optimizers.RMSprop(), # Optimizer
# Loss function to minimize
loss=keras.losses.SparseCategoricalCrossentropy(),
# List of metrics to monitor
metrics=[keras.metrics.SparseCategoricalAccuracy()])
print(model.summary())
print('keras_train_x.shape: ', keras_train_x.shape)
print('keras_train_u.shape: ', keras_train_u.shape)
print('keras_train_y.shape: ', keras_train_y.shape)
print('keras_val_x.shape: ', keras_val_x.shape)
print('keras_val_u.shape: ', keras_val_u.shape)
print('keras_val_y.shape: ', keras_val_y.shape)
history = model.fit([keras_train_x, keras_train_u], keras_train_y,
batch_size=64,
epochs=3,
# We pass some validation for
# monitoring validation loss and metrics
# at the end of each epoch
validation_data=([keras_val_x, keras_val_u], keras_val_y))
这是输出,有错误
Model: "model"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
x_input (InputLayer) [(None, 50, 7)] 0
__________________________________________________________________________________________________
u_input (InputLayer) [(None, 50, 7)] 0
__________________________________________________________________________________________________
dense_a (Dense) (None, 50, 2) 14 x_input[0][0]
__________________________________________________________________________________________________
dense_b (Dense) (None, 50, 2) 14 u_input[0][0]
__________________________________________________________________________________________________
add (Add) (None, 50, 2) 0 dense_a[0][0]
dense_b[0][0]
==================================================================================================
Total params: 28
Trainable params: 28
Non-trainable params: 0
__________________________________________________________________________________________________
None
keras_train_x.shape: (8, 50, 7)
keras_train_u.shape: (8, 50, 7)
keras_train_y.shape: (8, 50, 2)
keras_val_x.shape: (2, 50, 7)
keras_val_u.shape: (2, 50, 7)
keras_val_y.shape: (2, 50, 2)
Train on 8 samples, validate on 2 samples
Epoch 1/3
Traceback (most recent call last):
File "arx_rnn.py", line 487, in <module>
main()
File "/arx_rnn.py", line 481, in main
rnn_prediction = x.rnn_n_steps(y_measured, u_control, n_to_predict)
File "arx_rnn.py", line 387, in rnn_n_steps
validation_data=([keras_val_x, keras_val_u], keras_val_y))
File "venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 780, in fit
steps_name='steps_per_epoch')
File "venv\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 363, in model_iteration
batch_outs = f(ins_batch)
File "venv\lib\site-packages\tensorflow\python\keras\backend.py", line 3292, in __call__
run_metadata=self.run_metadata)
File "venv\lib\site-packages\tensorflow\python\client\session.py", line 1458, in __call__
run_metadata_ptr)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Can not squeeze dim[2], expected a dimension of 1, got 2
[[{{node metrics/sparse_categorical_accuracy/Squeeze}}]]
Process finished with exit code 1
模型:“模型”
__________________________________________________________________________________________________
层(类型)输出形状参数#连接到
==================================================================================================
x_输入(输入层)[(无,50,7)]0
__________________________________________________________________________________________________
u_输入(输入层)[(无,50,7)]0
__________________________________________________________________________________________________
密集型(密集型)(无,50,2)14 x_输入[0][0]
__________________________________________________________________________________________________
密集型(密集型)(无,50,2)14 u_输入[0][0]
__________________________________________________________________________________________________
加(加)(无,50,2)0
密集_b[0][0]
==================================================================================================
总数:28
可培训参数:28
不可训练参数:0
__________________________________________________________________________________________________
没有一个
凯拉斯火车形状:(8,50,7)
凯拉斯火车形状:(8,50,7)
凯拉斯列车y形:(8,50,2)
keras_val_x.形状:(2,50,7)
凯拉斯瓦卢形状:(2,50,7)
keras_val_y.形状:(2,50,2)
培训8个样本,验证2个样本
纪元1/3
回溯(最近一次呼叫最后一次):
文件“arx_rnn.py”,第487行,在
main()
文件“/arx_rnn.py”,第481行,主目录
rnn_预测=x.rnn_n_步数(y_测量,u_控制,n_到u预测)
文件“arx_rnn.py”,第387行,按rnn_步骤
验证数据=([keras_val_x,keras_val_],keras_val_y))
文件“venv\lib\site packages\tensorflow\python\keras\engine\training.py”,第780行,以fit格式
步骤(名称=“每个时代的步骤”)
文件“venv\lib\site packages\tensorflow\python\keras\engine\training\u arrays.py”,第363行,在model\u迭代中
批量输出=f(批量输入)
文件“venv\lib\site packages\tensorflow\python\keras\backend.py”,第3292行,在调用中__
run\u元数据=self.run\u元数据)
文件“venv\lib\site packages\tensorflow\python\client\session.py”,第1458行,在调用中__
运行_元数据_ptr)
tensorflow.python.framework.errors\u impl.InvalidArgumentError:无法压缩dim[2],预期维度为1,实际维度为2
[{{node metrics/sparse\u categorical\u accurity/squence}}]
进程已完成,退出代码为1
错误消息告诉了我什么,以及如何更正?Keras分类精度指标期望输出和标签的形状为
(批次大小、数量类)
。错误消息中的尺寸[2]
指示输出形状为3d:(无,50,2)
简单的解决方法是,通过任何方式,确保输出层对每个批次的每个类给出一个预测,即具有shape(batch\u size,num\u classes)
,这可以通过重塑
,或展平
更好的解决方法是根据设计需要改变输入输出拓扑——即,您到底在分类什么?您的数据维度建议您尝试对单个时间步进行分类—在这种情况下,一次只提供一个时间步的数据:(批大小、特性)
。或者,在批次轴中进给时间步,一次一批,因此1000个时间步将对应于(1000,功能)
——但如果模型有任何有状态的
层,将每个批次轴条目视为一个独立的序列,则不要这样做
要使用
timesteps>1对序列进行分类,再次确保层数据流最终产生2d输出。矩阵x、u和y有nt行,或595行。Y有两列,对应于两个输出。x和u都有7列。x包含y的先前值,使实际问题有状态,但是,如本文所述,问题是无状态的,因为y不依赖于x的先前行。wx和wu的权重是已知的,但我尝试使用fit计算这些权重。稍后我将更改形状并报告更新的状态。目标是预测y的下一个值。“目标是预测y的下一个值”-在这种情况下,主要的,如果不是唯一的错误,这里是损失度量;所有分类
或准确性
指标很少涉及非分类loss='mse'
是您所需要的。(有关所有指标,请参阅)