我想使用Tensorflow和Keras创建一个简单的神经网络。 当我尝试通过继承Model类来实例化模型时
class TwoLayerFC(tf.keras.Model):
def __init__(self, hidden_size, num_classes):
super(TwoLayerFC, self).__init__()
self.fc1 = keras.layers.Dense(hidden_size,activation=tf.nn.relu)
self.fc2 = keras.layers.Dense(num_classes)
def call(self, x, training=None):
x = tf.layers.flatten(x)
x = self.fc1(x)
x = self.fc2(x)
return x
这就是我测试网络的方式
def test_TwoLayerFC():
tf.reset_default_graph()
input_size, hidden_size, num_classes = 50, 42, 10
model = TwoLayerFC(hidden_size, num_classes)
with tf.device(device):
x = tf.zeros((64, input_size))
scores = model(x)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
scores_np = sess.run(scores)
print(scores_np.shape)
我得到一个错误:
TypeError: init ()至少接受3个参数(给定2个参数)
我遵循了this教程,似乎应该有两个参数。
答案 0 :(得分:1)
我阅读了您的代码,看到正在创建一个PyTorch模型,其中包括第二个Dense
层中的错误以及两个传递的数字。
Keras模型不应遵循与PyTorch模型相同的逻辑。
此模型应按以下方式创建:
input_tensor = Input(input_shape)
output_tensor = Flatten()(input_tensor)
output_tensor = Dense(hidden_size, activation='relu')(output_tensor)
output_tensor = Dense(num_classes)
model = keras.models.Model(input_tensor, output_tensor)
此model
实例已准备好进行编译和训练:
model.compile(optimizer=..., loss = ..., metrics=[...])
model.fit(x_train, y_train, epochs=..., batch_size=..., ...)
在Keras中没有理由将Model
子类化,除非您是真正的高级用户,并且尝试一些非常常规的事情。
顺便说一句,请注意不要将tf.keras.anything
与keras.anything
混合使用。第一个是通过张量流直接获得的Keras版本,第二个是原始的Keras。它们并不完全相同,tensorflow的版本似乎更易出错,将两者混合在同一代码中听起来是个坏主意。